如果文章中代码不便于阅读,请使用电脑查看或点击阅读原文。

多数据源即动态数据源,随着项目开发逐渐扩大,单个数据源、单一数据源已经无法满足需求项目的支撑需求。

或是单一数据库无法承载大数据量的访问,需使用多个数据库进行数据的读写分离;

或是某些特殊业务需求,需操作不同的数据库。

Spring Boot整合MyBatis连接数据库 文章中,展示了Spring Boot整合MyBatis连接数据库的方法,基于此,Spring Boot 整合MyBatis 配置多数据源。

0 开发环境

  • JDK:1.8

  • Spring Boot:2.1.1.RELEASE

  • MySQL:5.7.13

1 引入依赖

<dependency>  <groupId>org.mybatis.spring.boot</groupId>  <artifactId>mybatis-spring-boot-starter</artifactId>  <version>1.3.2</version></dependency><dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>8.0.28</version>  <scope>runtime</scope></dependency><!--lombok--><dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  <version>1.18.30</version>  <scope>provided</scope></dependency>

2 引入数据源

server:  port: 8090spring:  datasource:   master:    jdbc-url: jdbc:mysql://127.0.0.1:3306/test_master?characterEncoding=utf8&serverTimezone=GMT%2B8    username: root    password: root    driver-class-name: com.mysql.cj.jdbc.Driver   slave:    jdbc-url: jdbc:mysql://127.0.0.1:3306/test_slave?characterEncoding=utf8&serverTimezone=GMT%2B8    username: root    password: root    driver-class-name: com.mysql.cj.jdbc.Driver#mybatis:  mapper-locations: classpath:mapper/**/*.xml  type-aliases-package: cn.wbnull.springbootdemo.entity

该配置方式下,需要操作的两个数据库的Mapper需放置在不同文件夹下,如下图所示:

3 配置master库的源连接

