`
fenshen6046
  • 浏览: 52076 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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&amp;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&amp;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呢。
实际上这个方法都适用。
分享到:
评论
1 楼 zhumingpeng 2014-10-15  
Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.alibaba.druid.pool.DruidDataSource] is defined: expected single matching bean but found 2: dataSource,dataSource2
多数据的时候 报错 ,,都没启动起来,,,       

相关推荐

    Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 详细教程 本教程主要介绍了 Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 的详细教程。下面将详细介绍如何实现 Spring 整合 ...

    mybatis-plus多数据源/动态数据源配置示例代码

    MyBatis-Plus(简称MP)是MyBatis的扩展,它提供了丰富的功能,包括多数据源的支持,使得开发者可以更方便地管理多个数据库。本示例代码将介绍如何在项目中配置和使用MyBatis-Plus实现多数据源和动态数据源切换。 ...

    SpringBoot+Mybatis+Druid+PageHelper实现多数据源并分页方法

    在本文中,我们将深入探讨如何使用SpringBoot、Mybatis、Druid和PageHelper来实现多数据源和分页功能。首先,SpringBoot是基于Spring框架的简化版本,它旨在简化微服务开发,提供了自动配置、内嵌式Web服务器以及...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

    在SpringBoot项目中,整合Mybatis-Plus并实现多数据源的动态切换,同时支持分页查询是一项常见的需求。以下将详细阐述这个过程中的关键步骤和技术要点。 首先,我们需要引入必要的Maven依赖。这里提到了四个关键...

    spring整合mybatis多数据源

    当我们需要处理多个数据源时,例如在分布式系统或读写分离的场景下,Spring整合MyBatis的多数据源切换就显得尤为重要。这个"spring整合mybatis多数据源"的示例提供了可运行的代码,帮助开发者理解和实践这一功能。 ...

    Springboot整合Druid与Mybatis的多数据源切换

    本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,并提供一个亲测可用的解决方案。 首先,让我们了解Spring Boot、Druid和Mybatis这三大组件的基础知识: **Spring ...

    Springboot+mybatis+druid多数据源配置(oracle+mybatis)

    总结,Spring Boot结合Mybatis和Druid实现多数据源配置的过程包括:配置数据源、配置Mybatis、创建数据源切换器、以及针对不同数据库的测试。这一过程涉及了Spring Boot的自动配置、依赖注入、配置属性绑定等多个...

    springboot mybatis 集成多数据源 两种实现方式

    在Spring Boot应用中集成MyBatis并实现多数据源,是一种常见的需求,特别是在大型系统中,可能需要连接多个数据库以实现数据隔离或者读写分离。本文将详细介绍两种不同的实现方式,分别为静态添加和动态添加数据源。...

    springboot-mybatis整合多数据源方式之一配置法

    本文将深入探讨一种基于配置的多数据源整合方法,也被称为分包方式。 首先,我们要理解Spring Boot的核心在于简化配置。在Spring Boot中,我们可以利用`@Configuration`注解来创建配置类,通过这些类来定义数据源...

    springboot整合mybatis多数据源

    总的来说,Spring Boot与MyBatis的多数据源整合需要对Spring的配置机制有深入的理解,同时也需要合理规划数据源的使用,确保业务逻辑的正确性和可维护性。通过以上步骤,我们可以创建并管理多个数据源,灵活地处理...

    springboot + mybatis(通用mapper) + HikariCP(比durid更快)多数据源

    `SpringBoot`、`MyBatis` 和 `HikariCP` 的结合是目前广泛采用的一种高效、灵活的解决方案,特别是对于处理多数据源场景。这个项目组合利用了它们各自的优势,减少了开发人员的工作量,提高了系统的性能。 首先,`...

    Springboot2.7.0 + mybatis 搭建多数据源

    在IT行业中,构建一个能够处理多个数据库的数据源架构是常见的需求,特别是在大型系统或分布式环境中。本教程将详细讲解如何使用Spring Boot ...通过学习这些示例,你可以更好地掌握如何在实际项目中应用多数据源配置。

    Spring+SpringMVC+Mybatis多数据源

    总结来说,"Spring+SpringMVC+Mybatis多数据源"的整合涉及了Spring的数据源管理、SpringMVC的请求路由、Mybatis的数据源配置以及事务管理。具体实现时,可以根据项目需求选择合适的方式进行数据源切换,以达到优化...

    mybatis-plus+动态数据源

    在IT行业中,数据库管理是核心任务之一,而动态数据源技术则是实现多数据库灵活切换的重要手段。本项目涉及的关键技术是"Mybatis-Plus"与"动态数据源"的结合使用,以及一系列相关的配置和扩展。下面将详细阐述这些...

    springboot整合mybatis配置多数据源

    在Spring Boot应用中整合MyBatis并配置多数据源是一项常见的任务,这使得应用程序能够根据需求切换或同时处理多个数据库。下面将详细讲解这个过程的关键步骤、涉及的技术点以及注意事项。 1. **Spring Boot与...

    mybatis+spring实现动态切换数据源

    在本项目中,我们将探讨如何利用MyBatis与Spring框架实现动态切换数据源的功能。首先,我们需要理解MyBatis和Spring的基本概念以及它们如何协同工作。 MyBatis是一个优秀的持久层框架,它简化了Java与数据库之间的...

    springboot-mybatis-多数据源

    本项目“springboot-mybatis-多数据源”聚焦于如何在Spring Boot环境中实现多数据源的支持,这对于大型分布式系统或是需要连接多个数据库的应用来说至关重要。 Spring Boot是由Pivotal团队维护的Java框架,它旨在...

    spring boot继承mybatis框架以及多数据源

    总的来说,这个项目提供了一个实践 Spring Boot 与 MyBatis 整合以及多数据源管理的平台,对于学习和理解微服务架构中的数据访问层设计具有很好的参考价值。开发者可以通过这个项目了解到如何在 Spring Boot 中配置...

    SpringBoot+MyBatis操作多数据源

    SpringBoot整合MyBatis处理多数据源,主要是为了解决在同一个应用中需要连接和操作多个不同数据库的需求。这在分布式系统、微服务架构或需要隔离不同业务数据的情况下非常常见。以下将详细介绍如何在SpringBoot中...

Global site tag (gtag.js) - Google Analytics