继续上篇文章如何使用mybatis3+spring3并且配置多数据源呢

先上代码在讲解吧 
替换上一篇中spring中datasource的配置

Java代码  
  1. <!-- 数据源配置 -->
  2. <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource"
  3. destroy-method="close">
  4. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  5. <property name="url"
  6. value="jdbc:mysql://localhost:3306/payoffdatabase?useUnicode=true&amp;characterEncoding=UTF-8" />
  7. <property name="username" value="root" />
  8. <property name="password" value="root" />
  9. <property name="defaultAutoCommit" value="true"></property>
  10. </bean>
  11. <bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource"
  12. destroy-method="close">
  13. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  14. <property name="url"
  15. value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
  16. <property name="username" value="root" />
  17. <property name="password" value="root" />
  18. <property name="defaultAutoCommit" value="true"></property>
  19. </bean>
  20. <bean id="dataSource" class="a.b.router.DynamicDataSource">
  21. <property name="targetDataSources">
  22. <map key-type="java.lang.String">
  23. <entry value-ref="ds1" key="ds1"></entry>
  24. <entry value-ref="ds2" key="ds2"></entry>
  25. </map>
  26. </property>
  27. <property name="defaultTargetDataSource" ref="ds1"></property>
  28. </bean>

新的类DynamicDataSource

Java代码  
  1. package a.b.router;
  2. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  3. public class DynamicDataSource extends AbstractRoutingDataSource {
  4. @Override
  5. protected Object determineCurrentLookupKey() {
  6. return DataSourceContextHolder.getDbType();
  7. }
  8. }

新的类DataSourceContextHolder

Java代码  
  1. package a.b.router;
  2. public class DataSourceContextHolder {
  3. private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  4. public static void setDbType(String dbType) {
  5. contextHolder.set(dbType);
  6. }
  7. public static String getDbType() {
  8. return ((String) contextHolder.get());
  9. }
  10. public static void clearDbType() {
  11. contextHolder.remove();
  12. }
  13. }

原来的单元测试新添加一行信息,修改为

Java代码  
  1. @Test
  2. public void addTest() throws Exception {
  3. UserLogin userLogin = new UserLogin();
  4. userLogin.setPassword("102");
  5. userLogin.setUsername("102");
  6. DataSourceContextHolder.setDbType("ds2");
  7. service.add(userLogin);
  8. }

最主要的变化是DynamicDataSource 类,这个类继承了AbstractRoutingDataSource,我们再继续考察,发现这个类实现了datasource这个接口。

再仔细研究,发现我配置了多个数据源给DynamicDataSource,默认的数据源是ds1。 
我们研究下AbstractRoutingDataSource类的代码,主要是两个实现datasource的方法

Java代码  
  1. public Connection getConnection() throws SQLException {
  2. return determineTargetDataSource().getConnection();
  3. }
  4. public Connection getConnection(String username, String password) throws SQLException {
  5. return determineTargetDataSource().getConnection(username, password);
  6. }

根据这段代码发现主要玄机都在determineTargetDataSource()方法上。

Java代码  
  1. protected DataSource determineTargetDataSource() {
  2. Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
  3. Object lookupKey = determineCurrentLookupKey();
  4. DataSource dataSource = this.resolvedDataSources.get(lookupKey);
  5. if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
  6. dataSource = this.resolvedDefaultDataSource;
  7. }
  8. if (dataSource == null) {
  9. throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
  10. }
  11. return dataSource;
  12. }

根据这段代码发现,首先在使用数据源之前,首先判断使用数据源的key,也就是我们配置给

Java代码  
  1. private Map<Object, Object> targetDataSources;

这个map中的key值,找到key值之后再找到对应的datasource然后并使用这个数据源。

从上面我们发现,实际上DynamicDataSource只是在内部封装了数据源,然后调用它,只不过在内部他加了一些控制而已。(此处不知道是否可以理解为代理模式)

再深一步想想,此处使用的orm层是mybatis,如果换成hibernate呢,或者jdbctemplate呢。 
实际上这个方法都适用。

