美文网首页
Mybatis从入门到精通①——从JDBC编程开始

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

作者: 十年开发程序员 | 来源:发表于2019-01-08 16:49 被阅读46次

    JDBC是什么 (Java DataBase Connectivity)

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

    数据库无关

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

    image.png

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

    image.png

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

    • 建立与数据库的连接或访问任何表格数据源
    • 发送SQL语句到数据库
    • 处理数据返回的结果

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

    JDBC API

    DriverManager

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

    getConnection方法

    Connection getConnection(url,username,password)

    • url写法:jdbc:mysql://localhost:3306/mydb 本地数据库简写:jdbc:mysql:///mydb
    • jdbc:协议
    • mysql:子协议
    • localhost:主机名
    • 3306:端口号
    • mydb:数据库名称

    Connection

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

    Connection的常用方法

    1. 返回Statement对象

    • Statement createStatement()
    • PreparedStatement PreparedStatement(String sql):Statement的子类,将SQL语句提交到数据库进行预编译
    • CallableStatement prepareCall(String sql)Statement的子类,处理存储过程

    2. 处理事务的常用方法

    • void setAutoCommit(boolean autoCommit):设置是否自动提交,默认true
    • void commit:提交事务
    • void rollback:事务回滚
    • Savepoint setSavepoint:创建一个保存点
    • Savepoint setSavepoint(Stirng name):指定名称来创建一个保存点
    • void rollback(Savepoint savepoint):将事务回滚到指定的保存点
    • void setTransactionIsolation(int level):设置事务隔离级别

    Statement

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

    Statement子类 PreparedStatement

    预编译的Statement对象

    SQL语句一次编译多次执行

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

    PreparedStatement主要方法
    • void setXXX(int parmIndex,XXX value):设置预编译语句的参数

    Statement常用方法

    • ResultSet executeQuery(String sql):只能执行查询语句,返回ResultSet
    • int executeUpdate(String sql):主要用于执行DML语句的,返回受影响行数。
    • boolean execute(String sql):执行任何SQL语句
    • addBatch(String sql):添加到批处理
    • executeBatch():执行批处理
    • clearBatch():清空批处理

    ResultSet

    结果集:查询结果的封装

    ResultSet主要方法

    移动指针的方法
    • next():移动指针到ResultSet记录的下一行,如果存在该条记录返回true
    • .......
    获取当前行、指定列的值
    • getInt()、getString()针对不同数据类型的方法,
    • 通用的两个泛型方法<T> T getObject(int columnIndex,Class<T> type)、<T> T getObject(String columnLabel,Class<T> type)

    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:小明
    复制代码
    

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


    b.jpg
    ab.jpg

    相关文章

      网友评论

          本文标题:Mybatis从入门到精通①——从JDBC编程开始

          本文链接:https://www.haomeiwen.com/subject/sorbrqtx.html