专栏首页扎心了老铁springboot mybatis优雅的添加多数据源

springboot mybatis优雅的添加多数据源

springboot的原则是简化配置,本文试图不通过xml配置,使用configuration配置数据源,并进行简单的数据访问。

并且配置了多数据源,在开发过程中这种场景很容易遇到。

1、依赖

springboot的starter

mybatis的springboot集成包

jdbc

<dependencies>

2、在application中打开configuration

@Configuration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3、写主数据源的configuration

1)多数据源中有一个是主数据源,注意@primary注解的书写位置

2)MapperScan basePackages配置了扫描主数据源mapper的路径

3)//bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/sentinel/*.xml"));

注释掉了通过xml配置扩展sql的方式。如果频繁使用多表连接查询,可以打开自定义sql

package com.dqa.sentinel.configuration;

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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.dqa.sentinel.mapper.sentinel", sqlSessionTemplateRef  = "sentinelSqlSessionTemplate")
public class SentinelDataSource {

    @Bean(name = "sentinelData")
    @ConfigurationProperties(prefix = "spring.datasource.sentinel") // application.properteis中对应属性的前缀
    @Primary
    public DataSource sentinelData() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sentinelSqlSessionFactory")
    @Primary
    public SqlSessionFactory sentinelSqlSessionFactory(@Qualifier("sentinelData") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/sentinel/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "sentinelTransactionManager")
    @Primary
    public DataSourceTransactionManager sentinelTransactionManager(@Qualifier("sentinelData") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sentinelSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sentinelSqlSessionTemplate(@Qualifier("sentinelSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

4、比如你还有一个外部数据源,再写一个configuration

tips:这里不能有@primary注解,不然会有冲突

package com.dqa.sentinel.configuration;

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.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;

@Configuration
@MapperScan(basePackages = "com.dqa.sentinel.mapper.outer", sqlSessionTemplateRef  = "outerSqlSessionTemplate")
public class OuterDataSource {

    @Bean(name = "outerData")
    @ConfigurationProperties(prefix = "spring.datasource.outer") // application.properteis中对应属性的前缀
    public DataSource outData() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "outerSqlSessionFactory")
    public SqlSessionFactory outerSqlSessionFactory(@Qualifier("outerData") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/outer/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "outerTransactionManager")
    public DataSourceTransactionManager outerTransactionManager(@Qualifier("outerData") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "outerSqlSessionTemplate")
    public SqlSessionTemplate outerSqlSessionTemplate(@Qualifier("outerSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }


}

5、在mapper包中定义你需要的sql

路径要和刚才在configuration中配置的一样

package com.dqa.sentinel.mapper.sentinel;

import com.dqa.sentinel.model.SentinelClan;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface SentinelMapper {
    @Select("SELECT * FROM sentinelClan;")
    List<SentinelClan> getAllClan();

    @Select("SELECT * FROM sentinelClan WHERE id = #{id}")
    SentinelClan getOneClan(@Param("id") Integer id);

    @Insert("INSERT INTO sentinelClan (id,clanName,topicNames,bufferTime,countWidth,countPercent,alarmGroup,status,createTime,updateTime) " +
            "VALUES( #{id}, #{clanName}, #{topicNames}, #{bufferTime}, #{countWidth}, #{countPercent}, #{alarmGroup}, #{status}, #{createTime}, #{updateTime})")
    int insertOne(SentinelClan sentinelClan);

    @Update("UPDATE sentinelClan SET clanName = #{clanName},topicNames = #{topicNames},bufferTime = #{bufferTime}," +
            "countWidth = #{countWidth},countPercent = #{countPercent},alarmGroup = #{alarmGroup},status = #{status}," +
            "createTime=#{createTime}, updateTime=#{updateTime}" +
            "WHERE id = #{id}")
    int updateOne(SentinelClan sentinelClan);
}

6、model中是实体类

个人爱好写的班班程程的,或者你可以在数据库建表之后使用generator自动生成。

package com.dqa.sentinel.model;

import java.sql.Blob;
import java.util.Date;

public class SentinelClan {
    private Integer id ;
    private String clanName;
    private String topicNames;
    private Integer bufferTime;
    private Integer countWidth;
    private Integer countPercent;
    private String alarmGroup;
    private Integer status;
    private String createTime;
    private String updateTime;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getClanName() {
        return clanName;
    }
    public void setClanName(String clanName) {
        this.clanName = clanName;
    }
    public String getTopicNames() {
        return topicNames;
    }
    public void setTopicNames(String topicNames) {
        this.topicNames = topicNames;
    }
    public Integer getBufferTime() {
        return bufferTime;
    }
    public void setBufferTime(Integer bufferTime) {
        this.bufferTime = bufferTime;
    }
    public Integer getCountWidth() {
        return countWidth;
    }
    public void setCountWidth(Integer countWidth) {
        this.countWidth = countWidth;
    }
    public Integer getCountPercent() {
        return countPercent;
    }
    public void setCountPercent(Integer countPercent) {
        this.countPercent = countPercent;
    }
    public String getAlarmGroup() {
        return alarmGroup;
    }
    public void setAlarmGroup(String alarmGroup) {
        this.alarmGroup = alarmGroup;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springboot使用zookeeper(curator)实现注册发现与负载均衡

    最简单的实现服务高可用的方法就是集群化,也就是分布式部署,但是分布式部署会带来一些问题。比如: 1、各个实例之间的协同(锁) 2、负载均衡 3、热删除 这里通过...

    用户1225216
  • springboot与thrift集成实现服务端和客户端

    我们这里用一个简单的小功能来演示一下如何使用springboot集成thrift 这个功能是,判断hdfs路径存在。 1、先解决依赖 <dependencie...

    用户1225216
  • springboot scheduled并发配置

    本文介绍如何使用springboot的sheduled实现任务的定时调度,并将调度的任务实现为并发的方式。 1、定时调度配置scheduled 1)注册定时任务...

    用户1225216
  • 基于Spring Data JPA框架的文章归档实现

    最近在写自己的个人博客系统,框架采用SpringMVC、Spring4.0、Spring Data/JPA组合,本博客就文档归档功能在Spring Data J...

    SmileNicky
  • Spring Boot:整合Shiro权限框架

    Shiro是Apache旗下的一个开源项目,它是一个非常易用的安全框架,提供了包括认证、授权、加密、会话管理等功能,与Spring Security一样属基于权...

    朝雨忆轻尘
  • Jpa配置实体类创建时间更新时间自动赋值,@CreateDate,@LastModifiedDate

    操作数据库映射实体类时,通常需要记录createTime和updateTime,如果每个对象新增或修改去都去手工操作创建时间、更新时间,会显得比较繁琐。

    天涯泪小武
  • Springboot整合Shiro之认证

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    用户4919348
  • Springboot整合Shiro之授权

    Shiro是我们常用的一个权限管理框架,本文的重点是来介绍下在SpringBoot环境下我们怎么来使用Shiro。

    Java帮帮
  • TestNG测试框架初探

    ● TestNG是一个测试框架,其灵感来自Junit和NUnit的,但引入了一些新功能,使其功能更强大,使用更方便。

    用户5521279
  • Java编程思想第五版(On Java8)(二十四)-并发编程

    到目前为止,我们一直在编程,就像文学中的意识流叙事设备一样:首先发生一件事,然后是下一件事。我们完全控制所有步骤及其发生的顺序。如果我们将值设置为5,那么稍后会...

    JavaEdge

扫码关注云+社区

领取腾讯云代金券