要知道这个问题,先得知道mybatis使用的数据源策略,共有三种
- UNPOOLED 不使用数据源,每次创建会话都是新连接
- POOLED 使用自己实现的连接池
- JNDI 使用命名服务查找到的数据源,这和SPI机制是交集
这里小伙伴们就会发现一个问题了,就是数据源策略是Configuration对象中装配的,Configuration对象是被SqlSessionFactory对象长久持有的,我们每次创建会话都是靠SqlSessionFactory对象,如果出现多数据源或者数据源切换的场景要怎么办呢?
这个问题先放这里我们继续看配置文件中有一行
<dataSource type="POOLED">
这个POOLED是可以换成druid或者其他数据源的,这里写的就是mybatis默认的数据源
再看看springboot整合druid的时候是配置文件中有一个type属性,springboot已经帮我们注入好了
然后源码获取的地方在这里,解析xml配置的时候一起就配置好啦
有了数据源,我们可以先看看mybatis自带的事务 org.apache.ibatis.transaction.Transaction
这个事务就是由SqlSessionFactory#openSession方法创建出来的
事务对象里面拿到了DataSource
这里则拿到了java提供的Connectionmybatis自己给这个接口实现了两个类:JdbcTransaction和ManagedTransaction
具体使用了哪个,我们在配置文件中做了配置