Mybatis实现分包定义数据库

背景

业务需求中需要连接两个数据库处理数据,需要用动态数据源。通过了解mybatis的框架,计划 使用分包的方式进行数据源的区分。

原理

前提:

我们使用mybatis都会有四个步骤

1:构建SqlSessionFactory

2:通过SqlSessionFactory 获取到sqlSession 对象

3:通过sqlSession对象获取Mapper的动态代理对象

4:通过执行动态代理对象获取返回值

其实点开sqlSessionFactory就的Configuration对象中的Environment对象绑定了我们的dataSource对象

同样,我们通过debug发现,动态代理后的mapper对象是同样持有Configuration对象,绑定我们的连接信息。

猜想

需要分包实现不同数据源的话,需要对不同的mapper指定不同的sqlSessionFactroy,查看mapperScan的注解源码,

通过理解注释,我们是可以指定maper动态代理对象的sqlSessionFactory对象的。然后结果basePackages就可以对不同的包使用不同的sqlSessionFactory从而实现不同包使用不同的数据源。

实现

1:定义两个数据源

两个数据源分别命名位ds01,ds02,这里采用都是德鲁伊的数据库连接池。为了简介,详细配置没有展示了。

2:定义两个SqlSessionFactory

定义两个sqlSessionFactory,分别绑定两个数据源。

3:不同包实现绑定不同的sqlSessionFactory

通过@MapperScan指定扫描的包,通知指定SqlSessionFactory

@MapperScan(basePackages = "com.lenven.demo.dao.ds02",sqlSessionFactoryRef = "salveSqlSessionFactory")
@MapperScan(basePackages = "com.lenven.demo.dao.ds01",sqlSessionFactoryRef = "masterSqlSessionFactory")

4:测试

对两个不同的包的mapper测试,都可以正确查询出数据

拓展:

通过实现

AbstractRoutingDataSource也可以实现动态数据源。

该类实现DataSource的接口,可以配置对各数据源在

 @Nullable
private Map<Object, DataSource> resolvedDataSources;

这个属性里面。

让后通过暴露一个determineCurrentLookupKey 获取需要使用的数据源的key。但是需要注意事务的问题。

最新文章

  1. Centos 7.0 安装Mono 3.4 和 Jexus 5.6
  2. x01.os.21: print &quot;Loading...&quot;
  3. HTML中图片添加
  4. UGUI代码分析
  5. bzoj1787 [Ahoi2008]Meet 紧急集合
  6. ios录音
  7. atitit.团队建设总结o6o fix
  8. C# Json时间类型的转换
  9. Nginx安全配置
  10. POJ 1195- Mobile phones(二维BIT)
  11. wget 无法下载jdk的处理办法
  12. iOS基础 - Quartz 2D绘图的基本步骤
  13. 51nod_1264:线段相交(计算几何)
  14. Leetcode题解(五)
  15. 算法实现之python篇
  16. Programming In Scala笔记-第六章、函数式对象
  17. 第一次java作业
  18. SNF快速开发平台MVC-瀑布式分页组件
  19. Symfony2学习笔记之事件分配器
  20. linux启动程序和关闭程序脚本

热门文章

  1. Nginx HTTP块配置
  2. 使用Navicat Premium 15发送Excel附件至个人邮箱
  3. thinkPHP跨数据库访问/数据库切换
  4. BUUCTF pwn一分题目
  5. 任务日历关联(Project)
  6. 小迪安全 Web安全 基础入门 - 第一天 - 操作系统&amp;名词&amp;文件下载&amp;反弹SHELL&amp;防火墙绕过
  7. LuoguP7259 [COCI2009-2010#3] SORT 题解
  8. java 8 启动脚本优化 2
  9. re正则表达式:import re ;re.search()
  10. ARTS Week 18