mybatis 学习之多数据源整合相关推荐

  1. Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!

    d之前介绍了Spring Boot 整合mybatis 使用注解方式配置的方式实现增删改查以及一些复杂自定义的sql 语句 .想必大家对spring boot 项目中,如何使用mybatis 有了一定 ...

  2. Spring+SpringMVC+Mybatis 多数据源整合

    原文地址:http://blog.csdn.net/q908555281/article/details/50316137 ----------------------------------- 此篇 ...

  3. MyBatis学习随记

    1       Mybatis入门 1.1     单独使用jdbc编程问题总结 1.1.1  jdbc程序 Public static void main(String[] args) { Conn ...

  4. Mybatis学习一

    1.Mytatis入门程序  代码如下: package myBatis.cn.junit;import java.io.IOException; import java.io.InputStream ...

  5. 狂神说——Mybatis 学习

    [狂神说Java]Mybatis最新完整教程IDEA版通俗易懂 Mybatis 笔记及源码 Mybatis 中文文档 Mybatis 案例源码 狂神说--Mybatis 学习 简介 什么是Mybati ...

  6. (五)MyBatis学习总结(超级详细哦,尤其适合初学者)

    什么是MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyBa ...

  7. MyBatis学习:MyBatis的配置文件

    1.本篇博文的背景和目的 我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习.阐述了MVC架构模式和三层架构,回顾了JDBC连接数据库,建立了使用MyBatis和 ...

  8. 事务中mybatis通过id查不到但是通过其他条件可以查到_40打卡 MyBatis 学习

    第57次(mybatis) 学习主题:mybatis 学习目标: 1 掌握框架的概念 2 掌握mybatis环境搭建 对应视频: http://www.itbaizhan.cn/course/id/8 ...

  9. (五)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建根项目

    上一篇我们介绍<springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划>,从今天开始,我们将对代码的每一个构建做详细的记录,能够帮助大家 ...

最新文章

  1. NSight Compute 用户手册(中)
  2. 雪崩 计算机组成原理,计算机组成原理复习资料(学习课件整理版可自学使用).doc...
  3. 窗口分析函数_13_生成相邻上一个元素
  4. 大剑无锋之post那么多优点,为什么还用get
  5. 东北大学c语言及程序设计,东大20秋学期《C语言及程序设计》在线平时作业1参考...
  6. java main是标识符吗_main方法的认识 、通配符、java的注释、java的符(标识符)【Java基础】...
  7. word文本转换为表格 ,如果文本是以硬回车的转换方式
  8. 天天爱跑步——树上差分
  9. [转]VI/VIM的键盘图
  10. hdu 1213 HowManyTables 并查集
  11. 我用Vue2全家桶重写「daza.io」的前端
  12. android4以上版本读写外置sd卡报错的解决办法
  13. Python vs Cpython
  14. 赢在电子商务网站制作与营销:B2C版
  15. 大规模部署桌面虚拟化时的一些思考
  16. php的敏感词过滤类库,敏感词过滤的php类库
  17. 计算机专业有必要数学竞赛吗,高中数学竞赛必要吗
  18. 如何去掉快捷方式上的小箭头
  19. A - 五军之战 (sdut擂台赛)
  20. python最强脚本工具_python脚本工具最百里自瞄

热门文章

  1. android ListView ListSelector 不起作用(被覆盖)
  2. 前端基础-html-段落标签
  3. Socket选项之SO_RCVTIMEO 和SO_SNDTIMEO
  4. Python爬虫之pyppeteer去除Chrome正受到自动测试软件的控制(反爬策略)
  5. 解决挖矿病毒(定时任务、计划任务、系统定时器、定时启动、crontab、入侵)
  6. 设计模式:模板方法模式(C++)【喝咖啡还是喝茶】
  7. javascript知识点总结----Function定义
  8. TCP协议的一些认识及实践
  9. [Documentation]porting
  10. ASP.NET操作Excel(终极方法NPOI)