我們回顧下之前沒有使用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源碼之旅!