目录

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

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: