Mybatis 配置多个数据源的方式

本文详细介绍了如何在 Mybatis 中配置多个数据源,包括properties属性文件的实现方式和Properties属性类型的实现方式。首先,展示了配置文件中设置两个数据源信息,然后通过工具类获取DataSource。接着,提出了通过定义接口和代理工厂实现数据源切换,并进行了测试。为了优化代码,文章采用了枚举策略模式来减少耦合,并提供了事务控制的补充说明。最后,讲解了动态传参配置数据库连接的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

properties 属性文件的实现方式

数据库连接的 properties 配置文件,配置两个数据源信息:

spring.jdbc.driver=com.mysql.cj.jdbc.Driver
spring.jdbc.url=jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.jdbc.username=root
spring.jdbc.password=123456

mybatis.jdbc.driver=com.mysql.cj.jdbc.Driver
mybatis.jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
mybatis.jdbc.username=root
mybatis.jdbc.password=123456

Mybatis 配置文件,配置两个 environment

<!-- 引入数据库配置文件 -->
<properties resource="database.properties"/>

<environments default="Spring">
    <environment id="Spring">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${spring.jdbc.driver}"/>
            <property name="url" value="${spring.jdbc.url}"/>
            <property name="username" value="${spring.jdbc.username}"/>
            <property name="password" value="${spring.jdbc.password}"/>
        </dataSource>
    </environment>

    <environment id="Mybatis">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${mybatis.jdbc.driver}"/>
            <property name="url" value="${mybatis.jdbc.url}"/>
            <property name="username" value="${mybatis.jdbc.username}"/>
            <property name="password" value="${mybatis.jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

通过 DataSourceSessionFactory 工具类,获取 SqlSessionFactory

package cn.worstone.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Optional;

public final class DataSourceSessionFactory {
   

    private static String MybatisConfigPath = "mybatis.xml";
    private static Map<DataSourceEnvironment, SqlSessionFactory> sessionFactoryMap = new HashMap<>();

    /**
     * Mybatis 配置的 Environment 中的数据源的枚举类型(即 Environment 的 id 属性值)
     */
    public static enum DataSourceEnvironment {
   
        Spring,
        Mybatis;
    }

    public static SqlSessionFactory getSessionFactory(DataSourceEnvironment dataSourceEnvironment) {
   
        SqlSessionFactory sqlSessionFactory = DataSourceSessionFactory.sessionFactoryMap.get(dataSourceEnvironment);
        sqlSessionFactory = Optional.ofNullable(sqlSessionFactory).orElseGet(()->{
   
            InputStream inputStream = null;
            try {
   
                inputStream = Resources.getResourceAsStream(DataSourceSessionFactory.MybatisConfigPath);
            } catch (IOException e) {
   
                e.printStackTrace();
            } 
            SqlSessionFactory temp = new SqlSessionFactoryBuilder().build(inputStream, dataSourceProperties);
            sessionFactoryMap.put(dataSourceProperties, temp);
            return temp;
        });

        return sqlSessionFactory;
    }
}

扩展

定义一个统一的 Mapper 标识接口,每一个具体的 Mapper 接口继承该接口:

package cn.worstone.mapper;

/**
 * 通用的 Mapper 接口, 可以定制所有的通用方法, 设置参数类型为 Map<String, Object>
 */
public interface Mapper {
   
}

定义一个 Mapper 代理工厂,并获取 Mapper 代理,便于在执行完 Mapper 中的方法后关闭 SqlSession

package cn.worstone.utils;

import cn.worstone.mapper.Mapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public final class MapperFactory {
   

    public static <T> T createMapper(Class<? extends Mapper> clazz, DataSourceSessionFactory.DataSourceEnvironment dataSourceEnvironment, boolean isCommit) {
   
        SqlSessionFactory sqlSessionFactory = MapperFactory.getSqlSessionFactory(dataSourceEnvironment);
        SqlSession sqlSession = sqlSessionFactory.openSession(isCommit);
        Mapper mapper = sqlSession.getMapper(clazz);
        return (T) MapperProxy.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值