目录
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)
在正式开始之前,先初始化一个springboot项目
创建一个空的 Spring Boot 工程
可以使用 Spring Initializer (opens new window)快速初始化一个 Spring Boot 工程
Maven中央仓库
在pom.xml中添加Druid和JDBC驱动的依赖
com.alibaba druid-spring-boot-starter1.2.6 com.baomidou dynamic-datasource-spring-boot-starter3.1.0 com.oracle.database.jdbc ojdbc8runtime mysql mysql-connector-java5.1.4 runtime org.springframework.boot spring-boot-devtoolstrue true cn.hutool hutool-all5.7.18 com.baomidou mybatis-plus-boot-starter3.3.2
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
@MapperScan(value = "com.police.violation.mapper")
数据源的使用有两种方式,一种是注解,一种是切面,两种方式各有优势。
总结:
注解:每一个方法或者类上需要自己去添加注解,一两个方法或者mapper类还好,要是几十个那就麻烦了,如果更换个数据源,一个一个去修改岂不是很麻烦,这种硬编码方式一般来说是不推荐的,解决办法两种:第一种,自定义注解,实现某些包下自动注入,不需要再加@DS注解,这个和写配置类大同小异;第二种:yml文件配置数据源名称,使用${**}引用的方式命名数据源名称,自定义数据源名称常量,实现更换数据源无需再去 修改@DS注解的内容。
配置类:推荐使用,实际项目开发中,不同的功能模块分包不同,使用数据源也可能不一样,通过配置类指定Mapper文件的位置,不同包使用不同数据源,新增功能时,直接在原来包下新增对应功能代码即可,无需配置,可以直接使用。这种也更符合我们实际的使用场景。
这个方式比较适用用单体项目,应用场景不复杂,没几个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); ListselectStationMac(); }
这种方式比较适合用于大项目,统一规范管理,既是炫技,也符合实际情况,几个数据源就有几个配置类。
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结构和配置类里的路径对应
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
服务启动会打印日志:
com.alibaba.druid.pool.DruidDataSource : {dataSource-1,first} inited
com.alibaba.druid.pool.DruidDataSource : {dataSource-2,second} inited
druid监控页面:
参考资料:https://blog.csdn.net/u011974797/article/details/130109195