spring 整合mybatis 配置多数据源动态选择sqlsessionfactory详细教程
时间: 2023-05-08 21:58:40 浏览: 207
spring整合mybatis多数据源
Spring整合MyBatis是我们在Java开发中经常使用的方式,其中配置多数据源是一种比较常见的需求,尤其是涉及到多个数据库的应用场景。下面将详细介绍如何配置多数据源并动态选择SqlSessionfactory。
首先,在Spring的配置文件中我们需要定义多个数据源,这里我们以两个数据源为例,分别为datasource1和datasource2。
<bean id="datasource1" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db1"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="datasource2" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db2"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
接着,我们需要配置SqlSessionFactory,这里主要是用到SqlSessionFactoryBean,其中使用的是MyBatis的MapperLocations属性来指定mapper的位置。
<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource1"/>
<property name="mapperLocations"
value="classpath*:mappers1/*.xml"/>
</bean>
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource2"/>
<property name="mapperLocations"
value="classpath*:mappers2/*.xml"/>
</bean>
然后,我们需要配置SqlSessionTemplate,这里使用了动态选择SqlSessionFactory的方式,通过自定义的SqlSessionTemplate实现。
<bean id="sqlSessionTemplate" class="com.example.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory1"/>
<constructor-arg index="1" ref="sqlSessionFactory2"/>
</bean>
其中,自定义的SqlSessionTemplate代码如下所示。
public class SqlSessionTemplate extends org.mybatis.spring.SqlSessionTemplate {
private SqlSessionFactory targetSqlSessionFactory;
public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory1, SqlSessionFactory sqlSessionFactory2) {
super(sqlSessionFactory1);
targetSqlSessionFactory = sqlSessionFactory2;
}
@Override
public void clearCache() {
super.clearCache();
((org.apache.ibatis.session.defaults.DefaultSqlSession)
targetSqlSessionFactory.openSession()).clearCache();
}
@Override
public SqlSessionFactory getSqlSessionFactory() {
SqlSession sqlSession = super.getSqlSession();
if (sqlSession.getConfiguration().getEnvironment().getId().equals("datasource1")) {
return super.getSqlSessionFactory();
} else {
return targetSqlSessionFactory;
}
}
}
最后在mybatis的mapper文件中使用namespace关键字来对应不同的数据源,这里以两个数据源为例,分别为namespace1和namespace2。
<mapper namespace="namespace1">
......
</mapper>
<mapper namespace="namespace2">
......
</mapper>
至此,我们就完成了配置多数据源并动态选择SqlSessionfactory的过程,通过自定义的SqlSessionTemplate实现了动态切换数据源。
阅读全文