我们回顾下之前没有使用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源码之旅!