目录
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结构和配置类里的路径对应
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监控页面:
参考资料:https://blog.csdn.net/u011974797/article/details/130109195