首先,既然是多数据源,那么我们就先看下数据源怎么配置的:

javaconfig类似下面这样:

MapperScan注解常用配置如下:

basePackages:Base packages to scan for MyBatis interfaces,也就是mapper接口所在包名

annotationClass:This property specifies the annotation that the scanner will search for,

也就是只扫描指定包下的指定注解作为mapper,通常为org.apache.ibatis.annotations.Mapper

markerInterface:This property specifies the parent that the scanner will search for,只扫描指定包下指定父接口的子接口作为mapper

sqlSessionTemplateRef:指定这组mapper关联的sqlSessionTemplate

sqlSessionFactoryRef:指定这组mapper关联的sqlSessionFactory

那么,问题来了,annotationClass,markerInterface都配置了或者都不配置会怎样?在org.mybatis.spring.annotation.MapperScannerRegistrar.registerBeanDefinitions中调用的org.mybatis.spring.mapper.ClassPathMapperScanner.registerFilters()代码如下:

一幕了然,如果都配置了,最终的mapper会是两者匹配的合集;如果都不配置,那么,最终的mapper会是basePackages下所有任意接口。

使用地方在org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent:

还有一个问题,sqlSessionTemplateRef和sqlSessionFactoryRef同时都配置了会怎样?或者不配置呢?

通常,如果只有一个sqlSessionFactory时是不需要配置的,只有容器中有多个时才需要指定一个。

如果都配置了呢?请看下面分析:

org.mybatis.spring.mapper.ClassPathMapperScanner.processBeanDefinitions(Set<BeanDefinitionHolder>)中处理每一个之前扫描mapper生成的BeanDefinition时,会给每一个BeanDefinition设置sqlSessionFactory,如下:

看到log没,很清楚:Cannot use both: sqlSessionTemplate and sqlSessionFactory together. sqlSessionFactory is ignored.

看完mapper的处理,再来看关联的sqlSessionFactory:

根据指定数据源类型利用org.springframework.boot.jdbc.DataSourceBuilder创建dataSource,目前主流的是使用阿里开源的Druid数据库连接池作为数据源:

sqlSessionFactory创建:

通过SqlSessionFactoryBean关联dataSource和MapperXML,再通过@MapperScan关联sqlSessionFactory和mapper接口

至此,单个数据源创建算是完成了。如题,多数据源怎么办?

方法一,手动配置多个dataSource,并在@MapperScan关联不同的sqlSessionFactory和mapper接口。

方法二,动态数据源,继承org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,重写determineTargetDataSource方法,从targetDataSources中获取对应数据源操作数据库,通常在前面业务代码根据具体怎样的情况选择怎样的dataSource,然后通过设置ThreadLocal变量,这里获取变量信息来返回对应数据源。切入业务逻辑可以通过aop切面从dao层方法名入手,也可以通过mybatis的拦截器获取sql信息和入参决定选择哪个数据源。

PS:如果是读写分离,通常情况下主库读写权限,从库只读权限,事务DataSourceTransactionManager配置在主库的dataSource上,@Transactional会自动从配置事务的dataSource中获取连接。

最新文章

  1. [连载]《C#通讯(串口和网络)框架的设计与实现》- 12.二次开发及应用
  2. YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计
  3. mapminmax的用法详解 _MATLAB
  4. 【2011图灵奖得主】我眼中的Judea Pearl
  5. 或许您还不知道的八款Android开源游戏引擎
  6. 正确的SVN导入代码命令
  7. jquery easyui datebox单击文本框显示日期选择
  8. baidu
  9. web系统架构的演进变化很形象
  10. 组件状态(TComponentState)11种和组件状态(TComponentStyle)4种
  11. 第1阶段——uboot分析之硬件初始化start.S(4)
  12. JAVA中正则表达式常用的四个方法
  13. [css 揭秘]:CSS揭秘 技巧(二):多重边框
  14. Asp.net 在刷新或提交页面后保持滚动条的位置
  15. request之额外路径
  16. thingsboard改造使用mysql数据库
  17. flask内容学习之蓝图以及单元测试
  18. MAC下通过改apache配置文件切换php多版本的方法
  19. SQL将原始数据进行MD5加密转存
  20. iOS - 工程文件冲突 - 解决方式

热门文章

  1. 对象析构谈—— delete this 的使用及注意事项
  2. 利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试
  3. it兼职以及行业门户网
  4. 微信小程序UDP通信
  5. 每天进步一点点------H.264学习 (一)
  6. Nginx做缓存
  7. 【转】Vue.js 2.0 快速上手精华梳理
  8. Spring Boot Json 之 Jackjson Fastjson
  9. Linux下编译并使用miracl密码库
  10. IIS-URL重写参数