SqlSession执行

SqlSession执行_第1张图片


2.根据Statement ID在mybatis 配置对象Configuration中查找和配置文件相对应的MappedStatement
4.将ms,parameter,rowbound,resultHandler,传入Executor的 query方法
注意①:在query方法中,ms会根据paramerter来获取对应statement ID里面的SQL语句,并将该SQL赋值给BoundSql对象
5.根据cachingExecutor, ms, parameter, rowBounds, resultHandler, boundSql参数来创建
9.mappedStatement , parameter, rowBounds, resultHandler, boundSql将这些参数传递给SimpleExecutor
10.根据传入的mappedStatement 从中获取Connection对象
12.利用获取到的configuration,调用newStatementHandler()   传入executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql来创建RoutingStatementHandler
RoutingStatementHandler会根据mappedStatement.getStatementType()来创建StatementHandler(有点像代理模式)
15.调用Collection中保存的拦截器的责任链依次循环,查看是否有用户定义了拦截器,如果有用户自定义的拦截器,生成对应实例的Proxy
注意,①这里会根据自定义拦截器:拦截类,拦截方法,来创建一个ProxyStatementHandler
注意:②Configuration对象中定义了能拦截的对象
18.传入Proxy*StatementHandler,Log,这两个实例到prepareStatementf方法中
19.根据解析XMLSqlConfig时创建的Transaction,来获取连接实例
21.调用动态代理的prepare(connection)方法,该方法主要作用是: 预编译SQL
中间过程比较复杂,由于采用动态代理调用顺序:自定义的拦截器-->BaseStatementHandler.prepare--> PrepareStetementHandler(创建SQL语句)
22,通过上一步传入的Connection,调用JDBC方法来创建Statement
25.调用动态代理的parameterize(Statement),设置SQL参数
26.返回被处理过的(自定义的拦截器)Java.Sql.Statement对象
27.调用SimpleExecutor的query(Statement, resultHandler)方法,
注意:这个的Statement已经是被插件所处理过的Statement
28.RoutingStatementHandler来路由选择对应实例的query方法
29.返回处理结果
10.将Java.Sql.Statement转换成PreparedStatement,然后执行ps.execute(); 接着调用ResultSetHandler处理结果映射



通过此执行顺序明白了拦截器的运行的时机。

拦截器测试sql执行时间,可拦截的点:①prepare ②query

你可能感兴趣的:(Mybatis)