Spring Boot多数据源配置

本文详细介绍了如何在Spring Boot项目中配置多数据源,包括在pom.xml中添加dynamic-datasource-spring-boot-starter依赖,设置application.yml中的数据库配置,利用@DS切换数据源,以及相关文件的配置,最终实现不同数据库间的数据访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

沿用上一篇入门的项目结构:
Spring Boot 入门案例

新建一个数据库名为test2,test2中下的user表的数据:
在这里插入图片描述

相比上个入门案例项目整体结构改为(添加了取User用户表的功能)
在这里插入图片描述

1、pom.xml中添加dynamic-datasource-spring-boot-starter

如果你的maven显示找不到依赖项。可以去阿里云仓库搜索地址https://maven.aliyun.com/mvn/search
搜索你要找的依赖,下载下来放到你本地的jar路径。

        <!-- https://developer.aliyun.com/mvn/search -->
        <dependency>
            <groupId>cn.humingfeng</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

2、在application.yml 中配置多个数据源

注:我这里用的都是MySQL的数据库。如果你是混用数据,需要在pom.xml中配置其他数据库的相关的数据库驱动依赖就好了。

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
          username: root
          password: 123456
        slave:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test2?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
          username: root
          password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml

server:
  port: 8090

以上会配置一个默认库master数据源,一个组slave。
当然你也可以配置多个子库slave_1,slave_2,…等等

3、使用 @DS 切换数据源

@DS 可以注解在方法上和类上,同时存在的话,方法注解优先级高于在类上注解。
如果没有@DS则为默认数据源

@DS注解在service实现或mapper接口方法上,但不建议同时在service和mapper都加上这个注解。

userMapper.java:(mapper加service不加)

package com.example.demo.mapper;

import cn.humingfeng.dynamic.datasource.annotation.DS;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

//可在mapper中加@DS,则service无需加
@Mapper
@DS("slave")
public interface UserMapper {

    List<User> findAll();
}

SutdentService.java:(service加,mapper不加)

package com.example.demo.service;

import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

//在类定义处注解,则整个类都默认采用master数据库
//如需在某个方法中更改数据中,则在方法前加@DS("dbname")修改即可
@Service
@DS("master")
public class UserService {

    @Autowired
    UserMapper userMapper;

    public List<User> findAll(){
        return userMapper.findAll();
    }
}

4、其他文件配置

其他如实体类,mapper.xml文件,controller则无需变动
userMapper.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.example.demo.mapper.UserMapper">
    <select id="findAll" resultType="com.example.demo.entity.User">
        select * from user;
    </select>
</mapper>

userService.java:

package com.example.demo.service;

import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    public List<User> findAll(){
        return userMapper.findAll();
    }
}

userController.java:

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping("user")
    public List<User> findAll(){
        return userService.findAll();
    }
}

运行结果如图:
在这里插入图片描述
在这里插入图片描述
可以看到成功实现在不同的数据库中取数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值