springboot项目配置多数据库连接

2022年6月5日13:47:41

前言

之前编写了一篇maven项目创建多数据库的方法,现在对springboot更了解之后,将把springboot项目配置多数据库的方法贴出来。
从项目开始创建到调用数据库依次写出来。

PS:本项目使用的是IDEA进行创建

创建springboot项目

1.点击创建新maven项目,然后下一步
springboot项目配置多数据库连接

2.输入项目名称,创建项目
springboot项目配置多数据库连接

3.创建完成之后,初始默认结构如下:
springboot项目配置多数据库连接
springboot项目配置多数据库连接

需要创建的文件夹结构分类

以下截图为进行不同功能分类进行创建的文件夹
springboot项目配置多数据库连接

文件说明:

java文件都应该在java文件夹下
资源文件都应该放在resources下
bean: 存放实体对象
controller:存放控制层
service: 存放service层
db: 多数据库配置
mapper:数据库连接接口
tools:工具类
resources/mapper数据库的增删改查文件

以下为为配置多数据库应创建的文件,文件截图和说明如下:
springboot项目配置多数据库连接

java文件都应该在java文件夹下
资源文件都应该放在resources下
db: db文件夹下的文件为多数据库配置代码
mapper:com.mapper下的文件为编写数据库的增删改查方法
MultipleDataApplication.java:启动类
resources/mapper下的文件数据库的增删改查`语句`文件
其中
resources/mapper下的MyDb1为对应数据库MyDb1的编写数据库语句文件
resources/mapper下的MyDb2为对应数据库MyDb2的编写数据库语句文件
applition.yml:springboot项目配置文件
pom.xml:依赖配置文件

导入pom依赖

初始pom.xml配置文件代码为:
springboot项目配置多数据库连接

要完成多数据库配置,需要至少导入以下依赖:

第一个:springboot依赖
第二个:mybatis
第三个:数据库驱动依赖
第四个: 阿里巴巴数据库连接池

pom.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>multipleDataConnection</artifactId><version>1.0-SNAPSHOT</version><!--    springboot管理配置--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/></parent><dependencies><!-- springboot依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mybatis--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><!-- mysql数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.9</version></dependency></dependencies><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

编写配置xml(yml)

在项目配置信息,需要编写启动端口,数据库连接以及连接池和mybatis的配置信息
具体配置信息如下:

以下为application.yml格式配置文件代码
server:port:9021servlet:context-path: /启动路径#    数据库spring:datasource:MyDb1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://数据库ip:3306/数据库名username: 用户名password: 密码MyDb2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://数据库ip:3306/数据库名username: 用户名password: 密码druid:#最大活跃数maxActive:20#初始化数量initialSize:1#最大连接等待超时时间maxWait:60000#打开PSCache,并且指定每个连接PSCache的大小poolPreparedStatements:truemaxPoolPreparedStatementPerConnectionSize:20#通过connectionProperties属性来打开mergeSql功能;慢SQL记录connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000minIdle:1timeBetweenEvictionRunsMillis:60000minEvictableIdleTimeMillis:300000validationQuery: select 1 from dualvalidationQuery1: select 1# 注意 有的数据库不支持select 1 from dual 在配置处需要修改为下方的select 1testWhileIdle:truetestOnBorrow:falsetestOnReturn:false#配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙filters: stat, wall, log4j# 合并多个DruidDataSource的监控数据use-global-data-source-stat:truemybatis:configuration:map-underscore-to-camel-case:true# 全局的sql执行超时时间(单位s) 当sql执行时间超过1s,就会断开操作了,起到保护数据库服务的作用default-statement-timeout:5# 流式default-fetch-size:100# 配置查询返回最大数量max_row:10000
注意: spring下的datasource,为编写多个数据库的连接信息,ip账号密码等。
其中作为演示,我把两个数据库名称分别标注命名为MyDb1和MyDb2
validationQuery:为验证不同的数据库连接的语句,不同数据库的验证语句不同
不同数据库验证语句如下:
数据库 validationQuery验证语句
hsqldb select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Oracle select 1 from dual
DB2 select 1 from sysibm.sysdummy1
MySql select 1
Microsoft SqlServer select 1
postgresql select version()
ingres select 1
derby select 1
H2 select 1
这个验证连接语句需要根据自己连的数据库进行更改配置语句

编写resource的mapper查询

在resource/mapper里,我创建了两个文件MyDb1Mapper.xmlMyDb2Mapper.xml,用来标识两个不同数据库的连接的文件.
其中MyDb1Mapper.xml文件代码如下(不包括增删改查功能:)

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.mapper.MyDb1.MyDb1Mapper"></mapper>

其中MyDb2Mapper.xml文件代码如下(不包括功能)

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.mapper.MyDb2.MyDb2Mapper"></mapper>
注意:此处`namespace`路径为数据库接口文件路径

编写mapper接口

在com.demo.mapper下有两个文件夹,分别标识不同的数据库接口文件,
其中mapper/MyDb1Mapper.java文件代码如下(不包含功能):

packagecom.mapper.MyDb1;importorg.apache.ibatis.annotations.Mapper;@MapperpublicinterfaceMyDb1Mapper{}

其中mapper/MyDb2Mapper.java文件代码如下(不包含功能):

packagecom.mapper.MyDb2;importorg.apache.ibatis.annotations.Mapper;@MapperpublicinterfaceMyDb2Mapper{}
名称随便命名,自己容易区别就行

编写多数据库配置

