项目结构图:
有多少数据源就有多少个类 没个数据源对应一个类
最主要的就是这里的配置,其他的地方,和单数据库使用基本一样。
test1库和test2库,在使用的过程中必须指定主库,不然会报错。我们把test1作为主数据库。
下面只针对test1的相关代码,进行说明,test2库的代码,除了少了@Primary这个注解,其他都和test1一样
主数据源:DataSource1
application.properties:
#Mybatis全局文件
mybatis.config-locations=classpath:yiche/com/mapper/mybatis-config.xml
spring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = xx
spring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = xx
@Configuration
@MapperScan(basePackages = "yiche.com.mapper.test1", sqlSessionTemplateRef = "test1SqlSessionTemplate")
public class DataSource1 {
/*主数据源 用primary标志*/
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
@Primary
public DataSource getDataSource1() {
return DataSourceBuilder.create().build();
}
/*工厂*/
@Bean(name = "test1SqlSessionFactory")
@Primary
public SqlSessionFactory getSqlSessionFactory1(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//实体类的所在包
bean.setTypeAliasesPackage("yiche.com.entity");
//此外还可以设置Mybatis全局文件的所在包 这里没有 这里设置驼峰命名
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
//接口对应的xml文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:yiche/com/mapper/test1/*.xml"));
return bean.getObject();
}
/*事务管理*/
@Bean(name = "test1TransactionManager")
@Primary
public DataSourceTransactionManager getDataSourceTransactionManager1(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test1SqlSessionTemplate")
@Primary
public SqlSessionTemplate getSqlSessionTemplate1(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
从数据源:DataSource2
@Configuration
@MapperScan(basePackages = "yiche.com.mapper.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate")
public class DataSource2 {
/*从数据源 不用primary标志*/
@Bean(name = "test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource getDataSource2() {
return DataSourceBuilder.create().build();
}
/*工厂*/
@Bean(name = "test2SqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory2(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//实体类的所在包
bean.setTypeAliasesPackage("yiche.com.entity");
//此外还可以设置Mybatis全局文件的所在包 这里没有 这里设置驼峰命名
bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
//接口对应的xml文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:yiche/com/mapper/test2/*.xml"));
return bean.getObject();
}
/*事务管理*/
@Bean(name = "test2TransactionManager")
public DataSourceTransactionManager getDataSourceTransactionManager2(@Qualifier("test2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test2SqlSessionTemplate")
public SqlSessionTemplate getSqlSessionTemplate2(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
主数据源对应的mapper接口
@Component
public interface EmployeeMapper1 {
List<Employee> getAll();
Employee getByName(String name);
}
主数据源使用的EmployeeMapper1.xml
<?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="yiche.com.mapper.test1.EmployeeMapper1">
<!-- 使用别名的目的是让查询结果属性名称和实体bean的属性名对应,要不让绑定不上数据。要么就写resultMap这个大家自己搞了 -->
<select id="getByName" resultType="yiche.com.entity.Employee">
select * from employee where name=#{name}
</select>
<select id="getAll" resultType="yiche.com.entity.Employee">
select * from employee
</select>
<insert id="addEmployee">
insert into
employee
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="employee.name != null and employee.name!=''">
name,
</if>
<if test="employee.age != null and employee.age!=''">
age,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="employee.name != null and employee.name!=''">
#{name}, jdbcType=VARCHAR},
</if>
<if test="employee.age != null and employee.age !=''">
#{age,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="update">
update employee
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
</set>
where id=#{id}
</update>
<delete id="delete" parameterType="Integer">
delete from employee where id=#{id}
</delete>
</mapper>
对应的从数据源接口:
扫描二维码关注公众号,回复:
187308 查看本文章
@Component
public interface EmployeeMapper2 {
List<Employee> getAll();
Employee getByName(String name);
}
EmployeeMapper2.xml文件:
<?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="yiche.com.mapper.test2.EmployeeMapper2">
<!-- 使用别名的目的是让查询结果属性名称和实体bean的属性名对应,要不让绑定不上数据。要么就写resultMap这个大家自己搞了 -->
<select id="getByName" resultType="yiche.com.entity.Employee">
select * from employee where name=#{name}
</select>
<select id="getAll" resultType="yiche.com.entity.Employee">
select * from employee
</select>
<insert id="addUser">
insert into
employee
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="employee.name != null and employee.name!=''">
name,
</if>
<if test="employee.age != null and employee.age!=''">
age,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="employee.name != null and employee.name!=''">
#{name}, jdbcType=VARCHAR},
</if>
<if test="employee.age != null and employee.age !=''">
#{age,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="update">
update employee
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
</set>
where id=#{id}
</update>
<delete id="delete" parameterType="Integer">
delete from employee where id=#{id}
</delete>
</mapper>
mybatis-config.xml全集配置文件
<?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>
<!--
<mappers>
<mapper resource="classpath:yiche/com/mapper/UserMapper.xml"></mapper>
</mappers>-->
</configuration>
Controller测试方法:
@Controller
public class EmployeeController {
@Autowired
EmployeeMapper1 employeeMapper1;
@Autowired
EmployeeMapper2 employeeMapper2;
@RequestMapping("/test")
@ResponseBody
public String test(){
return "ok";
}
//数据源1的查询
@RequestMapping("/getAll_1")
@ResponseBody
public List<Employee> getAll_1(){
return employeeMapper1.getAll();
}
//数据源2的查询
@RequestMapping("/getAll_2")
@ResponseBody
public List<Employee> getAll_2(){
return employeeMapper2.getAll();
}
//数据源1的查询
@RequestMapping("/getByName1")
@ResponseBody
public Employee getByName1(){
String name="cici";
return employeeMapper1.getByName(name);
}
//数据源2的查询
@RequestMapping("/getByName2")
@ResponseBody
public Employee getByName2(){
String name="gg";
return employeeMapper2.getByName(name);
}
}
pom.xml文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<!--pagehelper-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
参考:
https://blog.csdn.net/xx326664162/article/details/77235958
https://www.jianshu.com/p/5e19f9784498