1. 程式人生 > >Mybatis多資料來源配置

Mybatis多資料來源配置

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 需要按照庫來分在不同的目錄,不同資料來源按照配置不同的