Mybayis配置多数据源

Mybayis配置多数据源

场景描述:子系统接入用户中心同步用户信息,需操作子系统数据库和用户中心数据库

Mybatis多数据源添加日志打印,开启驼峰



技术框架及项目结构

涉及框架:Springboot、Mybatis
涉及数据库:Mysql、Oracle
文件目录:
在这里插入图片描述


一、appliaction.properties配置文件

多数据源,配置文件中需配置多个连接信息,注意spring.datasource.one.jdbc-url,此处是jdbc-urlurl

#数据源mysql
spring.datasource.one.jdbc-url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8
spring.datasource.one.username=username
spring.datasource.one.password=password
spring.datasource.one.driverClassName = com.mysql.jdbc.Driver

#用户中心数据源,用于同步用户数据
spring.datasource.two.jdbc-url=jdbc:oracle:thin:@ip:port:服务名
spring.datasource.two.username=username
spring.datasource.two.password=password
spring.datasource.two.driverClassName =oracle.jdbc.driver.OracleDriver
#开启日志打印
logging.level.cn.niter.forum.mapper=debug

二、SpringApplication.java

取消mybatis的自动配置,需手动配置数据源

@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class,
        MybatisAutoConfiguration.class
})
public class Application   {
	public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

二、数据源配置文件.java

1.主数据源

代码如下:

package cn.niter.forum.config;

import lombok.extern.slf4j.Slf4j;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * @author w
 */

@Configuration
@MapperScan(
        basePackages = "cn.niter.forum.mapper.primary",
        sqlSessionFactoryRef = "sqlSessionFactoryOne"
        ,
        sqlSessionTemplateRef = "sqlSessionTemplateOne"
)
@Slf4j
public class DataSourceOneMapperConfig {

    @Primary
    @Bean(name = "dataSourceOne")
    @ConfigurationProperties(prefix = "spring.datasource.one")
    public DataSource dataSource1() {
        log.info(">>>>>>>>>>>>>>> masterDataSource config init");
        return DataSourceBuilder.create().build();
    }
    /**
     * 此数据源扫描的mapper路径
     */
    static final String MAPPER_LOCATION = "classpath:mapper/primary/*.xml";

    /**
     * 创建SqlSession对象
     *
     * @return
     */
    @Bean(name = "sqlSessionFactoryOne")
    public SqlSessionFactory sqlSessionFactoryOne(
            @Qualifier("dataSourceOne") DataSource dataSourceOne) {
        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSourceOne);
            //设置mapper配置文件
            sqlSessionFactoryBean.setMapperLocations(
                    new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)
            );
            //设置驼峰
            sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
            return sqlSessionFactoryBean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 配置事务
     *
     * @param dataSourceOne
     * @return
     */
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManagerOne(
            @Qualifier("dataSourceOne") DataSource dataSourceOne) {
        return new DataSourceTransactionManager(dataSourceOne);
    }

    /**
     * 通过SqlSessionFaction创建SqlSessionTemplate
     *
     * @return
     */
    @Bean(name = "sqlSessionTemplateOne")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("dataSourceOne") DataSource dataSourceOne) {
        return new SqlSessionTemplate(sqlSessionFactoryOne(dataSourceOne));
    }
}

2.第二个数据源

代码如下:

package cn.niter.forum.config;

import lombok.extern.slf4j.Slf4j;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * @author w
 */
@Configuration
@MapperScan(
        basePackages = "cn.niter.forum.mapper.second",
        sqlSessionFactoryRef = "sqlSessionFactoryTwo"
        , sqlSessionTemplateRef = "sqlSessionTemplateTwo"
)
@Slf4j
public class DataSourceTwoMapperConfig {

    @Bean(name = "dataSourceTwo")
    @ConfigurationProperties(prefix = "spring.datasource.two")
    public DataSource dataSource2() {
        log.info(">>>>>>>>>>>>>>> masterDataSource config init");
        return DataSourceBuilder.create().build();
    }

    /**
     * 此数据源扫描的mapper路径
     */
    static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml";

    /**
     *  创建SqlSession对象
     * @return
     */
    @Bean(name = "sqlSessionFactoryTwo")
    public SqlSessionFactory sqlSessionFactoryTwo(
            @Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
        try {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSourceTwo);
            //设置mapper配置文件
            sqlSessionFactoryBean.setMapperLocations(
                    new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)
            );
            sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
            return sqlSessionFactoryBean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 配置事务
     * @param dataSourceTwo
     * @return
     */
    @Bean
    public DataSourceTransactionManager dataSourceTransactionManagerTwo(
            @Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
        return new DataSourceTransactionManager(dataSourceTwo);
    }

    /**
     * 通过SqlSessionFaction创建SqlSessionTemplate
     * @return
     */
    @Bean(name = "sqlSessionTemplateTwo")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("dataSourceTwo") DataSource dataSourceTwo) {
        return new SqlSessionTemplate(sqlSessionFactoryTwo(dataSourceTwo));
    }
}


结语

本文只写了如何配置多数据源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值