Springboot配置动态数据源

459 阅读1分钟

环境说明:

springboot版本:2.7.1

jdk版本:1.8

本次以mysql和pg为例:

1. pom文件引入jar包

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <!--动态数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.0</version>
        </dependency>
        <!--pg-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.22</version>
        </dependency
        <!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2. 修改yml配置文件

spring:
  datasource:
    dynamic:
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
          username: admin
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        gaussdb:
          username: admin
          password: 123456
          url: jdbc:postgresql://localhost:5308/db2
          driver-class-name: org.postgresql.Driver
      mp-enabled: true

3. 样例代码

实体对象

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@Data
@TableName("t_user")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User implements Serializable {
    private static final long serialVersionUID = -1923859222295750469L;

    /**
     * 主键
     */
    @TableId(type = IdType.ID_WORKER)
    private Long id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;
}

services

import com.baomidou.mybatisplus.extension.service.IService;
import com.iuv.entity.User;


public interface UserService extends IService<User> {

    /**
     * 添加 User
     *
     * @param user 用户
     */
    void addUser(User user);
}
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.iuv.dao.system.mapper.UserMapper;
import com.iuv.entity.User;
import com.iuv.service.tool.UserService;
import org.springframework.stereotype.Service;

@Service
@DS("gaussdb")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    /**
     * 类上 {@code @DS("gaussdb")} 代表默认从库,在方法上写 {@code @DS("master")} 代表默认主库
     *
     * @param user 用户
     */
    @DS("master")
    @Override
    public void addUser(User user) {
        baseMapper.insert(user);
    }
}

mapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.iuv.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

测试用例

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.iuv.entity.User;
import com.iuv.service.tool.UserService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceImplTest {
    @Autowired
    private UserService userService;

    /**
     * 2库同时添加
     */
    @Test
    public void addUser() {
        User userMaster = User.builder().name("mysql添加").age(21).build();
        userService.addUser(userMaster);

        User userSlave = User.builder().name("pg库添加").age(31).build();
        userService.save(userSlave);
    }

    /**
     * pg库查询
     */
    @Test
    public void testListUser() {
        List<User> list = userService.list(new QueryWrapper<>());
        log.info("【list】= {}", JSONUtil.toJsonStr(list));
    }
}

4. 执行测试结果

启动服务后可以看到打印日志,默认数据源为第一个配置的master,需要制定数据源使用@DS("gaussdb")即可。

2023-06-10 10:44:07.241  INFO 11688 --- [           main] com.zaxxer.hikari.HikariDataSource       : master - Starting...
2023-06-10 10:44:08.080  INFO 11688 --- [           main] com.zaxxer.hikari.HikariDataSource       : master - Start completed.
2023-06-10 10:44:08.081  INFO 11688 --- [           main] com.zaxxer.hikari.HikariDataSource       : gaussdb - Starting...
2023-06-10 10:44:09.812  INFO 11688 --- [           main] com.zaxxer.hikari.HikariDataSource       : gaussdb - Start completed.
2023-06-10 10:44:09.814  INFO 11688 --- [           main] c.b.d.d.DynamicRoutingDataSource         : 初始共加载 2 个数据源
2023-06-10 10:44:09.814  INFO 11688 --- [           main] c.b.d.d.DynamicRoutingDataSource         : 动态数据源-加载 master 成功
2023-06-10 10:44:09.815  INFO 11688 --- [           main] c.b.d.d.DynamicRoutingDataSource         : 动态数据源-加载 gaussdb 成功
2023-06-10 10:44:09.815  INFO 11688 --- [           main] c.b.d.d.DynamicRoutingDataSource         : 当前的默认数据源是单数据源,数据源名为 master

查询结果

2023-06-10 10:46:36.195  INFO 20500 --- [           main] c.c.c.d.server.util.UserServiceImplTest  : 【list】= [{"name":"pg库添加","id":1667724405532794881,"age":31}]

文章出处:博客地址

本文由博客一文多发平台 OpenWrite 发布!