加入收藏 | 设为首页 |

滚-Springboot +Mybatis完成多数据源装备,你会吗?

海外新闻 时间: 浏览:121 次

01 前语

跟着运用用户数量的添加,相应的并发恳求的数量也会跟着不断添加,慢慢地,单个数据库现已没有办法满意咱们频频的数据库操作恳求了,在某些场景下,咱们可能会需求装备多个数据源,运用多个数据源(例如完成数据库的读写别离)来缓解体系的压力等,相同的,Springboot官方供给了相应的完成来协助开发者们装备多数据源,一般分为两种方法(现在我所了解到的),分包和AOP,其间运用AOP完成多个数据源到的动态切换时分会另开一篇文章来写。考虑到mybatis是java开发者们运用较为频频的数据库结构,所以本篇文章运用Springboot+Mybatis来完成多数据源的装备。

废话不多说,走起。

02 数据库预备

既然是装备多数据源,那么咱们天然就要先把相应的数据源给预备好,这儿呢,我本地新建了两个数据库,如下表:

并别离刺进两条记载,为了便利比照,其间testdatasource1为芳年25岁的张三, testdatasource2为芳年30岁的李四。

03 环境预备

首要新建一个Springboot项目,我这儿版本是2.1.7.RELEASE,并在pom文件中引进相关依靠:要害依靠如下:

 
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2


mysql
mysql-connector-java

到这儿咱们的环境现已根本装备完成了。

04 代码部分

4.1 多数据源装备

首要呢,在咱们Springboot的装备文件中装备咱们的datasourse,和以往不一样的是,由于咱们有两个数据源,所观察以要指定相关数据库的称号,其间主数据源为primary,次数据源为secondary如下:

#装备主数据库
spri滚-Springboot +Mybatis完成多数据源装备,你会吗?ng.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/testdatasource1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
##装备次数据库
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/testdatasource2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

需求咱们留意的是,Springboot2.0 在装备数据库衔接的时分需求运用jdbc-url,假如只运用url的话会报

jdbcUrl is required with driverClassName.过错。

新建一个装备类PrimaryDataSourceConfig,用于装备咱们的主数据库相关的bean,代码如下:

@Configuration
@MapperScan(basePackages = "com.jdkcb.mybatisstuday.mapper.one", sqlSessionFactoryRef = "PrimarySqlSessionFactory")//basePackages:接口文件的包途径
public class PrimaryDataSourceConfig {
@Bean(name = "PrimaryDataSource")
// 表明这个数据源是默许数据源
@Primary//这个一定要加,假如两个数据源都没有@Primary会报错
@ConfigurationProperties(prefix = "spring.datasource.primary")//咱们装备文件中的前缀
public DataSource getPrimaryDateSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "PrimarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("PrimaryDataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/one/*.xml"));
return bean.getObject();// 设置mybatis的xml所在位置
}


@Bean("PrimarySqlSessionTemplate")
// 表明这个数据源是默许数据源
@Primary
public SqlSessionTemplate滚-Springboot +Mybatis完成多数据源装备,你会吗? primarySqlSessionTemplate(
@Qualifier("PrimarySqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
}

注解阐明:

@MapperScan :装备mybatis的接口类放的当地

@Primary :表明运用的是默许数据库,这个一个要加,否则会由于不知道哪个数据库是默许数据库而报错

@ConfigurationProperties:读取application.properties中的装备参数映射成为一个目标,其间prefix表明参数的前缀

功德圆满~ ~ 了吗?并没有,然后装备咱们的第二个数据源的装备类,代码如下:

@Configuration
@MapperScan(basePackages = "com.jdkcb.mybatisstuday.mapper.two", sqlSessionFactoryRef = "SecondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
@Bean(name = "SecondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource getSecondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "SecondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("SecondaryDataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/two/*.xml"));
return bean.getObject();// 设置mybatis的xml所在位置
}
@Bean("SecondarySqlSessionTemplate")
public SqlSessionTemplate secondarySqlSessionTemplate(
@Qualifier("SecondarySqlSessionFactory") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}

剩余的便是编写咱们相应的xml文件和接口类了,代码如下:

@Component
@Mapper
public interface PrimaryUserMapper {
List findAll();
}
@Component
@Mapper
public interface SecondaryUserMapper {
List findAll();
}

相关的xml文件如下:


PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">




PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">



注:其间xml文件在本实例中目录为:resources/mapping

4.2 测验

编写一个Controller用于测验,由于是测验实例且代码相对来说较为简略,所以这儿就不写Service层了。

代码如下:

@RestController
public class UserController {
@Autowired
private PrimaryUserMapper primaryUserMapper;
@Autowired
private SecondaryUserMapper secondaryUserMapper;
@RequestMapping("primary")
public Object primary(){
List list = primaryUserMapper.findAll();
ret滚-Springboot +Mybatis完成多数据源装备,你会吗?urn list;
}
@RequestMapping("secondary")
public Object secondary (){
List list = secondaryUserMapper.findAll();
return list;
}

}

在浏览器别离输入:http://127.0.0.1:8080/primary 和 http://127.0.0.1:8080/secondary

成果如下:

[{"user_id":1,"user_name":"张三","user_age":25}] //primary 
[{"user_id":1,"user_name":"李四","user_age":30}] //secondary

到此,Springboot结合mybatis装备多数据源就功德圆满啦。

好啦,看完之后假如你觉得有所收成,那就点个赞再走呗~