spring boot下mybatis配置双数据源的实例

目录
  • 单一数据源配置
  • 多个数据源配置
    • 多数据源配置文件
    • 多数据源配置类

最近项目上遇到需要双数据源的来实现需求,并且需要基于spring boot,mybatis的方式来实现,在此做简单记录。

单一数据源配置

单一数据源配置的话并没有什么特别的,在spring boot框架下,只需要在配置文件内添加对应的配置项即可,spring boot会自动初始化需要用到的bean。

配置信息如下。这里使用的是德鲁伊的数据源配置方式

#datasource配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxx
spring.datasource.username=root
spring.datasource.password=123456
#mybatis配置
#mybatis  xmlMapper文件路径
mybatis.mapper-locations=classpath:META-INF/mybatis/mapper/*Mapper.xml
mybatis.configuration.map-underscore-to-camel-case=true
#mappers mapper接口文件路径 多个接口时逗号隔开
mapper.mappers=com.xxxx.xxxx
mapper.not-empty=false
mapper.identity=MYSQL

在使用mapper的时候,直接使用spring的注解注入即可。

多个数据源配置

假如需要新增配置一个数据源,那么在spring boot 框架下如何实现呢?在多数据源的情况下,数据源配置需要添加两份,数据源、mybatis等使用到的bean不能再依赖spring boot替我们完成。

多数据源配置文件

配置文件改成如下,第二个数据源的配置前缀需要自定义为另外的。

#datasource 1配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxx
spring.datasource.username=root
spring.datasource.password=123456
#datasource 2配置,前缀改为second以区分第一个数据源
second.datasource.type=com.alibaba.druid.pool.DruidDataSource
second.datasource.driver-class-name=com.mysql.jdbc.Driver
second.datasource.url=jdbc:mysql://xxx
second.datasource.username=root
second.datasource.password=123456

多数据源配置类

编写第一个数据源使用的配置类,如下所示。

对于Datasource的bean定义,需要使用@ConfigurationProperties(prefix = "spring.datasource")前缀匹配来指定使用第一个数据源的配置,同时还需要使用注解@Primary来指定当有依赖注入需要注入datasource时,优先使用@Primary注解修饰的datasource。

对于SqlSessionFactory定义,我们无法依赖spring boot做自动化配置实现,有一些动作需要我们手动处理。首先是mapper.xml文件路径的指定,这样mapper接口才能注册到mybatis容器中;假如你定义的的mapper接口没有对应的MapperXml,你还需要手动指定mapper接口的包路径作为参数,调用addMappers的方法,进行扫描注册,手动注册接口到mybatis容器中,一般这个过程在解析MapperXml文件时会由mybatis框架实现。

还有就是SqlSessionTemplate,DataSourceTransactionManager的定义,第一个数据源都需要配置为优先注入。

上面所有的配置第一个数据源相关bean优先注入都是为了方便spring容器,管理第一个数据源的mapper接口的代理类实例bean。spring boot实现Mapper代理类实例的注册时,是从容器中获取一个SqlSessionTemplatebean,然后调用SqlSessionTemplate.getMapper()方法获取一个实例的,因此SqlSessionTemplate优先注入者,spring容器管理的Mapper代理类就是对应数据源定义的。所以第一个数据源的Mapper使用时,可以直接使用@Resource注解或者别的依赖注解来使用。

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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;
/**
 * @author garine
 * @date 2018年11月16日
 **/
