Spring Boot + Mybatis 配置多数据源

  • Mybatis拦截器,字段名大写转小写
package com.sgcc.tysj.s.common.mybatis;

import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties; import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.springframework.stereotype.Component;
@Component
@Intercepts({ @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = { Statement.class }) })
public class MybatisResultSetSIntercept implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { Object result = invocation.proceed(); //执行请求方法,并将所得结果保存到result中
if (result instanceof ArrayList) {
ArrayList<?> resultList = (ArrayList<?>) result;
if(resultList.size()>0&&resultList.get(0) instanceof Map )
{
List<Map<String,Object>> resList = new ArrayList<Map<String,Object>>();
for (int i = 0; i < resultList.size(); i++) {
if (resultList.get(i) instanceof Map) {
Map<String, Object> nmap=new LinkedHashMap<String, Object>();
@SuppressWarnings("unchecked")
Map <String, Object>map = (Map<String, Object>) resultList.get(i);
for ( String key: map.keySet())
nmap.put(key.toLowerCase(), map.get(key));
resList.add(nmap);
} }
return resList;
} } return result;
} public Object plugin(Object target) {
// 读取@Signature中的配置,判断是否需要生成代理类
if (target instanceof ResultSetHandler) {
return Plugin.wrap(target, this);
} else {
return target;
}
} public void setProperties(Properties properties) { } }
  • 数据源一
package com.sgcc.tysj.p.pinggao.config;

import com.sgcc.tysj.s.common.mybatis.MybatisResultSetSIntercept;
import org.apache.ibatis.plugin.Interceptor;
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /**
* @Description: 默认数据源
* @author: tangsw
* @date: 2019/11/18 23:20
*/
// 表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.sgcc.tysj.p.pinggao.**.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DatabaseConfigForSystem { @Value("${spring.datasource.system.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.system.url}")
private String url;
@Value("${spring.datasource.system.username}")
private String username;
@Value("${spring.datasource.system.password}")
private String password;
@Value("${spring.datasource.system.test-on-borrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.system.test-while-idle}")
private boolean testWhileIdle;
@Value("${spring.datasource.system.validation-query}")
private String validationQuery;
@Value("${spring.datasource.system.maxIdle}")
private int maxIdle;
@Value("${spring.datasource.system.minIdle}")
private int minIdle;
@Value("${spring.datasource.system.initialSize}")
private int initialSize;
@Value("${spring.datasource.system.maxActive}")
private int maxActive;
@Value("${spring.datasource.system.timeBeteenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.system.minEvictableIdelTimeMillis}")
private int minEvictableIdelTimeMillis;
@Value("${spring.datasource.system.maxWait}")
private int maxWait; @Autowired
private MybatisResultSetSIntercept mybatisResultSetSIntercept; // 将这个对象放入Spring容器中
@Bean(name = "db1DataSource")
// 表示这个数据源是默认数据源
@Primary
// 读取application.properties中的配置参数映射成为一个对象,prefix表示参数的前缀
@ConfigurationProperties(prefix = "spring.datasource.system")
public DataSource getDateSource1() {
org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setMaxActive(maxActive);
dataSource.setMinIdle(minIdle);
dataSource.setMaxIdle(maxIdle);
dataSource.setTestOnBorrow(testOnBorrow);
dataSource.setTestWhileIdle(testWhileIdle);
dataSource.setValidationQuery(validationQuery);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
dataSource.setMinEvictableIdleTimeMillis(minEvictableIdelTimeMillis);
dataSource.setInitialSize(initialSize);
dataSource.setMaxWait(maxWait);
return dataSource;
} @Bean(name = "db1SqlSessionFactory")
// 表示这个数据源是默认数据源
@Primary
// @Qualifier表示查找Spring容器中名字为 db1DataSource 的对象
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
// 如果字段值为空,返回null
configuration.setCallSettersOnNulls(true);
bean.setConfiguration(configuration);
// 调用 Mybatis 拦截器
bean.setPlugins(new Interceptor[]{mybatisResultSetSIntercept});
bean.setDataSource(datasource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath:mappings/tysj/p/pinggao/*/*.xml"));
return bean.getObject();
} /**
* 配置事务管理
*/
@Bean(name = "db1TransactionManager")
@Primary
public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "db1SqlSessionTemplate")
@Primary
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
} }
  • 数据源二
package com.sgcc.tysj.p.pinggao.config;

import com.sgcc.tysj.s.common.mybatis.MybatisResultSetSIntercept;
import org.apache.ibatis.plugin.Interceptor;
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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /**
* @Description: WebService接口使用此数据源
* @author: tangsw
* @date: 2019/11/18 23:20
*/
// 表示这个类为一个配置类
@Configuration
// 配置mybatis的接口类放的地方
@MapperScan(basePackages = "com.sgcc.tysj.p.pinggao_ws.erp.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DatabaseConfigForWebService { @Value("${spring.datasource.webService.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.webService.url}")
private String url;
@Value("${spring.datasource.webService.username}")
private String username;
@Value("${spring.datasource.webService.password}")
private String password;
@Value("${spring.datasource.webService.test-on-borrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.webService.test-while-idle}")
private boolean testWhileIdle;
@Value("${spring.datasource.webService.validation-query}")
private String validationQuery;
@Value("${spring.datasource.webService.maxIdle}")
private int maxIdle;
@Value("${spring.datasource.webService.minIdle}")
private int minIdle;
@Value("${spring.datasource.webService.initialSize}")
private int initialSize;
@Value("${spring.datasource.webService.maxActive}")
private int maxActive;
@Value("${spring.datasource.webService.timeBeteenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.webService.minEvictableIdelTimeMillis}")
private int minEvictableIdelTimeMillis;
@Value("${spring.datasource.webService.maxWait}")
private int maxWait; @Autowired
private MybatisResultSetSIntercept mybatisResultSetSIntercept; // 将这个对象放入Spring容器中
@Bean(name = "db2DataSource")
// 表示这个数据源是默认数据源
// 读取application.properties中的配置参数映射成为一个对象,prefix表示参数的前缀
@ConfigurationProperties(prefix = "spring.datasource.webService")
public DataSource getDateSource2() {
org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setMaxActive(maxActive);
dataSource.setMinIdle(minIdle);
dataSource.setMaxIdle(maxIdle);
dataSource.setTestOnBorrow(testOnBorrow);
dataSource.setTestWhileIdle(testWhileIdle);
dataSource.setValidationQuery(validationQuery);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
dataSource.setMinEvictableIdleTimeMillis(minEvictableIdelTimeMillis);
dataSource.setInitialSize(initialSize);
dataSource.setMaxWait(maxWait);
return dataSource;
} @Bean(name = "db2SqlSessionFactory")
// 表示这个数据源是默认数据源
// @Qualifier表示查找Spring容器中名字为 db2DataSource 的对象
public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
// 如果字段值为空,返回null
configuration.setCallSettersOnNulls(true);
bean.setConfiguration(configuration);
// Mybatis拦截器
bean.setPlugins(new Interceptor[]{mybatisResultSetSIntercept});
bean.setDataSource(datasource);
bean.setMapperLocations(
// 设置mybatis的xml所在位置
new PathMatchingResourcePatternResolver().getResources("classpath:mappings/tysj/p/pinggao_ws/erp/*.xml"));
return bean.getObject();
} /**
* 配置事务管理
*/
@Bean(name = "db2TransactionManager")
public DataSourceTransactionManager db2TransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "db2SqlSessionTemplate")
public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
} }
  • 连接池配置参数:
#------------------------------------WebService 接口使用此数据源配置---------------------------------
spring.datasource.webService.url=jdbc:oracle:thin:@192.168.10.10:1521:orcl
spring.datasource.webService.username=oracle
spring.datasource.webService.password=oracle
spring.datasource.webService.driver-class-name=oracle.jdbc.OracleDriver #最大连接数据库连接数,设 0 为没有限制
spring.datasource.webService.maxActive=20
#初始化连接数
spring.datasource.webService.initialSize=1
#最大等待毫秒数, 单位为 ms, 超过时间会出错误信息
spring.datasource.webService.maxWait=60000
#最小空闲连接
spring.datasource.webService.minIdle=1
#最大空闲连接
spring.datasource.webService.maxIdle=20
##如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。
spring.datasource.webService.timeBeteenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.webService.minEvictableIdelTimeMillis=300000
#在获取Connection对象时检测其可用性
spring.datasource.webService.test-on-borrow=true
#保证从连接池中得到的Connection对象是可用的
spring.datasource.webService.test-while-idle=true
#验证数据库连接的有效性
spring.datasource.webService.validation-query=select 1 from dual
  • 遇到问题:

1.不调用拦截器代码;

2.查询数据库数据,如果值为空,字段名也不会查询出来;

3.系统闲置一段时间不访问就提示“ 关闭的连接”。

  •  参考文章:

springboot-mybatis多数据源的两种整合方法

mybatis多数据源踩坑,数据库连接经常断开问题

Springboot多数据源自动断开connection连接问题

springboot下配置mybatis的call-setters-on-nulls属性

