Mybatis实现分包定义数据库
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。但是需要注意事务的问题。
最新文章
- Centos 7.0 安装Mono 3.4 和 Jexus 5.6
- x01.os.21: print ";Loading...";
- HTML中图片添加
- UGUI代码分析
- bzoj1787 [Ahoi2008]Meet 紧急集合
- ios录音
- atitit.团队建设总结o6o fix
- C# Json时间类型的转换
- Nginx安全配置
- POJ 1195- Mobile phones(二维BIT)
- wget 无法下载jdk的处理办法
- iOS基础 - Quartz 2D绘图的基本步骤
- 51nod_1264:线段相交(计算几何)
- Leetcode题解(五)
- 算法实现之python篇
- Programming In Scala笔记-第六章、函数式对象
- 第一次java作业
- SNF快速开发平台MVC-瀑布式分页组件
- Symfony2学习笔记之事件分配器
- linux启动程序和关闭程序脚本
热门文章
- Nginx HTTP块配置
- 使用Navicat Premium 15发送Excel附件至个人邮箱
- thinkPHP跨数据库访问/数据库切换
- BUUCTF pwn一分题目
- 任务日历关联(Project)
- 小迪安全 Web安全 基础入门 - 第一天 - 操作系统&;名词&;文件下载&;反弹SHELL&;防火墙绕过
- LuoguP7259 [COCI2009-2010#3] SORT 题解
- java 8 启动脚本优化 2
- re正则表达式:import re ;re.search()
- ARTS Week 18