相关推荐recommended
SpringBoot整合Mybatis-Plus、Druid配置多数据源
作者:mmseoamin日期:2023-12-25

目录

1.初始化项目

1.1.初始化工程

1.2.添加依赖

1.3.配置yml文件

1.4.Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹

1.5.配置使用数据源

1.5.1.注解方式

1.5.2.基于AOP手动实现多数据源原生的方式

2.结果展示


Mybatis-Plus:简介 | MyBatis-Plus (baomidou.com)

1.初始化项目

在正式开始之前,先初始化一个springboot项目

1.1.初始化工程

创建一个空的 Spring Boot 工程

可以使用 Spring Initializer (opens new window)快速初始化一个 Spring Boot 工程

1.2.添加依赖

Maven中央仓库

在pom.xml中添加Druid和JDBC驱动的依赖

        
        
            com.alibaba
            druid-spring-boot-starter
            1.2.6
               
        
        
            com.baomidou
            dynamic-datasource-spring-boot-starter
            3.1.0
        
       
        
            com.oracle.database.jdbc
            ojdbc8
            runtime
        
       
        
            mysql
            mysql-connector-java
            5.1.4
            runtime
        
        
        
            org.springframework.boot
            spring-boot-devtools
            true
            true
        
        
        
            cn.hutool
            hutool-all
            5.7.18
        
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.3.2
        

1.3.配置yml文件

1)application.yml:配置数据源和Druid监控

# 配置多数据源  使用:如果需要调用不用的数据库源,只需要再impl里面使用注释@DS("数据源名称")即可
#  Tomcat  服务配置server:server:server:
server:
  port: 8085
spring:
  devtools:
    restart:
      enabled: true
      additional-paths: src/main/java
      exclude: resources/*
  profiles:
    active: pro
  datasource:
    druid:
      # 下面为连接池的补充设置,应用到上面所有数据源中
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      # 配置获取连接等待超时的时间
      max-wait: 60000
      # 每60秒运行一次空闲连接回收器
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 300000
      # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
      test-while-idle: true
      # 建议配置为false。获取连接时执行validationQuery检测连接是否有效,这个配置会降低性能。
      test-on-borrow: false
      # 建议配置为false。获取连接时执行validationQuery检测连接是否有效,这个配置会降低性能。
      test-on-return: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      pool-prepared-statements: true
      # 验证连接是否可用,使用的SQL语句
      validation-query: SELECT 1
      #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall用于防火墙
      max-pool-prepared-statement-per-connection-size: 20
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 合并多个DruidDataSource的监控数据
      use-global-data-source-stat: true
      # 监控过滤器  可视化页面地址:  http://localhost:8085/druid/login.html
      webStatFilter:
        #  是否开启监控
        enabled: true
      # 提供监控信息展示的html页面;提供监控信息的JSON API
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        #  监控路径
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: admin
        login-password: admin
      # 慢sql记录
      filter:
        stat:
          enabled: true # 开启DruidDataSource状态监控
          log-slow-sql: true # 开启慢SQL记录功能,启用后如果遇到执行很慢的 SQL,便会输出到日志中,
          slow-sql-millis: 5000  # 默认3000毫秒,这里超过5s,就是慢,记录到日志
          merge-sql: true
        # 防御SQL注入
        wall:
          config:
            multi-statement-allow: true
  # 自动设置json返回格式
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
# mybatis-plus相关配置
mybatis-plus:
  configuration:
    #开启sql日志
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # 解决oracle更新数据为null时无法转换报错,mysql不会出现此情况
    jdbc-type-for-null: 'null'
  #实体类所在包
  type-aliases-package: com.batchUtil.model
  # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
# 设置日志级别
logging:
  level:
    root: INFO # INFO级别以及以上级别的日志输出到控制台上
    #com.example.demo.dao: debug,可以控制单个包下日志级别
    # 设置logback.xml位置,如果logback不在resources或者不是默认文件名
    # config: classpath:log/logback.xml

2)application-pro.yml:配置多数据源

#mysql和阿里druid配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    dynamic:
      primary: jc-mysqldb #设置默认的数据源或者数据源组
      strict: false
      datasource:
        zw-mysqldb:
        # driver-class需要注意mysql驱动的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://192.168.6.13:3306/500140?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull
          username: root
          password: 123456
        jc-mysqldb:
          driver-class-name: com.mysql.jdbc.Driver
          #捷成数据中心
          url: jdbc:mysql://192.168.5.15:3306/dc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
          username: duizhang_dyt
          password: abc#123#321#cba

1.4.Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹

@MapperScan(value = "com.police.violation.mapper")

1.5.配置使用数据源

数据源的使用有两种方式,一种是注解,一种是切面,两种方式各有优势。

总结:

        注解:每一个方法或者类上需要自己去添加注解,一两个方法或者mapper类还好,要是几十个那就麻烦了,如果更换个数据源,一个一个去修改岂不是很麻烦,这种硬编码方式一般来说是不推荐的,解决办法两种:第一种,自定义注解,实现某些包下自动注入,不需要再加@DS注解,这个和写配置类大同小异;第二种:yml文件配置数据源名称,使用${**}引用的方式命名数据源名称,自定义数据源名称常量,实现更换数据源无需再去 修改@DS注解的内容。

    配置类:推荐使用,实际项目开发中,不同的功能模块分包不同,使用数据源也可能不一样,通过配置类指定Mapper文件的位置,不同包使用不同数据源,新增功能时,直接在原来包下新增对应功能代码即可,无需配置,可以直接使用。这种也更符合我们实际的使用场景。

1.5.1.注解方式

这个方式比较适用用单体项目,应用场景不复杂,没几个mapper文件

@DS注解说明:

1.注解在方法上、类上、接口、枚举,同时存在就近原则,方法上注解优先于类上注解;

2.不使用@DS注解,默认主数据源;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.batchUtil.model.MacConnect;
import java.util.List;
/**
 * @author Administrator
 */
