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源碼之旅!

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