Mybatis注入ioc后是如何执行事务?以及分页插件是如何执行?

1. 事务

mybatis的自动配置类中

 生成sqlSessionTemplate对象注入到容器中

  使用到jdk的代理。并将代理对象放入 SqlSessionTemplate 中。

 以下SqlSession 的方法 


public interface SqlSession extends Closeable {

  <T> T selectOne(String statement);  
  <T> T selectOne(String statement, Object parameter);

  <E> List<E> selectList(String statement);

  <E> List<E> selectList(String statement, Object parameter); 
  <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
  <K, V> Map<K, V> selectMap(String statement, String mapKey); 
  <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
  <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
  <T> Cursor<T> selectCursor(String statement);
  <T> Cursor<T> selectCursor(String statement, Object parameter);
  <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
  void select(String statement, Object parameter, ResultHandler handler);
  void select(String statement, ResultHandler handler);
  void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
  int insert(String statement);
  int insert(String statement, Object parameter);
  int update(String statement);
  int update(String statement, Object parameter);
  int delete(String statement);  
  int delete(String statement, Object parameter);
  void commit();
  void commit(boolean force);
  void rollback();
  void rollback(boolean force);
  List<BatchResult> flushStatements();
  void close();
  void clearCache();
  Configuration getConfiguration(); 
  <T> T getMapper(Class<T> type);
  Connection getConnection();
}

每调用以上方法, 代理对象都会区执行invoke 方法。

最终调用了 openSessionFromDataSource  获取开启事务事务对象,和executor 执行器,返回DefaultSqlSession 对象。 

2 插件的执行 : 如分页插件的执行

2.1检验是否有插件,如果存在插件,且生成插件的type == Executorl类型。则放回代理代理对象

如: 分页插件, 则会返回代理对象。

2.2 再开事务方法的方法 openSessionFromDataSource 时,回去执行newExecutor

2.2 将目标对象executor (如果开启二级缓存, 则将CachingExecutor, 否则为SimpleExecutor)放入拦截器中 

2.3 最终会带调用wrap 生成jdk 的代理对象

2.4 Plugin 实现了InvocationHandler如果分页插件的方法名, 以及参数匹配上, 这回去调用分页插件的intercept 方法。 如果匹配不上,则会调用拥有方法。

 所以插件的执行便是如此执行。

还有三个类型的拦截器,

StatementHandler
ParameterHandler
ResultSetHandler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值