上一篇文章《SpringBoot实现多数据源(三)【AOP + 自定义注解】》
四、集成多个 Mybatis 框架
实现步骤
- 创建一个 dynamic_mybatis 的springboot项目,导入依赖
- pom.xml
<dependencies><!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency></dependencies>
- 配置文件
- application.yml
spring:application:name: dynamic_datasource# 数据源datasource:type: com.alibaba.druid.pool.DruidDataSource# 读数据源read:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/read?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456# 写数据源write:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/write?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456
# 端口号
server:port: 3355
- 实体类(这里省略增删查改的数据库操作)
- People
package com.vinjcent.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class People {private String name;}
- 配置读写分离的的MybatisConfiguration配置
- RMybatisConfiguration(读数据源)
package com.vinjcent.config.mybatis;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;/*** 读数据源配置* 1. 指定扫描mapper接口包* 2. 指定使用wSqlSessionFactory是哪个*/
@Configuration
@MapperScan(basePackages = "com.vinjcent.mapper.read", sqlSessionFactoryRef = "rSqlSessionFactory")
public class RMybatisConfiguration {@Bean(name = "readDatasource")@ConfigurationProperties(prefix = "spring.datasource.read")public DataSource readDatasource() {// 底层会自动拿到spring.datasource中的配置,创建一个DruidDataSourcereturn DruidDataSourceBuilder.create().build();}@Bean@Primarypublic SqlSessionFactory rSqlSessionFactory(@Qualifier("readDatasource") DataSource dataSource) throws Exception {final SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/vinjcent/mapper/read/*.xml"));/* 主库设置sql控制台打印 */org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configuration.setLogImpl(StdOutImpl.class);sqlSessionFactory.setConfiguration(configuration);sqlSessionFactory.setTypeAliasesPackage("com.vinjcent.pojo");return sqlSessionFactory.getObject();}
}
- WMybatisConfiguration(写数据源)
package com.vinjcent.config.mybatis;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;/*** 写数据源配置* 1. 指定扫描mapper接口包* 2. 指定使用wSqlSessionFactory是哪个*/
@Configuration
@MapperScan(basePackages = "com.vinjcent.mapper.write", sqlSessionFactoryRef = "wSqlSessionFactory")
public class WMybatisConfiguration {@Bean(name = "writeDatasource")@ConfigurationProperties(prefix = "spring.datasource.write")public DataSource writeDatasource() {// 底层会自动拿到spring.datasource中的配置,创建一个DruidDataSourcereturn DruidDataSourceBuilder.create().build();}@Bean@Primarypublic SqlSessionFactory wSqlSessionFactory(@Qualifier("writeDatasource") DataSource dataSource) throws Exception {final SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/vinjcent/mapper/write/*.xml"));/* 主库设置sql控制台打印 */org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configuration.setLogImpl(StdOutImpl.class);sqlSessionFactory.setConfiguration(configuration);sqlSessionFactory.setTypeAliasesPackage("com.vinjcent.pojo");return sqlSessionFactory.getObject();}
}
- 读写mapper接口以及对应映射文件.xml
- RPeopleMapper
package com.vinjcent.mapper.read;import com.vinjcent.pojo.People;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface RPeopleMapper {List<People> list();}
<?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.vinjcent.mapper.read.RPeopleMapper"><select id="list" resultType="People">select * from `people`</select>
</mapper>
- WPeopleMapper
package com.vinjcent.mapper.write;import com.vinjcent.pojo.People;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface WPeopleMapper {boolean save(People people);}
<?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.vinjcent.mapper.write.WPeopleMapper"><insert id="save">insert into `people`(name)values (#{name});</insert></mapper>
- Service层
- PeopleServiceImpl
package com.vinjcent.service.impl;import com.vinjcent.mapper.read.RPeopleMapper;
import com.vinjcent.mapper.write.WPeopleMapper;
import com.vinjcent.pojo.People;
import com.vinjcent.service.PeopleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class PeopleServiceImpl implements PeopleService {private final WPeopleMapper wPeopleMapper;private final RPeopleMapper rPeopleMapper;@Autowiredpublic PeopleController(WPeopleMapper wPeopleMapper, RPeopleMapper rPeopleMapper) {this.wPeopleMapper = wPeopleMapper;this.rPeopleMapper = rPeopleMapper;}// 读@GetMapping("/list")public List<People> getAllPeople() {return rPeopleMapper.list();}// 写@GetMapping("/insert")public String addPeople() {wPeopleMapper.save(new People("vinjcent"));return "添加成功";}
}
- 测试接口
- PeopleController
package com.vinjcent.controller;import com.vinjcent.mapper.read.RPeopleMapper;
import com.vinjcent.mapper.write.WPeopleMapper;
import com.vinjcent.pojo.People;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("people")
public class PeopleController {private final PeopleService peopleService;@Autowiredpublic PeopleController(PeopleService peopleService) {this.peopleService = peopleService;}@GetMapping("/list")public List<People> getAllPeople() {return peopleService.list();}@GetMapping("/insert")public String addPeople() {peopleService.save(new People("vinjcent"));return "添加成功";}}
- 运行并测试接口
下一篇文章《SpringBoot实现多数据源(五)【多数据源事务控制】》