0、问题
- 我们可以通过调用SqlSession接口中的方法实现CRUD操作,那么SqlSession接口中的方法是如何实现的?
- 分析sqlSession接口中的insert()方法的执行过程,我们进行源码跟踪发现了
Mybatis只是对于jdbc的封装。
- ctrl + alt + b 观察源码实现
1、新增
- insert()方法的执行过程分析
- DefaultSqlSession----> return update(statement, parameter);185行
- 进入DefaultSqlSession—> public int update(String statement, Object parameter) {方法定义 159行
- 进入198行— return executor.update(ms, wrapCollection(parameter));
- 找到executor对象的update方法------------查看update()方法-----------------BaseExecutor类的update()方法
- 进入BaseExecutor类的update()第117行return doUpdate(ms, parameter);
- 查看doUpdate()方法------------------查看SimpleExecutor类的doUpdate()方法
- 查看doUpdate()方法------------------stmt = prepareStatement(handler, ms.getStatementLog()); 49行
- 查看RoutingStatementHandler类的update()方法
- 查看PreparedStatementHandler类的update方法
- Mybatis的底层一定对jdbc的封装
2、查询
- findAll()方法的执行过程分析
- DefaultSqlSession----> return this.selectList(statement, (Object)null);113行
- 进入DefaultSqlSession—> public List selectList(String statement, Object parameter, RowBounds rowBounds)
- 方法定义 124行
- 进入124行— this.query();
- 找到executor对象的query方法------------查看query()方法-----------------BaseExecutor类的query()方法
- 进入BaseExecutor类的this.queryFromDatabase()第115行return this.query(ms, parameter, rowBounds, resultHandler, key, boundSql);
- 进入BaseExecutor类的this.doQuery(ms, parameter, rowBounds, resultHandler, boundSql)方法。
- 进入SimpleExecutor类的handler.query(stmt, resultHandler)方法。
- 查看handler.query()的方法
- 查看PreparedStatementHandler类的query()方法
- 备注:
PreparedStatement对象它的执行方法
execute:它能执行CRUD中的任意一种语句,它的返回值是一个boolean类型,表示是否有结果集,有结果集是true,没有结果集是false。
executeUpdate:它只能执行CUD语句,查询语句无法执行,它的返回值是影响数据库记录的行数
executeQuery:它只能执行SELECT语句,无法执行增删改,执行结果封装的结果集ResultSet对象
- 点击进去this.resultSetHandler.handleResultSets(ps)
- 查看DefaultResultSetHandler类的handleResultSets()方法,它是用来封装结果集对象。
- 证明:mybatis底层封装了JDBC