简单纪要:mybatis spring 多数据源切换及整合
一 在spring-config-dao中填写多个数据源信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-lazy-init="false">
<!-- 数据源1 start-->
<!--配置数据源 -->
<bean id="master" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="1" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="30" />
</bean>
<bean id="slave" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${slave.jdbc.url}" />
<property name="user" value="${slave.jdbc.username}" />
<property name="password" value="${slave.jdbc.password}" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="1" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="30" />
</bean>
<!-- 动态数据源 -->
<bean id="dynamicDataSource" class="com.ceshi.util.DynamicDataSource">
<!-- 通过key-value关联数据源 -->
<property name="targetDataSources">
<map>
<entry value-ref="master" key="master"></entry>
<entry value-ref="slave" key="slave"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="master" />
</bean>
<!--mybatis与Spring整合 开始 -->
<bean id="sqlSessionFactory" name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
<property name="dataSource" ref="dynamicDataSource" />
<property name="mapperLocations" value="classpath:mybatis/*-mapper.xml" />
<property name="typeAliasesPackage" value="com.ceshi.dto" />
</bean>
<bean name="mapperScannerConfigurer1" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.ceshi.dao" />
</bean>
<!-- 数据源1 end-->
<!-- 数据源2 start-->
<bean id="master_ceshi" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${ceshi.jdbc.url}" />
<property name="user" value="${ceshi.jdbc.username}" />
<property name="password" value="${ceshi.jdbc.password}" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="1" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="30" />
</bean>
<bean id="slave_ceshi" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${ceshi.slave.jdbc.url}" />
<property name="user" value="${ceshi.slave.jdbc.username}" />
<property name="password" value="${ceshi.slave.jdbc.password}" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="1" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="30" />
</bean>
<!-- 动态数据源 -->
<bean id="dynamicDataSource_videoplat" class="com.ceshi.ceshi.DynamicDataSource">
<!-- 通过key-value关联数据源 -->
<property name="targetDataSources">
<map>
<entry value-ref="master_ceshi" key="master_ceshi"></entry>
<entry value-ref="slave_ceshi" key="slave_ceshi"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="master_ceshi" />
</bean>
<!--mybatis与Spring整合 开始 -->
<bean id="sqlSessionFactory_ceshi" name="sqlSessionFactory_ceshi" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/ceshi/mybatis-config.xml"></property>
<property name="dataSource" ref="dynamicDataSource_ceshi" />
<property name="mapperLocations" value="classpath:mybatis/ceshi/*-mapper.xml" />
<property name="typeAliasesPackage" value="com.ceshi.dto.ceshi" />
</bean>
<bean name="mapperScannerConfigurer2" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_ceshi"/>
<property name="basePackage" value="com.ceshi.dao_videoplat" />
</bean>
<!-- 数据源2 end-->
<!-- 数据源3 start-->
<bean id="master_jed" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${jed.jdbc.url}" />
<property name="user" value="${jed.jdbc.username}" />
<property name="password" value="${jed.jdbc.password}" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="1" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="30" />
</bean>
<bean id="slave_jed" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="${jed.slave.jdbc.url}" />
<property name="user" value="${jed.slave.jdbc.username}" />
<property name="password" value="${jed.slave.jdbc.password}" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="1" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="30" />
</bean>
<!-- 动态数据源 -->
<bean id="dynamicDataSource_jed" class="com.util.jed.DynamicDataSource">
<!-- 通过key-value关联数据源 -->
<property name="targetDataSources">
<map>
<entry value-ref="master_jed" key="master_jed"></entry>
<entry value-ref="slave_jed" key="slave_jed"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="master_jed" />
</bean>
<!--mybatis与Spring整合 开始 -->
<bean id="sqlSessionFactory_jed" name="sqlSessionFactory_jed" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/jed/mybatis-config.xml"></property>
<property name="dataSource" ref="dynamicDataSource_jed" />
<property name="mapperLocations" value="classpath:mybatis/jed/Band(或者此处填 *)-mapper.xml" />
<property name="typeAliasesPackage" value="com.ceshi.dto.ceshi" />
</bean>
<bean name="mapperScannerConfigurer3" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_jed"/>
<property name="basePackage" value="com.jd.vd.manage.dao_jed" />
</bean>
<!-- 数据源3 end-->
</beans>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 全局映射器启用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查询时,关闭关联对象即时加载以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允许使用列标签代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
<!-- <setting name="useGeneratedKeys" value="true" /> -->
<!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 对于批量更新操作缓存SQL以提高性能 -->
<!-- <setting name="defaultExecutorType" value="BATCH" /> -->
<!-- 数据库超过25000秒仍未响应则超时 -->
<setting name="defaultStatementTimeout" value="0" />
<!--强制指定MyBatis使用log4j作为日志日志框架,若不指定那么当部署到如Tomcat等应用容器时,会被容器设置为使用common-logging来记录日志-->
<setting name="logImpl" value="LOG4J"/>
</settings>
</configuration>
二 创建动态数据源的工具类
DynamicDataSource.java
package com.util.jed; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { private static final Logger logger = LoggerFactory.getLogger(DynamicDataSource.class); /** * Description: 自动查找datasource * @return */ @Override protected Object determineCurrentLookupKey() { return JEDDBContextHolder.getDbType(); } }
JEDContextHolder.java
package com.util.jed; public class JEDContextHolder { /** * 线程threadlocal */ private static ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static String DB_TYPE_RW_JED = "master_jed"; public static String DB_TYPE_R_JED = "slave_jed"; public static String getDbType() { String db = contextHolder.get(); if (db == null) { db = DB_TYPE_RW_JED;// 默认是读写库 } return db; } /** * * 设置本线程的dbtype */ public static void setDbType(String str) { contextHolder.set(str); } /** * clearDBType * * @Title: clearDBType * @Description: 清理连接类型 */ public static void clearDBType() { contextHolder.remove(); } }
三 创建其他必要文件
JedDao.java
package com.jed.dao_jed;
import com.jed.Jed;
import org.springframework.stereotype.Repository;
@Repository("jedDao")
public interface JedDao {
Jed selectJed(Jed jed);
}
Jed-mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jed.dao_jed.JedDao">
<sql id="Base_Column" >
id,
title
</sql>
<sql id="COMMON">
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="minId!=null and minId!=''">
<![CDATA[
and id >= #{minId}
]]>
</if>
<if test="uploadTimeBegin!=null and uploadTimeBegin!=''">
<![CDATA[
and create_time >= #{uploadTimeBegin}
]]>
</if>
<if test="uploadTimeEnd!=null and uploadTimeEnd!=''">
<![CDATA[
and create_time <= #{uploadTimeEnd}
]]>
</if>
</trim>
</sql>
<select id="selectJed" parameterType="Jed" resultType="Jed">
select <include refid="Base_Column" /> from jed <include refid="COMMON" /> limit 1
</select>
</mapper>
impl.java
Jed jed = new Jed();
Jed.setId(id);
JEDContextHolder.setDbType(JEDContextHolder.DB_TYPE_R_JED);
jed = jedDao.selectJed(jed);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律