Java 杂谈左手代码,右手年华技术干货

Mybatis从入门到精通①——从JDBC编程开始

2018-12-26  本文已影响4人  52718

[toc]

JDBC是什么 (Java DataBase Connectivity)

jdbc是一种Java编程语言和各种数据库之间数据库无关连接的行业标准,
JDBC API为基于SQL的数据库访问提供了调用级API

数据库无关

在没有JDBC之前,我们需要编写不同的程序对接不同厂商的数据库系统,像下图所示,需要针对不同的数据库api编程,可想而知,当我们需要更换数据库系统而产生的大量重复工作,增加不必要的开发成本

图片来至Java从初学到精通

而JDBC的出现,统一了Java程序访问不同数据库系统的api,应用程序通过调用JDBC来操作数据库时,实际上是右数据库系统厂商提供的JDBC驱动程序来完成的。这样一来,即使要更换数据库系统,也仅仅是更换相应的驱动程序就可以了。(本文使用mysql的驱动程序)

图片来至Java从初学到精通

JDBC API主要完成以下三个工作:

这三个工作中都有其对应的jdbc api来完成各自的任务。应用程序可以使用这些api 来操作数据库系统了

JDBC API

DriverManager

管理JDBC驱动的服务类,主要功能是获取Connection对象(示例程序中的第2步)

getConnection方法

Connection getConnection(url,username,password)

Connection

数据库连接对象,每个Connection对象表示一个连接会话。

Connection的常用方法

1. 返回Statement对象

2. 处理事务的常用方法

Statement

执行具体的SQL语句,以及执行DDL、DCL、DML语句。

Statement子类 PreparedStatement

预编译的Statement对象

SQL语句一次编译多次执行

允许数据库预编译SQL语句(常带有参数或者叫占位符),这样一来,以后每次只需要改变SQL命令的参数,而不需要每次都编译SQL语句,性能得到了提升

PreparedStatement主要方法

Statement常用方法

ResultSet

结果集:查询结果的封装

ResultSet主要方法

移动指针的方法
获取当前行、指定列的值

JDBC实际操作

建库建表的SQL语句

-- 建库
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 建表
CREATE TABLE IF NOT EXISTS `user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `username` VARCHAR(100) NOT NULL,
   `password` VARCHAR(40) NOT NULL,
   `name` VARCHAR(40) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

示例程序框架

我们会在业务逻辑代码start的地方开始具体的执行操作

public void excute() throws SQLException {
        Connection conn = null;
        PreparedStatement smt = null;
        ResultSet resultset = null;
        try {
            //1、加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2、获取Connection对象
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8", "root", "***");
            if (conn != null) {
                System.out.println("连接成功");
            }
            conn.setAutoCommit(false);
            //业务逻辑代码start
            //插入数据操作
            String insertSql = "insert into user(username,password,name) values(?,?,?)";
            smt = conn.prepareStatement(insertSql);
            smt.setString(1, "xiaoming");
            smt.setString(2, "123");
            smt.setString(3, "小明");
            int result = smt.executeUpdate();
            if (result > 0) {
                System.out.println("添加成功");
            }
            smt.clearParameters();

            //修改数据操作
            String updateSql = "update user set name=? where id=?";
            smt = conn.prepareStatement(updateSql);
            smt.setString(1, "小牛");
            smt.setInt(2, 2);
            int updateResult = smt.executeUpdate();
            if (updateResult > 0) {
                System.out.println("修改成功");
            }
            smt.clearParameters();

            //查询数据操作
            String sql = "select *from user where id =?";
            smt= conn.prepareStatement(sql);
            smt.setInt(1,3);
            resultset = smt.executeQuery();
            while (resultset.next()) {
                int uid = resultset.getInt("id");
                System.out.println(String.format("id:%s,username:%s,password:%s,name:%s", uid, 
                        resultset.getString("username"), 
                        resultset.getString("password"), 
                        resultset.getString("name")));
            }
            //业务逻辑代码end
        conn.commit();
        } catch (Exception e) {
            System.out.println(e);
            conn.rollback();
        }
        //4、释放资源 写到finally里面,防止报错不能执行资源回收
        finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (smt != null) {
                try {
                    smt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (resultset != null) {
                try {
                    resultset.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

执行结果

连接成功
添加成功
修改成功
id:3,username:xiaoming,password:123,name:小明

业务逻辑代码中如果有错误,连接对象将执行回滚操作,保证数据的一致性。

上一篇下一篇

猜你喜欢

热点阅读