springboot+mybatisplus多数据源配置和使用(一)

本文详细介绍了在SpringBoot项目中如何配置和使用多数据源,包括静态和动态多数据源的设置方法。通过具体步骤和代码示例,展示了如何在application.yml中配置不同的数据源,以及如何创建和使用相应的数据源配置类和mapper接口。

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

好记性不如烂笔头,把自己做过的记录一下。一般多数据源的配置方式有两种

  • 静态的多数据源:每个数据源配置一套mapper
  • 动态的多数据源:多个数据源通用一套mapper

静态多数据源

  1. application.yml配置
    (这里的demo.datasource.master、demo.datasource.slave是自定义的配置,可以修改)
#多数据源配置
demo:
   datasource:
     #主数据库 master库
     master:
        jdbc-url: jdbc:mysql://192.168.75.99:3307/database1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
        username: master
        password: pass
     # 从库数据源 slave库
     slave:
        jdbc-url: jdbc:mysql://192.168.75.99:3307/database2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
        username: slave
        password: pass
  1. 新建两个数据源配置
    MasterDataSourceConfig、SlaveDataSourceConfig
@Configuration
@MapperScan(basePackages = "com.xinhuo.demo.mapper.master",sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
    @Primary
    @Bean(name = "masterDataSource")
    @ConfigurationProperties("demo.datasource.master")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);

        return sessionFactoryBean.getObject();
    }
}
@Configuration
@MapperScan(basePackages = "com.xinhuo.demo.mapper.slave",sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties("demo.datasource.slave")
    public DataSource slaveDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);

        return sessionFactoryBean.getObject();
    }
}

在这里插入图片描述

  1. 新建两套mapper,一个数据源使用一套mapper
    在这里插入图片描述
public interface StudentMapper extends BaseMapper<Student> {
}

public interface Teacher extends BaseMapper<Teacher> {
}

  1. main方法使用使用exclude
    禁用默认加载的application.properties单数据源配置
    以及关闭mybatisPlus的一些自动注入
/**
 * 使用exclude = {DataSourceAutoConfiguration.class}
 * 禁用springboot默认加载的application.properties单数据源配置
 * 关闭springBoot关于mybatisPlus的一些自动注入
 */
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisPlusAutoConfiguration.class})
@SpringBootApplication
public class SpringDatasourceDemoApplication {

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

}
  1. 验证多数据源的使用
@RestController
@RequestMapping("/base")
public class BaseController {
    @Autowired
    private StudentService studentService;
    @Autowired
    private TeacherService teacherService;

    @PostMapping("/addStudentAndTeacher")
    public ResultMsg addStudentAndTeacher(String studentName,String teacherName){
        //新增一个学生
        Student student = new Student();
        student.setName(studentName);
        studentService.save(student);
        //新增一个教师
        Teacher teacher = new Teacher();
        teacher.setName(teacherName);
        teacherService.save(teacher);
        return ResultMsg.ok();
    }

    @RequestMapping("/find")
    public ResultMsg find(){
        //查询student表所有的学生
        List<Student> studentList = studentService.list();
        //查询teacher表所有的教师
        List<Teacher> teacherList = teacherService.list();
        JSONObject data = new JSONObject();
        data.put("studentList",studentList);
        data.put("teacherList",teacherList);
        ResultMsg resultMsg = new ResultMsg();
        resultMsg.setData(data);
        return resultMsg;
    }
}

6.用postman测试,新增不同数据源的学生和教师表记录,然后查询出来在这里插入图片描述
在这里插入图片描述

可以看到静态的多数据源就配置成功了

动态的多数据源
动态的多数据源利用aop在service层或者dao层动态切换当前线程的数据源

springboot动态多数据源配置和使用(二)
springboot动态多数据源配置和使用(从数据库读取数据源配置)(三)

注:

  • 多个数据库的application.yml文件,数据库连接用jdbcUrl或者jdbc-url,单个数据源可以用url
  • SqlSessionFactoryBean需要改成MybatisSqlSessionFactoryBean,否则baseMapper自带的方法不能访问,但能访问*Mapper.xml中定义的方法或者接口注解的自定义sql的方法

项目源码:https://gitee.com/zhangxinlin/spring-datasource-demo

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值