1. 环境准备

1.1 数据库相关

以 mysql 为例进行演示说明,因为需要多数据源,一个最简单的 case 就是一个物理库上多个逻辑库,本文是基于本机的 mysql 进行操作

创建数据库teststory,两个库下都存在一个表money (同名同结构表,但是数据不同哦)

  1. CREATE TABLE `money` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
  4. `money` int(26) NOT NULL DEFAULT '0' COMMENT '钱',
  5. `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  6. `create_at` date NOT NULL COMMENT '创建时间',
  7. `update_at` date NOT NULL COMMENT '更新时间',
  8. PRIMARY KEY (`id`),
  9. KEY `name` (`name`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

4. Mybatis-plus多数据源配置 - 图1

1.2 项目环境

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

下面是核心的pom.xml

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1</version>
    </dependency>
</dependencies>

配置文件信息application.yml,请注意下面的写法格式,如有疑问可以参考官方教程

spring:
  datasource:
    dynamic:
      primary: story #设置默认的数据源或者数据源组,默认值即为master
      strict: false  #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
      datasource:
        story:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password:
        test:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password:

2. 项目演示

2.1 实体类

mybatis-plus 可以借助插件实现自动生成相应的代码,我们这里简单自主实现测试 demo,因为两个数据库中表结构完全一致,所以只需要一个 Entity

@Data
@Accessors(chain = true)
@TableName(value = "money")
public class MoneyPo {
    /**
     * 指定自增策略
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String name;

    private Long money;

    @TableField("is_deleted")
    private Integer isDeleted;

    @TableField(value = "create_at")
    private Date createAt;

    @TableField(value = "update_at")
    private Date updateAt;
}

2.2 Mapper 接口

数据库操作定义接口MoneyMapper

public interface MoneyMapper extends BaseMapper<MoneyPo> {
}

对应的 xml 文件resources/mapper/money-mapper.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="com.ruangh.mybatisplus.datasouce.mybatisplusdatasouce.mapper.MoneyMapper">
</mapper>

2.3 Service 接口与实现

因为两张表,所以我们可以定义一个接口,两个不同的实现

public interface MoneyService extends IService<MoneyPo> {
}

@Service
@DS("story")
public class StoryMoneyServiceImpl extends ServiceImpl<MoneyMapper, MoneyPo> implements MoneyService {
}

@Service
@DS("test")
public class TestMoneyServiceImpl extends ServiceImpl<MoneyMapper, MoneyPo> implements MoneyService {
}

请注意上面 Service 的注解@DS,value 为前面数据源配置文件中的 key(spring.datasource.dynamic.datasource下面的story + test)

这个注解可以放在类上也可以放在方法上,方法上的优先级 > 类,所以上面的两个 Service 实现可以改成一个

@Service
public class MoneyServiceImpl extends ServiceImpl<MoneyMapper, MoneyPo> implements MoneyService {

    @DS("story")
    public List<MoneyPo> findByStoryIds(Collection<Long> ids) {
        return baseMapper.selectBatchIds(ids);
    }

    @DS("test")
    public List<MoneyPo> findByTestIds(Collection<Long> ids) {
        return baseMapper.selectBatchIds(ids);
    }
}

2.4 测试

为简单起见,直接在启动类中添加写上测试代码

![010](E:\ruanghDoc\LearningClip\学习笔记\新能康-复盘\210904-mybatis-plus注解\010.png)@SpringBootApplication
@MapperScan("com.ruangh.mybatisplus.datasouce.mybatisplusdatasouce.mapper")
public class MybatisplusDatasouceApplication {

    public MybatisplusDatasouceApplication(TestMoneyServiceImpl testMoneyService, StoryMoneyServiceImpl storyMoneyService) {
        List<MoneyPo> moneyPoList = testMoneyService.listByIds(Arrays.asList(1, 1000));
        System.out.println(moneyPoList);
        System.out.println("--------------");

        moneyPoList = storyMoneyService.listByIds(Arrays.asList(1, 1000));
        System.out.println(moneyPoList);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

4. Mybatis-plus多数据源配置 - 图2

3. 遇到的坑

4. Mybatis-plus多数据源配置 - 图3

可以看到启动过程中我们配置的多数据库源Start completed.之后遇到异常之后又被shutdown了。

因为引入了多个Mybatis 的jar包引起的,检查bom.xml文件是否引入了mybatis和mybatis-plus两个依赖,如果是去掉mybatis即可。