Mybatis多資料來源配置
阿新 • • 發佈:2019-05-28
1.application.properties檔案配置配合資料來源
spring.datasource.query1.jdbc-url=jdbc:mysql://192.168.0.112:3306/secms_ods?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.query1.username=root spring.datasource.query1.password= spring.datasource.query1.driver-class-name=com.mysql.jdbc.Driver spring.datasource.query2.jdbc-url=jdbc:mysql://192.168.0.112:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.query2.username=root spring.datasource.query2.password= spring.datasource.query2.driver-class-name=com.mysql.jdbc.Driver mybatis.config-location=classpath:mybatis/mybatis-config.xml
2.資料來源配置
@Configuration @MapperScan(basePackages="com.jiafeng.dao.query1",sqlSessionTemplateRef="query1SqlSessionTemplate") public class DataSource1Config { @Bean(name = "query1DataSource") //配置資料來源名稱 @ConfigurationProperties(prefix = "spring.datasource.query1") //將配置檔案中資料來源配置資訊注入到該資料來源 @Primary //Primary可以理解為預設優先選擇,同時不可以同時設定多個 public DataSource query1DataSource() { return DataSourceBuilder.create().build(); } @Bean(name="query1SqlSessionFactory") @Primary public SqlSessionFactory query1SqlSessionFactory(@Qualifier("query1DataSource")DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //資料來源注入到mapper.xml檔案 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/query1/*.xml")); return bean.getObject(); } @Bean(name="query1TransactionManager") @Primary public DataSourceTransactionManager query1TransactionManager(@Qualifier("query1DataSource")DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name="query1SqlSessionTemplate") @Primary public SqlSessionTemplate query1SqlSessionTemplate(@Qualifier("query1SqlSessionFactory")SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
一層一層注入,首先建立 DataSource,然後建立 SqlSessionFactory 再建立事務,最後包裝到 SqlSessionTemplate 中。其中需要指定分庫的 mapper 檔案地址,以及分庫dao層程式碼。
@MapperScan(basePackages="com.jiafeng.dao.query1",sqlSessionTemplateRef="query1SqlSessionTemplate")
配置掃描的dao層:com.jiafeng.dao.query1,並將dao層注入到query1SqlSessionTemplate中。
第二個資料來源配置
@Configuration @MapperScan(basePackages="com.jiafeng.dao.query2",sqlSessionTemplateRef="query2SqlSessionTemplate") public class DataSource2Config { @Bean(name = "query2DataSource") @ConfigurationProperties(prefix = "spring.datasource.query2") public DataSource query1DataSource() { return DataSourceBuilder.create().build(); } @Bean(name="query2SqlSessionFactory") public SqlSessionFactory query1SqlSessionFactory(@Qualifier("query2DataSource")DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //資料來源注入到mapper.xml檔案 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/query2/*.xml")); return bean.getObject(); } @Bean(name="query2TransactionManager") public DataSourceTransactionManager query1TransactionManager(@Qualifier("query2DataSource")DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name="query2SqlSessionTemplate") public SqlSessionTemplate query1SqlSessionTemplate(@Qualifier("query2SqlSessionFactory")SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
3.dao層實現
package com.jiafeng.dao.query1;
import com.jiafeng.domain.User;
public interface SysUserMapper {
User findUserByName(String userName);
}
package com.jiafeng.dao.query2;
import com.jiafeng.domain.Role;
public interface RoleMapper {
Role getRoleById(String id);
}
mapper檔案
<?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.jiafeng.dao.query1.SysUserMapper">
<resultMap id="result" type="com.jiafeng.domain.User">
<id property="id" column="user_id" />
<result property="userName" column="user_name" />
<result property="passWord" column="password" />
</resultMap>
<select id="findUserByName" resultMap="result" parameterType="string">
SELECT user_id,user_name,`password` FROM `user` WHERE user_name=#{userName}
</select>
</mapper>
<?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.jiafeng.dao.query2.RoleMapper">
<resultMap id="result" type="com.jiafeng.domain.Role">
<id property="id" column="role_id" />
<result property="name" column="name" />
<result property="roleKey" column="role_key" />
</resultMap>
<select id="getRoleById" resultMap="result" parameterType="string">
SELECT role_id,`name`,`role_key` FROM `role` WHERE role_id=#{id}
</select>
</mapper>
注意:dao 層和 xml 需要按照庫來分在不同的目錄,不同資料來源按照配置不同的