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.bind(mapper, sqlSession);
}

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

被折叠的 条评论
为什么被折叠?