Spring Boot + Mybatis 配置多数据源的更多相关文章

  1. Spring Boot + Mybatis 实现动态数据源

    动态数据源 在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动 ...

  2. Spring Boot MyBatis配置多种数据库

    mybatis-config.xml是支持配置多种数据库的,本文将介绍在Spring Boot中使用配置类来配置. 1. 配置application.yml # mybatis配置 mybatis: ...

  3. spring、spring boot中配置多数据源

    在项目开发的过程中,有时我们有这样的需求,需要去调用别的系统中的数据,那么这个时候系统中就存在多个数据源了,那么我们如何来解决程序在运行的过程中到底是使用的那个数据源呢? 假设我们系统中存在2个数据源 ...

  4. spring boot +mybatis+druid 多数据源配置

    因为我的工程需要在两个数据库中操作数据,所以要配置两个数据库,我这里没有数据源没有什么主从之分,只是配合多数据源必须要指定一个主数据源,所以我就把 操作相对要对的那个数据库设置为主数据(dataBas ...

  5. 【转】spring boot mybatis 读取配置文件

    spring boot mybatis 配置整理 一.加载mybatis的配置 1.手写配置,写死在代码里 import java.io.IOException; import java.util.P ...

  6. Spring Boot + MyBatis + Pagehelper 配置多数据源

    前言: 本文为springboot结合mybatis配置多数据源,在项目当中很多情况是使用主从数据源来读写分离,还有就是操作多库,本文介绍如何一个项目同时使用2个数据源. 也希望大家带着思考去学习!博 ...

  7. Spring Boot 2.x 多数据源配置之 MyBatis 篇

    场景假设:现有电商业务,商品和库存分别放在不同的库 配置数据库连接 app: datasource: first: driver-class-name: com.mysql.cj.jdbc.Drive ...

  8. spring boot + mybatis + druid配置实践

    最近开始搭建spring boot工程,将自身实践分享出来,本文将讲述spring boot + mybatis + druid的配置方案. pom.xml需要引入mybatis 启动依赖: < ...

  9. spring+myBatis 配置多数据源,切换数据源

    注:本文来源于  tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...

随机推荐

  1. html5 audio标签微信部分苹果手机不能自动播放音乐终极解决方案

    html5 audio标签微信部分苹果手机不能自动播放音乐终极解决方案 大家都知道需要在点击时候后 播放 ps:如果点击ajax 回来播放也不行,必须点击立即播放 要背景自动播放只能采取下面方案< ...

  2. Spring Boot 2整合Redis做缓存

    既然是要用Redis做缓存,自然少不了安装了.但是本文主要讲Spring Boot与Redis整合.安装教程请另行百度! 1.首先是我们的Redis配置类 package com.tyc; impor ...

  3. | C语言I作业03

    | C语言I作业03 标签: 18软件 李煦亮 问题 答案 这个作业属于那个课程 C语言程序设计I 这个作业要求在哪里 https://edu.cnblogs.com 我在这个课程的目标是 学会和掌握 ...

  4. centos 7 重新设置分区大小

    一.基础概念Cent0S 7默认启用LVM2(Logical Volume Manager),把机器的一块硬盘分为两个区sda1和sda2,其中分区sda1作为系统盘/boot挂载,少量空间:sda2 ...

  5. C语言创建链表

    一.链表中结点的存储 链表的结点左边一部分是存放的数据,右边一部分是后继指针指向下一个结点的地址.C语言中通常定义一个结构体类型来存储一个结点,如下: struct node { int data; ...

  6. VS2013中反汇编常用指令理解

    最近复习C语言,对反汇编感兴趣,就用下图举例解释一下我的理解,如有错还请大佬指教. 首先,认识两个常用指令 :   lea ---> 取地址赋值      mov ---> (同类型)赋值 ...

  7. Elasticsearch 史上最全最常用工具清单

    基础类工具 1.Head插件 1)功能概述: ES集群状态查看.索引数据查看.ES DSL实现(增.删.改.查操作) 比较实用的地方:json串的格式化 2)地址:http://mobz.github ...

  8. 一个简单便捷的树形显示Ztree

    这是本人在闲时研究的一个用于显示树形列表的小玩意. zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 下面就说说怎么用吧 ...

  9. WebAPI 权限控制解决方案——Phenix.NET企业应用软件快速开发平台.使用指南.21.WebAPI服务(三)

    21.1   数据服务 21.1.1基本操作功能 Phenixヾ的数据服务,提供了如下的基本操作: 功能 Type URI 参数 完整获取实体集合对象 GET api/Data 分页获取实体集合对象 ...

  10. python基础08--迭代器,生成器

    1.1 迭代器 1.可迭代对象:str,list,tuple,set,dict, 迭代器:f(文件),range() 可迭代对象和迭代器都可以for循环 可迭代对象不会计数, 迭代器会计数,上面操作到 ...