@Configuration@MapperScan(basePackages = "cn.wbnull.springbootdemo.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")public class MasterDataSourceConfig {  @Primary  @Bean("masterDataSource")  @ConfigurationProperties(prefix = "spring.datasource.master")  public DataSource masterDataSource() {    return DataSourceBuilder.create().build();   }  @Primary  @Bean("masterDataSourceTransactionManager")  public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {    return new DataSourceTransactionManager(dataSource);   }  @Primary  @Bean("masterSqlSessionFactory")  public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {    SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();    sqlSessionFactory.setDataSource(dataSource);    Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml");    sqlSessionFactory.setMapperLocations(resources);    return sqlSessionFactory.getObject();   }}

4 配置slave库的源连接

@Configuration@MapperScan(basePackages = "cn.wbnull.springbootdemo.mapper.slave", sqlSessionFactoryRef = "slaveSqlSessionFactory")public class SlaveDataSourceConfig {  @Bean("slaveDataSource")  @ConfigurationProperties(prefix = "spring.datasource.slave")  public DataSource slaveDataSource() {    return DataSourceBuilder.create().build();   }  @Bean("slaveDataSourceTransactionManager")  public DataSourceTransactionManager slaveDataSourceTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {    return new DataSourceTransactionManager(dataSource);   }  @Bean("slaveSqlSessionFactory")  public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {    SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();    sqlSessionFactory.setDataSource(dataSource);    Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml");    sqlSessionFactory.setMapperLocations(resources);    return sqlSessionFactory.getObject();   }}

5 测试

5.1 新建数据库表

CREATE SCHEMA `test_master` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `test_master`.`user` (  `id` INT NOT NULL AUTO_INCREMENT,  `name` VARCHAR(45) NOT NULL,  PRIMARY KEY (`id`));INSERT INTO `test_master`.`user` (`name`) VALUES ('张三');INSERT INTO `test_master`.`user` (`name`) VALUES ('李四');INSERT INTO `test_master`.`user` (`name`) VALUES ('王五');INSERT INTO `test_master`.`user` (`name`) VALUES ('周六');CREATE SCHEMA `test_slave` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `test_slave`.`user_info` (  `id` INT NOT NULL AUTO_INCREMENT,  `userCode` VARCHAR(20) NOT NULL,  `userName` VARCHAR(45) NULL,  `password` VARCHAR(40) NOT NULL,  PRIMARY KEY (`id`)); INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('1', 'zhangsan', '张三三', 'zhangsan');INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('2', 'lisi', '李四四', 'lisi');INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('3', 'wangwu', '王五五', 'wangwu');INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('4', 'zhouliu', '周六六', 'zhouliu');

5.2 新建实体类

@Datapublic class User {  private int id;  private String name;}
@Datapublic class UserInfo {  private Integer id;  private String userCode;  private String userName;  private String password;}

5.3 新建Mapper

@Repositorypublic interface UserMapper {  void add(@Param("user") User user);  List<User> query();  void update(@Param("id") int id, @Param("name") String name);  void delete(@Param("id") int id);}
@Repositorypublic interface UserInfoMapper {  List<User> query();}

5.4 新建映射文件

<?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="cn.wbnull.springbootdemo.mapper.master.UserMapper">  <!-- 通用查询映射结果 -->  <resultMap id="BaseResultMap" type="cn.wbnull.springbootdemo.entity.User">    <id column="id" property="id"/>    <result column="name" property="name"/>  </resultMap>  <!-- 通用查询结果列 -->  <sql id="Base_Column_List">     id, name  </sql>  <insert id="add">     INSERT INTO user(<include refid="Base_Column_List"/>)     VALUES     (     #{user.id},     #{user.name}     )  </insert>  <select id="query" resultMap="BaseResultMap">     SELECT * FROM user  </select>  <update id="update">     UPDATE user SET name = '${name}' WHERE id = '${id}'  </update>  <update id="delete">     DELETE FROM user where id = '${id}'  </update></mapper>
<?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="cn.wbnull.springbootdemo.mapper.slave.UserInfoMapper">  <!-- 通用查询映射结果 -->  <resultMap id="BaseResultMap" type="cn.wbnull.springbootdemo.entity.UserInfo">    <id column="id" property="id" />    <result column="userCode" property="userCode" />    <result column="userName" property="userName" />    <result column="password" property="password" />  </resultMap>  <!-- 通用查询结果列 -->  <sql id="Base_Column_List">     id, userCode, userName, password  </sql>  <select id="query" resultMap="BaseResultMap">     SELECT * FROM user_info  </select></mapper>

5.5 新建Service

@Servicepublic class UserService {  @Autowired  private UserMapper userMapper;  public String add(String name) {    User user = new User();    user.setName(name);    userMapper.add(user);    return "操作成功";   }  public List<User> query() {    return userMapper.query();   }  public String update(int id, String name) {    userMapper.update(id, name);    return "操作成功";   }  public String delete(int id) {    userMapper.delete(id);    return "操作成功";   }}
@Servicepublic class UserInfoService {  @Autowired  private UserInfoMapper userInfoMapper;  public List<User> query() {    return userInfoMapper.query();   }}

5.6 新建Controller

@RestController@RequestMapping("user")public class UserController {  @Autowired  public UserService userService;  @PostMapping(value = "add")  public String add(@RequestParam(value = "name") String name) {    return userService.add(name);   }  @PostMapping(value = "query")  public List<User> query() {    return userService.query();   }  @PostMapping(value = "update")  public String update(@RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {    return userService.update(id, name);   }  @PostMapping(value = "delete")  public String delete(@RequestParam(value = "id") int id) {    return userService.delete(id);   }}
@Controller@RequestMapping("userInfo")public class UserInfoController {  @Autowired  public UserInfoService userInfoService;  @PostMapping(value = "query")  public List<User> query() {    return userInfoService.query();   }}

5.7 测试

使用Postman测试,输出结果如下

5.8.1 master select

5.8.2 master insert

数据库中插入成功

5.8.3 master update

数据库中更新成功

5.8.4 master delete

数据库中删除成功

5.8.5 slave select

截至这里,Spring Boot已经成功整合MyBatis多数据源,并连接上了数据库,且测试正常。


CSDN:https://blog.csdn.net/dkbnull/article/details/136433910

知乎:https://zhuanlan.zhihu.com/p/685038746


本篇文章来源于微信公众号: 程序员null



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-03-03