@DS("zw-mysqldb")
public interface MacConnectMapper {
    /**
     * 根据编码获取车站数据库连接信息
     *
     * @return
     */
    MacConnect selectByMacId(String macId);
    List selectStationMac();
}

1.5.2.基于AOP手动实现多数据源原生的方式

        这种方式比较适合用于大项目,统一规范管理,既是炫技,也符合实际情况,几个数据源就有几个配置类。

1)maven依赖,依赖和前边一样,在这基础上增加切面包

        
        
            org.springframework.boot
            spring-boot-starter-aop
        

2)配置文件:和前边一样配置

注意:Spring Boot 2.X 版本不再支持配置继承,多数据源的话每个数据源的所有配置都需要单独配置,否则配置不会生效;

3)多数据源名称类

主数据源配置类:

/**   
 * 类名称:d   
 * 类描述:   
 * 创建人:Administrator
 * 创建时间:2020年4月1日 下午4:45:12   
 * 修改人:Administrator
 * 修改时间:2020年4月1日 下午4:45:12   
 * 修改备注:   
 * @version       
 */
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
import javax.sql.DataSource;
 
@Configuration
//配置mapper路径
@MapperScan(basePackages = "com.ykx.transinfo.mapper", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSourceConfig1 {
 
    // 将这个对象放入Spring容器中
    @Bean(name = "test1DataSource")
    // 表示这个数据源是默认数据源
    @Primary
    // 读取application.properties中的配置参数映射成为一个对象
    // prefix表示参数的前缀
    @ConfigurationProperties(prefix = "spring.datasource.one")
    public DataSource getDateSource1()
    {
        return DataSourceBuilder.create().build();
    }
 
    @Bean(name = "test1SqlSessionFactory")
    // 表示这个数据源是默认数据源
    @Primary
    // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1DataSource") DataSource datasource)
            throws Exception
    {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/one/*.xml"));
        return bean.getObject();
    }
 
    @Bean("test1SqlSessionTemplate")
    // 表示这个数据源是默认数据源
    @Primary
    public SqlSessionTemplate test1SqlSessionTemplate(
            @Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionFactory)
    {
        return new SqlSessionTemplate(sessionFactory);
    }
}

次数据源配置类:

/**   
 * 类名称:s   
 * 类描述:   
 * 创建人:Administrator
 * 创建时间:2020年4月1日 下午4:45:38   
 * 修改人:Administrator
 * 修改时间:2020年4月1日 下午4:45:38   
 * 修改备注:   
 * @version       
 */
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
 
@Configuration
@MapperScan(basePackages = "com.ykx.transinfo.mysqlmapper", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSourceConfig2 {
    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.two")
    public DataSource getDateSource2()
    {
        return DataSourceBuilder.create().build();
    }
 
    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2DataSource") DataSource datasource)
            throws Exception
    {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/two/*.xml"));
        return bean.getObject();
    }
 
    @Bean("test2SqlSessionTemplate")
    public SqlSessionTemplate test2SqlSessionTemplate(
            @Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionFactory)
    {
        return new SqlSessionTemplate(sessionFactory);
    }
}

4).项目结构

注意:重点是mapper结构和配置类里的路径对应

SpringBoot整合Mybatis-Plus、Druid配置多数据源,第1张

5).启动类——启动类需要取消加载数据源自动配置 

package com.ykx.transinfo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
// @MapperScan 和dao层@Mapper 二选一
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableScheduling
@MapperScan("com.ykx.transinfo.mapper,com.ykx.transinfo.mysqlmapper")
public class DataServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(DataServerApplication.class, args);
	}
}

后续的mapper、service写法和平时没什么不同

数据源可能会碰到事务问题:https://blog.csdn.net/u011974797/article/details/130154340

2.结果展示

服务启动会打印日志:

com.alibaba.druid.pool.DruidDataSource   : {dataSource-1,first} inited

com.alibaba.druid.pool.DruidDataSource   : {dataSource-2,second} inited

druid监控页面:

SpringBoot整合Mybatis-Plus、Druid配置多数据源,第2张

SpringBoot整合Mybatis-Plus、Druid配置多数据源,第3张

参考资料:https://blog.csdn.net/u011974797/article/details/130109195