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文件
SELECT user_id,user_name,`password` FROM `user` WHERE user_name=#{userName}
SELECT role_id,`name`,`role_key` FROM `role` WHERE role_id=#{id}
注意:dao 层和 xml 需要按照库来分在不同的目录,不同数据源按照配置不同的路径进行注入。