如你所见,在上方截图中我编写了四个文件作为数据库配置,如你需要根据它去删除或添加多个数据库,把里面的DbMyDb1ConfigDbMyDb2Config换成你自己的数据库配置即可(根据yml里,你数据库的配置修改)
同时,在DataSourceConfig里增减需要的数据库配置代码,复制修改名称即可
MybatisInterceptor不需要修改。

如果有更多的数据库需要连接进来,只需要在`DataSourceConfig`里添加新数据库的配置代码,复制`DbMyDb1Config``DbMyDb2Config`其中一个文件进行修改DataSourceConfig对应名称配置即可

其中,DataSourceConfig代码如下:

packagecom.db;importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;importjava.sql.SQLException;@ConfigurationpublicclassDataSourceConfig{@Value("${spring.datasource.MyDb1.driver-class-name}")privateStringMyDb1Driver;@Value("${spring.datasource.MyDb1.url}")privateStringMyDb1Url;@Value("${spring.datasource.MyDb1.username}")privateStringMyDb1Username;@Value("${spring.datasource.MyDb1.password}")privateStringMyDb1Password;@Value("${spring.datasource.MyDb2.driver-class-name}")privateStringMyDb2Driver;@Value("${spring.datasource.MyDb2.url}")privateStringMyDb2Url;@Value("${spring.datasource.MyDb2.username}")privateStringMyDb2Username;@Value("${spring.datasource.MyDb2.password}")privateStringMyDb2Password;@Value("${spring.datasource.druid.maxActive}")privateInteger maxActive;@Value("${spring.datasource.druid.initialSize}")privateInteger initialSize;@Value("${spring.datasource.druid.maxWait}")privateInteger maxWait;@Value("${spring.datasource.druid.poolPreparedStatements}")privateboolean poolPreparedStatements;@Value("${spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize}")privateInteger maxPoolPreparedStatementPerConnectionSize;@Value("${spring.datasource.druid.minIdle}")privateInteger minIdle;@Value("${spring.datasource.druid.connectionProperties}")privateString connectionProperties;@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")privateInteger timeBetweenEvictionRunsMillis;@Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")privateInteger minEvictableIdleTimeMillis;@Value("${spring.datasource.druid.validationQuery}")privateString validationQuery;@Value("${spring.datasource.druid.validationQuery1}")privateString validationQuery1;@Value("${spring.datasource.druid.testWhileIdle}")privateboolean testWhileIdle;@Value("${spring.datasource.druid.testOnBorrow}")privateboolean testOnBorrow;@Value("${spring.datasource.druid.testOnReturn}")privateboolean testOnReturn;@Value("${spring.datasource.druid.filters}")privateString filters;@Value("${spring.datasource.druid.use-global-data-source-stat}")privateboolean useGlobalDataSourceStat;@Bean(name="dsMyDb1")@Qualifier("dsMyDb1")publicDataSourcedataSourceMyDb1(){DruidDataSource datasource=newDruidDataSource();
        datasource.setUrl(MyDb1Url);
        datasource.setUsername(MyDb1Username);
        datasource.setPassword(MyDb1Password);
        datasource.setDriverClassName(MyDb1Driver);
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);//        try {//            datasource.setFilters(filters);//        } catch (SQLException e) {//            System.err.println("druid configuration initialization filter: " + e);//        }
        datasource.setConnectionProperties(connectionProperties);
        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);return datasource;}@Bean(name="dsMyDb2")@Qualifier("dsMyDb2")publicDataSourcedataSourceMyDb2(){DruidDataSource datasource=newDruidDataSource();
        datasource.setUrl(MyDb2Url);
        datasource.setUsername(MyDb2Username);
        datasource.setPassword(MyDb2Password);
        datasource.setDriverClassName(MyDb2Driver);
        datasource.setInitialSize(initialSize);
        datasource.setMinIdle(minIdle);
        datasource.setMaxActive(maxActive);
        datasource.setMaxWait(maxWait);
        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        datasource.setValidationQuery(validationQuery);
        datasource.setTestWhileIdle(testWhileIdle);
        datasource.setTestOnBorrow(testOnBorrow);
        datasource.setTestOnReturn(testOnReturn);
        datasource.setPoolPreparedStatements(poolPreparedStatements);
        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);//        try {//            datasource.setFilters(filters);//        } catch (SQLException e) {//            System.err.println("druid configuration initialization filter: " + e);//        }
        datasource.setConnectionProperties(connectionProperties);
        datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);return datasource;}}

其中MybatisInterceptor代码如下:

packagecom.db;importorg.apache.ibatis.executor.Executor;importorg.apache.ibatis.mapping.MappedStatement;importorg.apache.ibatis.plugin.*;importorg.apache.ibatis.session.ResultHandler;importorg.apache.ibatis.session.RowBounds;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importjava.util.Properties;@Component@Intercepts({@Signature(type=Executor.class, method="query",
        args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})publicclassMybatisInterceptorimplementsInterceptor{@Value("${mybatis.max_row}")privateInteger max_row;@OverridepublicObjectintercept(Invocation invocation)throwsThrowable{
        invocation.getArgs()[2]=newRowBounds(0,(null== max_row||0== max_row)?10000: max_row);return invocation.proceed();}@OverridepublicObjectplugin(Object o){returnPlugin.wrap(o,this);}@OverridepublicvoidsetProperties(Properties properties){}}

其中DbMyDb1Config代码如下:

packagecom.db;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.s
  • 作者:相与还
  • 原文链接:https://blog.csdn.net/xc9711/article/details/124186473
    更新时间:2022年6月5日13:47:41 ,共 10907 字。