mybatis查询语句的背后之封装数据

继上一篇mybatis查询语句的背后,这一篇主要围绕着mybatis查询的后期操作,即跟数据库交互的时候。由于本人也是一边学习源码一边记录,内容难免有错误或不足之处,还望诸位指正,本文只可当参考作用。谨记! 

二、分析

继上一篇博文的查询例子,mybatis在最后的查询最终会走SimpleExecutor类的doQuery方法,

1 @Override 2 public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { 3 Statement stmt = null; 4 try { 5 Configuration configuration = ms.getConfiguration(); 6 // 这里也就是采用了策略模式(个人感觉有点像),实际的statementHandler为routingStatementHandler 7 StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql); 8 stmt = prepareStatement(handler, ms.getStatementLog()); 9 // 虽然是执行的routingStatementHandler.query,但返回结果的还是PreparedStatementHandler处理 10 return handler.query(stmt, resultHandler); 11 } finally { 12 closeStatement(stmt); 13 } 14 } 15 16 private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { 17 Statement stmt; 18 // 使用了代理模式,也可以理解为对connection进行了一层包装,这里的作用就是加了log处理 19 Connection connection = getConnection(statementLog); 20 //进行预编译,即类似jdbc的 sql,如 select * from user where id=? 21 stmt = handler.prepare(connection, transaction.getTimeout()); 22 // 对执行查询的sql进行参数设置 23 handler.parameterize(stmt); 24 return stmt; 25 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzyjdp.html