首先,使用Mybatis配置多个数据源需要用到两个工具类:SqlSessionFactory MapperFactory
/**
* 根据mybatis.xml中配置的不同的environment创建对应的SqlSessionFactory
*/
public final class SqlSessionFactory {
private static final Logger logger = LoggerFactory.getLogger(SqlSessionFactory.class);
private static final String CONFIGURATION_PATH = "mybatis/mybatis-config.xml";
private static final Map<String, org.apache.ibatis.session.SqlSessionFactory> SQLSESSIONFACTORYS = new HashMap();
/**
* 根据指定的DataSourceEnvironment获取对应的SqlSessionFactory
*/
public static org.apache.ibatis.session.SqlSessionFactory getSqlSessionFactory(String datasource) {
org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory = SQLSESSIONFACTORYS.get(datasource);
if (!Objects.isNull(sqlSessionFactory))
return sqlSessionFactory;
else {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(CONFIGURATION_PATH);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, datasource);
logger.info("Get {} SqlSessionFactory successfully.", datasource);
} catch (IOException e) {
logger.warn("Get {} SqlSessionFactory error.", datasource);
logger.error(e.getMessage(), e);
} finally {
IOUtils.closeQuietly(inputStream);
}
SQLSESSIONFACTORYS.put(datasource, sqlSessionFactory);
return sqlSessionFactory;
}
}
}
/**
* MapperFactory 创建一个Mapper实例 mapper
*/
public final class MapperFactory {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MapperFactory.class);
/**
* 通过datasource 创建一个Mapper 的实现类 mapper
*/
@SuppressWarnings("unchecked")
public static <T> T createMapper(Class<? extends Mapper> clazz, String datasource) {
org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(datasource);
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper mapper = sqlSession.getMapper(clazz);
return (T) MapperProxy.bind(mapper, sqlSession);
}
/**
* Mapper代理: 执行 mapper 方法和关闭 sqlSession
*/
private static class MapperProxy implements InvocationHandler {
private Mapper mapper;
private SqlSession sqlSession;
private MapperProxy(Mapper mapper, SqlSession sqlSession) {
this.mapper = mapper;
this.sqlSession = sqlSession;
}
@SuppressWarnings("unchecked")
private static Mapper bind(Mapper mapper, SqlSession sqlSession) {
return (Mapper) Proxy.newProxyInstance(mapper.getClass().getClassLoader(),
mapper.getClass().getInterfaces(), new MapperProxy(mapper, sqlSession));
}
/**
* 执行mapper方法并最终关闭sqlSession
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null;
try {
object = method.invoke(mapper, args);
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage(), e);
} finally {
sqlSession.close();
}
return object;
}
}
/**
* 获取数据源 datasource 的 SqlSessionFactory
*/
private static org.apache.ibatis.session.SqlSessionFactory getSqlSessionFactory(String datasource) {
return SqlSessionFactory.getSqlSessionFactory(datasource);
}
}
其中,SqlSessionFactory根据mybatis.xml中配置的不同的environment创建对应的SqlSessionsqlSessionFactory,在由MapperFactory来使用这个sqlSession。
Mapper mapper = sqlSession.getMapper(Class<? extends Mapper> clazz);
接着,在数据库配置文件jdbc.properties中,配置sql连接需要的参数:
api00.jdbc.url=jdbc:mysql://10.126.13.10:3307/XXXXX?characterSet=utf8mb4
api01.jdbc.url=jdbc:mysql://10.126.13.24:3307/XXXXX?characterSet=utf8mb4
api02.jdbc.url=jdbc:mysql://10.126.14.6:3307/XXXXX?characterSet=utf8mb4
api03.jdbc.url=jdbc:mysql://10.126.13.6:3307/XXXXX?characterSet=utf8mb4
api04.jdbc.url=jdbc:mysql://10.126.13.11:3307/XXXXX?characterSet=utf8mb4
api.jdbc.username=XXXXX
api.jdbc.password=XXXXX
api.jdbc.driverClassName=com.mysql.jdbc.Driver
在mybatis-config文件中,配置多个数据源的environment:
<?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>
<properties resource="mybatis/jdbc.properties"/>
<!-- 全局参数 -->
<settings>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.XXX.XXX"/>
</typeAliases>
<environments default="wemedia">
<environment id="api00">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="url" value="${api00.jdbc.url}" />
<property name="driver" value="${api.jdbc.driverClassName}" />
<property name="username" value="${api.jdbc.username}" />
<property name="password" value="${api.jdbc.password}" />
</dataSource>
</environment>
<environment id="api01">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="url" value="${api01.jdbc.url}" />
<property name="driver" value="${api.jdbc.driverClassName}" />
<property name="username" value="${api.jdbc.username}" />
<property name="password" value="${api.jdbc.password}" />
</dataSource>
</environment>
<environment id="api02">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="url" value="${api02.jdbc.url}" />
<property name="driver" value="${api.jdbc.driverClassName}" />
<property name="username" value="${api.jdbc.username}" />
<property name="password" value="${api.jdbc.password}" />
</dataSource>
</environment>
<environment id="api03">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="url" value="${api03.jdbc.url}" />
<property name="driver" value="${api.jdbc.driverClassName}" />
<property name="username" value="${api.jdbc.username}" />
<property name="password" value="${api.jdbc.password}" />
</dataSource>
</environment>
<environment id="api04">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="url" value="${api04.jdbc.url}" />
<property name="driver" value="${api.jdbc.driverClassName}" />
<property name="username" value="${api.jdbc.username}" />
<property name="password" value="${api.jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mapper/XXX.xml"/>
<mapper resource="mybatis/mapper/YYY.xml"/>
</mappers>
</configuration>
OK 到现在为止,工具类以及配置文件都已经写好了,可以在使用了~
使用的时候,首先new 一个空接口Mapper,以作为所有实现该接口的都是mapper实现类的标识
public interface Mapper {
}
一个具体mapper的接口:
public interface ChannelDao extends Mapper {
Long checkRelationship(@Param("fromId") String fromId,
@Param("userId") Long userId);
}
然后就可以在工程中使用了:
ChannelDao channelDao = MapperFactory.createMapper(ChannelDao.class, "api01");
channelID = channelDao.checkRelationship("XXXXX", 123456);
通过 MapperFactory.createMapper方法,传入mapper对象与数据源,即可简单便捷的连接到任意配置好的数据源了~
---------------------
作者:Qiao丫头
来源:CSDN
原文:https://blog.csdn.net/qiaoqiao0609/article/details/79219540?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!