(八)Mybatis持久化框架原理之不同Executor对比和Spring事务关系


本篇文章主要是由一次批量插入数据而引起的思考与探究,在这篇文章中将会分析不同的Executor和SqlSession的实现原理差异,同时也会分析Mybatis和Spring的事务处理差异并比较他们之间的优先级与关系。

1. SqlSession的差异

Mybatis依赖于SqlSession来完成sql的调用,Mybatis和Spring集成时,SqlSession常用的类型有两种:

  1. DefaultSqlSession:如果通过SqlSessionFactory的openSession方法获取SqlSession,其生成的类型就是DefaultSqlSession。使用该类时需要开发者执行完业务逻辑后自行commit、rollback或close;
  2. SqlSessionTemplate:如果使用的是@Mapper或@MapperScan等方式通过Spring自动扫描注册的方式注入Mapper类,Mapper类则会被SqlSessionTemplate代理。在代理切面中调完方法后会自动commit、rollback或close,无需开发者关心介入。但在切面中实际使用的SqlSession类型依然是DefaultSqlSession。

总结: DefaultSqlSession是Mybatis操作Mapper方法的唯一入口,而SqlSessionTemplate则是使用代理方式包装了一层,在代理方法中使用DefaultSqlSession完成了commit、rollback和close。

所以不难理解为什么SqlSessionTemplate的commit、rollback和close三个方法未实现,调用则报错,因为其只提供代理的模板方法,不提供真实逻辑操作。

DefaultSqlSession类有个autoCommit属性,很多人会误以为这个属性是真正控制事务自动提交的,实际上不是,这个属性只会控制Mybatis的事务管理器是否调用commit、rollback方法,和事务的自动提交没有关系。 SqlSession基本每次事务调用都会生成一个新的。

2. Executor的差异

Mapper的增删改调用的都是Executor的doUpdate方法,查则调用的doQuery方法。

Mybati的Executor可供选择的有三种:

  1. SIMPLE:默认的执行器,实现类SimpleExecutor,其实现非常简单,从Datssource中获取Connection,再用Connection获取Statement实现类,最后执行增删改查;
  2. REUSE:实现类ReuseExecutor,在SIMPLE的基础上加入了Statement对象的缓存,如果对应的sql有Statement对象缓存则直接使用,避免了Statement对象的频繁创建销毁;
  3. BATCH:实现类Batch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值