Mybatis与Spring集成时做了哪些事情

本文探讨MyBatis与Spring集成后,Spring如何管理SqlSession,包括SqlSessionTemplate的作用、一级缓存的行为以及事务管理。集成后,Spring扫描并注册Mapper,每个Mapper接口使用SqlSessionTemplate,每次调用mapper方法都会创建新的SqlSession。在事务管理下,同一事务内的一级缓存仍然有效;无事务时,每次调用都会创建新SqlSession,导致一级缓存失效。
摘要由CSDN通过智能技术生成

 这篇博客主要是来分析MyBatis与Spring集成后Spring帮我们做了哪些事情,以及集成后使用MyBatis有什么变化。

首先来看看集成包下有什么东西吧。

第一个模块annotation:这里做了一个注解(MapperScan),用于扫描mapper。以及mapper扫描注册器(MapperScannerRegistrar),此扫描注册器实现了ImportBeanDefinitionRegistrar接口,在Spring容器启动时会运行所有实现了这个接口的实现类,而这个注册器内部会注册一系列MyBatis的信息。

第二个模块batch:这里没有深入研究这个包,估计是为了批量操作使用的?

第三个模块config:主要是为了解析处理读取到的配置信息。

第四个模块mapper:这里就是主要处理mapper的地方了,与编程式的MyBatis不同,与Spring集成后,每个mapper本来的生命周期为method级别,在集成后变成了application级别,主要原因是Spring将扫描到的每一个mapper都存入IOC容器,并且是单例的。

我们进入ClassPathMapperScanner的doScan方法DEBUG来看一下。

这里可以看到,所有的mapper都会被放入IOC容器,并且scope=singleton,生命周期提升至容器级别,所以我们在用的时候只需要使用注解@Autowired即可使用Mapper。

第五个模块support:只有一个模板辅助类,是MapperFactoryBean的父类,用于方便创建一个SqlSession(集成后的SqlSession变成了SqlSessionTemplate,下面会介绍)

第六个模块transaction:在集成后,事务的管理交给了Spring来做。

最后一个就是SqlSession的变化了,先来DEBUG看看集成后的mapper是个什么东西吧。

这里我随意启动了一个Service层,debug了一个mapper的属性,可以看到,它还是一个熟悉的MapperProxy代理的,但不同点在于MapperProxy中的sqlSession,这里再也不是DefaultsqlSession了,而是一个SqlSessionTemplate,那这个到底是什么呢?

  public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,
      PersistenceExceptionTranslator exceptionTranslator) {

    notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");
    notNull(exec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值