0
点赞
收藏
分享

微信扫一扫

springboot集成DruidDataSource多数据源

晒大太阳了 2022-03-17 阅读 51

1.config类代码

package com.yinta.query.config;

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Value;
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.core.io.support.ResourcePatternResolver;
import org.springframework.data.transaction.ChainedTransactionManager;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

@Slf4j
@Configuration
@EnableTransactionManagement
public class MyBatisConfig implements TransactionManagementConfigurer {

    @Bean(destroyMethod = "close")
    @Primary
    public DataSource yinta(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(yintaUrl);
        ds.setUsername(yintaUser);
        ds.setPassword(yintaPassword);
        try {
            List<Filter> proxyFilters = new ArrayList<Filter>();
            WallFilter statFilter = new WallFilter();
            WallConfig config = new WallConfig();
            // 批量操作
            config.setMultiStatementAllow(true);
            statFilter.setConfig(config);
            proxyFilters.add(statFilter);
            ds.setProxyFilters(proxyFilters);
            ds.setFilters("stat, wall");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ds;
    }

    @Bean(name = "sqlSessionFactoryYinta")
    @Primary
    public SqlSessionFactory sqlSessionFactoryYinta() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(yinta());
        //分页插件
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("dialect", "sqlserver");
        properties.setProperty("reasonable", "false");
        properties.setProperty("pageSizeZero", "true");
        pageHelper.setProperties(properties);
        Interceptor[] plugins = new Interceptor[]{pageHelper};
        bean.setPlugins(plugins);
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        Properties properties1 = new Properties();
        configuration.setVariables(properties1);
        bean.setConfiguration(configuration);
        try {
            //指定mapper xml目录
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            bean.setMapperLocations(resolver.getResources("classpath*:com/yinta/query/mapper/yinta/**/*.xml"));
            return bean.getObject();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 事物配置
     */
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        DataSourceTransactionManager dtm1 = new DataSourceTransactionManager(yinta());
        DataSourceTransactionManager dtm2 = new DataSourceTransactionManager(yintaProduce());
        DataSourceTransactionManager dtm3 = new DataSourceTransactionManager(yintaMysql());
        ChainedTransactionManager ctm = new ChainedTransactionManager(dtm1,dtm2,dtm3);
        return ctm;
    }

    @Bean(destroyMethod = "close")
    @ConfigurationProperties(prefix = "yinta.muti-datasource-mysql")
    public DataSource yintaMysql() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "sqlSessionFactoryYintaMysql")
    public SqlSessionFactory sqlSessionFactoryYintaMysql() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(yintaMysql());
        //分页插件
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("dialect", "mysql");
        properties.setProperty("reasonable", "false");
        properties.setProperty("pageSizeZero", "true");
        pageHelper.setProperties(properties);
        Interceptor[] plugins = new Interceptor[]{pageHelper};
        bean.setPlugins(plugins);
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        Properties properties1 = new Properties();
        configuration.setVariables(properties1);
        bean.setConfiguration(configuration);
        try {
            //指定mapper xml目录
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            bean.setMapperLocations(resolver.getResources("classpath*:com/yinta/query/mapper/mysql/**/*.xml"));
            return bean.getObject();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }
}
 

1.MyBatisMapperScan类代码

package com.yinta.query.config.mybatis.scanner;

import com.yinta.query.config.mybatis.annotation.YintaMysql;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.yinta.query.config.MyBatisConfig;
import com.yinta.query.config.mybatis.annotation.Yinta;
import com.yinta.query.config.mybatis.annotation.YintaProduce;

/**
 * mapper 扫描
 *
 * @author jeffrey.liu
 * @create 2019-07-23 08:59
 **/
@Configuration
@AutoConfigureAfter(MyBatisConfig.class)
public class MyBatisMapperScan {
    @Bean(name="mapperScannerConfigurerYinta")
    public MapperScannerConfigurer mapperScannerConfigurerYinta() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryYinta");
        mapperScannerConfigurer.setBasePackage("com.yinta.query.mapper.yinta");
        mapperScannerConfigurer.setAnnotationClass(Yinta.class);
        return mapperScannerConfigurer;
    }

    
    @Bean(name="mapperScannerConfigurerYintaProduce")
    public MapperScannerConfigurer mapperScannerConfigurerYintaProduce() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryYintaProduce");
        mapperScannerConfigurer.setBasePackage("com.yinta.query.mapper.yintaproduce");
        mapperScannerConfigurer.setAnnotationClass(YintaProduce.class);
        return mapperScannerConfigurer;
    }

    @Bean(name="mapperScannerConfigurerYintaMysql")
    public MapperScannerConfigurer mapperScannerConfigurerYintaMysql() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryYintaMysql");
        mapperScannerConfigurer.setBasePackage("com.yinta.query.mapper.mysql");
        mapperScannerConfigurer.setAnnotationClass(YintaMysql.class);
        return mapperScannerConfigurer;
    }

}

注意的点:

1.BasePackage不能重叠扫,sql覆盖过的mysql别重复扫描,否则读取mapper有问题

2. YintaMysql是一个自定义注解,实际上就是另加了repository注解,这样做的目的是分层分权限

 3. 依赖jar包那些就不说了,mysql、sqlserver都得加进pom.xml

举报

相关推荐

0 条评论