mybatis 学习之多数据源整合
继续上篇文章如何使用mybatis3+spring3并且配置多数据源呢
先上代码在讲解吧
替换上一篇中spring中datasource的配置
- <!-- 数据源配置 -->
- <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url"
- value="jdbc:mysql://localhost:3306/payoffdatabase?useUnicode=true&characterEncoding=UTF-8" />
- <property name="username" value="root" />
- <property name="password" value="root" />
- <property name="defaultAutoCommit" value="true"></property>
- </bean>
- <bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url"
- value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
- <property name="username" value="root" />
- <property name="password" value="root" />
- <property name="defaultAutoCommit" value="true"></property>
- </bean>
- <bean id="dataSource" class="a.b.router.DynamicDataSource">
- <property name="targetDataSources">
- <map key-type="java.lang.String">
- <entry value-ref="ds1" key="ds1"></entry>
- <entry value-ref="ds2" key="ds2"></entry>
- </map>
- </property>
- <property name="defaultTargetDataSource" ref="ds1"></property>
- </bean>
新的类DynamicDataSource
- package a.b.router;
- import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
- public class DynamicDataSource extends AbstractRoutingDataSource {
- @Override
- protected Object determineCurrentLookupKey() {
- return DataSourceContextHolder.getDbType();
- }
- }
新的类DataSourceContextHolder
- package a.b.router;
- public class DataSourceContextHolder {
- private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
- public static void setDbType(String dbType) {
- contextHolder.set(dbType);
- }
- public static String getDbType() {
- return ((String) contextHolder.get());
- }
- public static void clearDbType() {
- contextHolder.remove();
- }
- }
原来的单元测试新添加一行信息,修改为
- @Test
- public void addTest() throws Exception {
- UserLogin userLogin = new UserLogin();
- userLogin.setPassword("102");
- userLogin.setUsername("102");
- DataSourceContextHolder.setDbType("ds2");
- service.add(userLogin);
- }
最主要的变化是DynamicDataSource 类,这个类继承了AbstractRoutingDataSource,我们再继续考察,发现这个类实现了datasource这个接口。
再仔细研究,发现我配置了多个数据源给DynamicDataSource,默认的数据源是ds1。
我们研究下AbstractRoutingDataSource类的代码,主要是两个实现datasource的方法
- public Connection getConnection() throws SQLException {
- return determineTargetDataSource().getConnection();
- }
- public Connection getConnection(String username, String password) throws SQLException {
- return determineTargetDataSource().getConnection(username, password);
- }
根据这段代码发现主要玄机都在determineTargetDataSource()方法上。
- protected DataSource determineTargetDataSource() {
- Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
- Object lookupKey = determineCurrentLookupKey();
- DataSource dataSource = this.resolvedDataSources.get(lookupKey);
- if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
- dataSource = this.resolvedDefaultDataSource;
- }
- if (dataSource == null) {
- throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
- }
- return dataSource;
- }
根据这段代码发现,首先在使用数据源之前,首先判断使用数据源的key,也就是我们配置给
- private Map<Object, Object> targetDataSources;
这个map中的key值,找到key值之后再找到对应的datasource然后并使用这个数据源。
从上面我们发现,实际上DynamicDataSource只是在内部封装了数据源,然后调用它,只不过在内部他加了一些控制而已。(此处不知道是否可以理解为代理模式)
再深一步想想,此处使用的orm层是mybatis,如果换成hibernate呢,或者jdbctemplate呢。
实际上这个方法都适用。
mybatis 学习之多数据源整合相关推荐
- Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!
d之前介绍了Spring Boot 整合mybatis 使用注解方式配置的方式实现增删改查以及一些复杂自定义的sql 语句 .想必大家对spring boot 项目中,如何使用mybatis 有了一定 ...
- Spring+SpringMVC+Mybatis 多数据源整合
原文地址:http://blog.csdn.net/q908555281/article/details/50316137 ----------------------------------- 此篇 ...
- MyBatis学习随记
1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 Public static void main(String[] args) { Conn ...
- Mybatis学习一
1.Mytatis入门程序 代码如下: package myBatis.cn.junit;import java.io.IOException; import java.io.InputStream ...
- 狂神说——Mybatis 学习
[狂神说Java]Mybatis最新完整教程IDEA版通俗易懂 Mybatis 笔记及源码 Mybatis 中文文档 Mybatis 案例源码 狂神说--Mybatis 学习 简介 什么是Mybati ...
- (五)MyBatis学习总结(超级详细哦,尤其适合初学者)
什么是MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyBa ...
- MyBatis学习:MyBatis的配置文件
1.本篇博文的背景和目的 我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习.阐述了MVC架构模式和三层架构,回顾了JDBC连接数据库,建立了使用MyBatis和 ...
- 事务中mybatis通过id查不到但是通过其他条件可以查到_40打卡 MyBatis 学习
第57次(mybatis) 学习主题:mybatis 学习目标: 1 掌握框架的概念 2 掌握mybatis环境搭建 对应视频: http://www.itbaizhan.cn/course/id/8 ...
- (五)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建根项目
上一篇我们介绍<springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划>,从今天开始,我们将对代码的每一个构建做详细的记录,能够帮助大家 ...
最新文章
- NSight Compute 用户手册(中)
- 雪崩 计算机组成原理,计算机组成原理复习资料(学习课件整理版可自学使用).doc...
- 窗口分析函数_13_生成相邻上一个元素
- 大剑无锋之post那么多优点,为什么还用get
- 东北大学c语言及程序设计,东大20秋学期《C语言及程序设计》在线平时作业1参考...
- java main是标识符吗_main方法的认识 、通配符、java的注释、java的符(标识符)【Java基础】...
- word文本转换为表格 ,如果文本是以硬回车的转换方式
- 天天爱跑步——树上差分
- [转]VI/VIM的键盘图
- hdu 1213 HowManyTables 并查集
- 我用Vue2全家桶重写「daza.io」的前端
- android4以上版本读写外置sd卡报错的解决办法
- Python vs Cpython
- 赢在电子商务网站制作与营销:B2C版
- 大规模部署桌面虚拟化时的一些思考
- php的敏感词过滤类库,敏感词过滤的php类库
- 计算机专业有必要数学竞赛吗,高中数学竞赛必要吗
- 如何去掉快捷方式上的小箭头
- A - 五军之战 (sdut擂台赛)
- python最强脚本工具_python脚本工具最百里自瞄
热门文章
- android ListView ListSelector 不起作用(被覆盖)
- 前端基础-html-段落标签
- Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO
- Python爬虫之pyppeteer去除Chrome正受到自动测试软件的控制(反爬策略)
- 解决挖矿病毒(定时任务、计划任务、系统定时器、定时启动、crontab、入侵)
- 设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
- javascript知识点总结----Function定义
- TCP协议的一些认识及实践
- [Documentation]porting
- ASP.NET操作Excel(终极方法NPOI)