mybatis多数据源
相关代码如下:application.properties
:
#spring.datasource.username=root
#spring.datasource.password=12345
#spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/test01?userUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
#默认的数据源配置如上,但是现在需要配置多数据源,所以需要自定义配置数据源,如下配置多数据源参数,默认是不会被spring识别的,因为下面的key都是自定义的,所以需要自己配置DataSource和MybatisConfig(注入SqlSessionFactory 和 SqlSessionTemplate)
spring.datasource.one.username=root
spring.datasource.one.password=12345
spring.datasource.one.jdbcUrl=jdbc:mysql://localhost:3306/test01?userUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.two.username=root
spring.datasource.two.password=12345
spring.datasource.two.jdbcUrl=jdbc:mysql://localhost:3306/test02?userUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
DataSourceConfig
:
package com.cls.mybatismulti.config;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @author by CLS
* @Classname DataSourceConfig
* @Description TODO
* @Date 2021/5/16/0016 22:19:19
*/
@Configuration
public class DataSourceConfig {
@Bean
// 指定数据源是依据配置文件中的那些参数来构建的:依据配置文件中 spring.datasource.one前缀开头的属性构建数据源,
// 现在注入了两个 HikariDataSource 对象,然后在创建MybaitsConfig配置两个mybatis实例
@ConfigurationProperties(prefix = "spring.datasource.one")
DataSource dsOne(){
return new HikariDataSource();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
DataSource dsTwo(){
return new HikariDataSource();
}
}
MyBatisConfigOne
:
package com.cls.mybatismulti.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @author by CLS
* @Classname MyBatisConfigOne
* @Description TODO
* @Date 2021/5/16/0016 22:22:03
*/
/**
* 配置SqlSessionFactory 和 SqlSessionTemplate
*/
@Configuration
//因为有两个数据源,需要扫描不一样的地方 所以需要配置mapperscan
@MapperScan(basePackages = "com.cls.mybatismulti.mapper1",
sqlSessionFactoryRef = "sqlSessionFactory1",
sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
@Autowired
//这里有两个DataSource实例,所以需要指定
@Qualifier("dsOne")
DataSource ds;
@Bean
SqlSessionFactory sqlSessionFactory1(){
SqlSessionFactory sqlSessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds);
sqlSessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1(){
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
MyBatisConfigTwo
:
package com.cls.mybatismulti.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @author by CLS
* @Classname MyBatisConfigOne
* @Description TODO
* @Date 2021/5/16/0016 22:22:03
*/
@Configuration
@MapperScan(basePackages = "com.cls.mybatismulti.mapper2",
sqlSessionFactoryRef = "sqlSessionFactory2",
sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
@Autowired
@Qualifier("dsTwo")
DataSource ds;
@Bean
SqlSessionFactory sqlSessionFactory2(){
SqlSessionFactory sqlSessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds);
sqlSessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2(){
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
测试:
package com.cls.mybatismulti;
import com.cls.mybatismulti.mapper1.UserMapper1;
import com.cls.mybatismulti.mapper2.UserMapper2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MybatismultiApplicationTests {
@Autowired
UserMapper1 userMapper1;
@Autowired
UserMapper2 userMapper2;
@Test
void contextLoads() {
System.out.println("userMapper1.getAllUsers() = " + userMapper1.getAllUsers());
System.out.println("userMapper2.getAllUsers() = " + userMapper2.getAllUsers());
}
}
目录结构:
测试:
package com.cls.mybatismulti;
import com.cls.mybatismulti.mapper1.UserMapper1;
import com.cls.mybatismulti.mapper2.UserMapper2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MybatismultiApplicationTests {
@Autowired
UserMapper1 userMapper1;
@Autowired
UserMapper2 userMapper2;
@Test
void contextLoads() {
System.out.println("userMapper1.getAllUsers() = " + userMapper1.getAllUsers());
System.out.println("userMapper2.getAllUsers() = " + userMapper2.getAllUsers());
}
}
结果: