Mybatis源码之温故jdbc

我们回顾下之前没有使用Mybatis,使用原生态jdbc的场景

public Integer insert(User user) {
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        String insertSql = "INSERT INTO USER (name,age,sex,birth_day) VALUES(?,?,?,?) ";
        try {
            conn = JdbcUtil.getConn();//① 从ThreadLocal.get();
            conn.setAutoCommit(false);//②
            preparedStatement = conn.prepareStatement(insertSql);//③
            //CallableStatement callableStatement = conn.prepareCall(insertSql);
            //Statement statement = conn.createStatement();
            preparedStatement.setObject(1,user.getName());//④
            preparedStatement.setObject(2,user.getAge());
            preparedStatement.setObject(3,user.getSex());
            preparedStatement.setObject(4,user.getBirthDay());

            conn.commit();//⑥
            conn.setAutoCommit(true);//⑦

        } catch (SQLException e) {
            e.printStackTrace();
            if(conn!=null){
                conn.rollback();//⑧
                conn.setAutoCommit(true);
                JdbcUtil.closeAll(conn,preparedStatement,null);//⑨
            }
        }
    private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<>();
    public static Connection getConn() throws SQLException {
        if(connThreadLocal.get() == null){
            Connection connection = DriverManager.getConnection(url, userName, passwd);
            connThreadLocal.set(connection);
        }
        return connThreadLocal.get();
    }

同样的代码如果让mybatis的来实现,那可边的复杂多了,但是使用起来方便多了。

第一步获取连接:

    a)连接的获取,可能是数据库连接池dataSource中获取
    b)同一个事务多个dao操作(代码中一个Service可能就是多个dao操作,在serice中回滚和提交),我们获取从数据库连接池中获取一个conn,设置到ThreadLocal然后每个dao从threadlocal中获取同一个连接,这样事务(多笔dao操作)就能一起提交,回滚了。

第二步创建Statement:

Statement的创建主要是三种:
    Statement st = conn.createStatement();
    preparedStatement = conn.prepareStatement(insertSql);//Mybatis默认方式
    CallableStatement callableStatement = conn.prepareCall(insertSql);

第三步设置参数:

  Service中传递过来的参数是如何,将数据设置到Mapper文件替换变量的
  Mybatis的动态Sql是如何做的

第四步提交事务:

 mybatis是如何提交的

第五步异常回滚:

mybatis异常事务回滚

及时没有看源码也知道mybatis也会做这些事情,我们就跟着这些线索踏上mybatis源码之旅!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章