@Configuration
public class OdsMybatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    @Primary
    public DataSource odsDataSource(){
        return DataSourceBuilder.create().build();
    }
    @Bean
    @Primary
    public SqlSessionFactory odsSqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //设置mapper.xml文件路径
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/mapper/*Mapper.xml"));
        //设置mapper接口的扫描包路径
        //sqlSessionFactory.getConfiguration().addMappers("com.xxx.mapper");
        return bean.getObject();
    }
    @Bean
    @Primary
    public DataSourceTransactionManager odsTransactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean
    @Primary
    public SqlSessionTemplate odsSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

下面是第二个数据源的配置类。针对第二个数据源配置,方法内容基本一致,但是需要注意的是,由于第一个数据源设置了优先配置,那么所有依赖注入默认都将注入第一个数据源的配置,所以第二个数据源配置需要额外指定使用何种bean注入。

datasource的定义需要使用 @Qualifier注解指定值,在依赖注入时使用 @Qualifier和指定值就可以注入目标bean。wmsSqlSessionFactory方法 使用@Qualifier(“wmsDatasource”)注解可以注入第二个数据源bean。

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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;
/**
 * @author garine
 * @date 2018年11月16日
 **/
@Configuration
public class WmsMybatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "second.datasource")
    @Qualifier("wmsDatasource")
    public DataSource wmsDataSource(){
        return DataSourceBuilder.create().build();
    }
    @Bean
    @Qualifier("wmsSqlSessionFactory")
    public SqlSessionFactory wmsSqlSessionFactory(@Qualifier("wmsDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/wms/mapper/*Mapper.xml"));
        bean.getObject();
        SqlSessionFactory sqlSessionFactory = bean.getObject();
        //设置wms数据源额外的mapper.java注册
        //sqlSessionFactory.getConfiguration().addMappers("com.xx.maper");
        return sqlSessionFactory;
    }
    @Bean
    public DataSourceTransactionManager wmsTransactionManager(@Qualifier("wmsDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean
    @Qualifier("wmsSqlSessionTemplate")
    public SqlSessionTemplate wmsSqlSessionTemplate( @Qualifier("wmsSqlSessionFactory") SqlSessionFactory wmsSqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(wmsSqlSessionFactory);
    }
}

通过上面的配置就可以实现双数据源配置,下面是使用方式。

  • 第一个数据源定义的maper由spring容器管理,可以直接使用@Resource注解使用
  • 第二个数据源使用可能比较麻烦,代码如下
//依赖注入第二个数据源的SqlSession
@Resource
@Qualifier("wmsSqlSessionTemplate")
SqlSessionTemplate wmsSqlSessionTemplate;
//使用时手动获取Mapper然后调用接口方法
wmsSqlSessionTemplate.getMapper(ReturnResultRecoderMapper.class).selectTest()

最后需要注意一点就是,使用上面的配置方式,mybatis的结果处理器对下划线结果集合并没有自动转换为驼峰方式,需要手动在sql中定义别名。

例如实体

class People{
    private String peopleGender;
}

mybatis执行sql,结果集映射为People类。

sekect people_gender from people;

people_gender这个结果无法自动映射到peopleGender,需要执行以下sql才能映射上

sekect people_gender as peopleGendler from people;

所以这个配置过程应该是漏了某些配置导致结果处理器的名称映射不起作用,这个问题先mark。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot 整合mybatis 使用多数据源的实现方法

    前言 本篇教程偏向实战,程序猿直接copy代码加入到自己的项目中做简单的修修改改便可使用,而对于springboot以及mybatis不在此进行展开介绍,如有读者希望了解可以给我留言,并持续关注,我后续会慢慢更新.(黑色区域代码部分,安卓手机可手动向左滑动,来查看全部代码) 整合 其实整合很简单,如果是用gradle的话,在build.gradle文件里加入 compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')

  • Spring Boot + Mybatis-Plus实现多数据源的方法

    前段时间写了一篇基于mybatis实现的多数据源博客.感觉不是很好,这次打算加入git,来搭建一个基于Mybatis-Plus的多数据源项目 Mybatis-Plus就是香 前言:该项目分为master数据源与local数据源.假定master数据源为线上数据库,local为本地数据库.后续我们将通过xxl-job的方式,将线上(master)中的数据同步到本地(local)中 项目git地址 抽时间把项目提交到git仓库,方便大家直接克隆 sql文件已置于项目中,数据库使用的mysql 创建项

  • springboot + mybatis配置多数据源示例

    在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法 3)DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用Da

  • 详解SpringBoot和Mybatis配置多数据源

    目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL.在SpringBoot中,配置多数据源的方式十分便捷, 下面开始上代码: 在pom.xml文件中需要添加一些依赖 <!-- Spring Boot Mybatis 依赖 --> <dependency> <groupId>org.mybatis.spring.b

  • Spring Boot + Mybatis多数据源和动态数据源配置方法

    网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种方式,记录一下配置方法供大家参考. 应用场景 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 多数据源 首先要将spring boot自带的DataSourceAutoConfiguration禁掉,因为它会读取application.properties文件的spring.datasource.*属性并自动配置单数据源.在@SpringBootApplication注解中添加ex

  • spring boot下mybatis配置双数据源的实例

    目录 单一数据源配置 多个数据源配置 多数据源配置文件 多数据源配置类 最近项目上遇到需要双数据源的来实现需求,并且需要基于spring boot,mybatis的方式来实现,在此做简单记录. 单一数据源配置 单一数据源配置的话并没有什么特别的,在spring boot框架下,只需要在配置文件内添加对应的配置项即可,spring boot会自动初始化需要用到的bean. 配置信息如下.这里使用的是德鲁伊的数据源配置方式 #datasource配置 spring.datasource.type=c

  • Spring Boot 与 mybatis配置方法

    1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </

  • spring boot springjpa 支持多个数据源的实例代码

    1.SpringBoot的程序启动类 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web

  • spring boot整合mybatis使用c3p0数据源连接mysql

    刚刚接触springboot,对很多东西都不熟悉,例如,它的注解方式,他的配置方式等:听说它很牛逼,所以就尝试着去学习.在基本熟悉springboot的第一个程序之后.想到当时spring整合mybatis时使用了数据源连接数据库,所以自己也想尝试使用c3p0连接数据库.所以就有了以下的内容: 首先第一步,创建maven项目导入包: pom.xml <parent> <groupId>org.springframework.boot</groupId> <arti

  • Spring Boot集成Mybatis的实例代码(简洁版)

    概述 现在互联网应用中,大部分还是使用Mybatis来操作数据库的,本文介绍一下Spring Boot中如何集成Mybatis. 上篇介绍了Spring Boot 直接用jar运行项目的方法,需要的朋友点击查看. 创建Spring Boot工程 在 Spring Boot 开篇-创建和运行 一文中有一个小节介绍了如何使用Spring Boot的组件来创建工程.如果要集成Mybatis,只需要把Mysql和Mybatis这两个组件勾选一下即可. 当然也可以不通过这种方式,直接在POM.xml文件中

  • spring boot整合mybatis利用Mysql实现主键UUID的方法

    前言 本文主要给大家介绍了关于spring boot整合mybatis利用Mysql实现主键UUID的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现 基础项目的pom.xml部分代码如下 <properties> <java.version>1.8</java.version> </properties> <!-- Inherit defaults from Spring Boot --> <parent&

  • 详解Spring Boot整合Mybatis实现 Druid多数据源配置

    一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分: 1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系. 2. DruidDataSource 高效可管理的数据库连接池 3. SQLParser 当业务数据量达

  • Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例

    本文将介绍使用Spring Boot集成Mybatis并实现主从库分离的实现(同样适用于多数据源).延续之前的Spring Boot 集成MyBatis.项目还将集成分页插件PageHelper.通用Mapper以及Druid. 新建一个Maven项目,最终项目结构如下: 多数据源注入到sqlSessionFactory POM增加如下依赖: <!--JSON--> <dependency> <groupId>com.fasterxml.jackson.core<

  • 详解Spring Boot下Druid连接池的使用配置分析

    引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连接池,在连接池之外,还提供了非常优秀的监控功能,这里讲解如何与Spring Boot实现集成. 1.  环境描述 spring Boot 1.4.0.RELEASE,  JDK 1.8 2.   Druid介绍 Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource 高效可管理的数据

随机推荐