Spring boot+mybatis+pagehlper 多数据源配置

项目需要配置多个数据源,就研究了下、
配置步骤:

            1.在pom.xml添加依赖包;
            2.编写配置文件application.properties;
            3.编写连接数据源配置类;
            4.编写动态数据源配置类;
            5.测试类;

1. 在pom.xml添加依赖包


        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>1.3.0version>
        dependency>
        
        <dependency>
            <groupId>tk.mybatisgroupId>
            <artifactId>mapper-spring-boot-starterartifactId>
            <version>1.1.0version>
        dependency>
        






        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelperartifactId>
            <version>5.0.0version>
        dependency>
        <dependency>
            <groupId>org.postgresqlgroupId>
            <artifactId>postgresqlartifactId>
        dependency>
        <dependency>
            <groupId>com.oraclegroupId>
            <artifactId>ojdbc6artifactId>
            <version>11.2.0.3version>
        dependency>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.0.11version>
        dependency>

切记:要是要重写sqlSessionFactory的话,就不要用我注释掉的那个pagehelper依赖,不然会报空指针异常

2. 编写配置文件application.properties

## 需要修改数据库连接信息
druid.url=jdbc:postgresql://10.11.11.11:7443/srvbot
druid.driver-class=org.postgresql.Driver
druid.username=srvbotdata
druid.password=paic1234
druid.initial-size=1
druid.min-idle=1
druid.max-active=20
druid.test-on-borrow=true

#测试
oracle.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1111.dev.com.cn)(PORT=1526))(connect_data=(sid=1111)))
oracle.driver-class=oracle.jdbc.driver.OracleDrive
oracle.username=jemondata
oracle.password=test1234
oracle.initial-size=1
oracle.min-idle=1
oracle.max-active=20
oracle.test-on-borrow=true

## model包的路径
mybatis.type-aliases-package=com.paic.srvbot.change.model
## mapper xml的路径
mybatis.mapper-locations=classpath:mapper/*.xml

3.编写连接数据源配置类

PG文件

@ConfigurationProperties(prefix = "druid")
public class DruidProperties {
    private String url;
    private String username;
    private String password;
    private String driverClass;

    private int     maxActive;
    private int     minIdle;
    private int     initialSize;
    private boolean testOnBorrow;

    //忽略get set.....
}

ORACLE文件

@ConfigurationProperties(prefix = "oracle")
public class OracleProperties {
    private String url;
    private String username;
    private String password;
    private String driverClass;
    private int     maxActive;
    private int     minIdle;
    private int     initialSize;
    private boolean testOnBorrow;

   //忽略get set.....
}

PG数据库连接文件

@Configuration
@EnableConfigurationProperties(DruidProperties.class)
@ConditionalOnClass(DruidDataSource.class)
// 判断有druid的依赖包
@ConditionalOnProperty(prefix = "druid", name = "url")
// 判断配置文件有druid
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class DruidAutoConfiguration {

    @Autowired
    private DruidProperties properties;
    @Value("${mybatis.mapper-locations}")
    private String mapperLocations;
    @Value("${mybatis.type-aliases-package}")
    private String typeAliasesPackage;

    public static final String DATA_SOURCE_PG = "DataSourcePG";
    public static final String SQL_SESSION_FACTORY = "pgSqlSessionFactory";

    @Bean(name = DATA_SOURCE_PG)
    @Primary
    // 设置默认的注入BEAN
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        if (properties.getInitialSize() > 0) {
            dataSource.setInitialSize(properties.getInitialSize());
        }
        if (properties.getMinIdle() > 0) {
            dataSource.setMinIdle(properties.getMinIdle());
        }
        if (properties.getMaxActive() > 0) {
            dataSource.setMaxActive(properties.getMaxActive());
        }
        dataSource.setTestOnBorrow(properties.isTestOnBorrow());
        try {
            dataSource.init();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return dataSource;
    }

    @Bean(name = SQL_SESSION_FACTORY)
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier(DATA_SOURCE_PG) DataSource dataSource)
            throws Exception {
        final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);

        // 添加分页插件
        PageInterceptor pageHelper = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "postgresql");
        properties.setProperty("reasonable", "true");
        pageHelper.setProperties(properties);
        sqlSessionFactoryBean.setPlugins(new Interceptor[] { pageHelper });

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocations));

        sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);
//      mybatis.configuration.mapUnderscoreToCamelCase
        //数据库字段_转大写,支持驼峰映射  
        sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        // 事务控制
        SpringManagedTransactionFactory transactionFactory = new SpringManagedTransactionFactory();
        sqlSessionFactoryBean.setTransactionFactory(transactionFactory);

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier(SQL_SESSION_FACTORY) SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

ORACLE数据库连接文件

@Configuration
@EnableConfigurationProperties(OracleProperties.class)
@ConditionalOnClass(DruidDataSource.class)
@ConditionalOnProperty(prefix = "oracle", name = "url")
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class OracleAutoConfiguration {

    @Autowired
    private OracleProperties properties;

    @Value("${mybatis.mapper-locations}")
    private String mapperLocations;
    @Value("${mybatis.type-aliases-package}")
    private String typeAliasesPackage;

    public static final String DATA_SOURCE_ORACLE="DataSourceOracle";
    public static final String SQL_SESSION_FACTORY="oracleSqlSessionFactory";

    @Bean(name=DATA_SOURCE_ORACLE)
    //@Primary
    public DataSource dataSource() {

        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(properties.getUrl());
        dataSource.setUsername(properties.getUsername());
        dataSource.setPassword(properties.getPassword());
        if (properties.getInitialSize() > 0) {
            dataSource.setInitialSize(properties.getInitialSize());
        }
        if (properties.getMinIdle() > 0) {
            dataSource.setMinIdle(properties.getMinIdle());
        }
        if (properties.getMaxActive() > 0) {
            dataSource.setMaxActive(properties.getMaxActive());
        }
        dataSource.setTestOnBorrow(properties.isTestOnBorrow());
        try {
            dataSource.init();
        } catch (SQLException e) {
            log.error("OracleAutoConfiguration exception",e);
            throw new RuntimeException(e);
        }

        return dataSource;
    }

    @Bean(name=SQL_SESSION_FACTORY)
    public SqlSessionFactory sqlSessionFactory(@Qualifier(DATA_SOURCE_ORACLE) DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);


        //分页插件  
        PageInterceptor pageHelper = new PageInterceptor();  
        Properties properties = new Properties();  
        properties.setProperty("helperDialect", "oracle");  
        properties.setProperty("reasonable", "true");  
        pageHelper.setProperties(properties); 
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper}); 

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocations));

        sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasesPackage);

        sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        //事务控制
        SpringManagedTransactionFactory transactionFactory = new SpringManagedTransactionFactory();
        sqlSessionFactoryBean.setTransactionFactory(transactionFactory);

        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier(SQL_SESSION_FACTORY)SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
    }

4.编写动态数据源配置类

PG配置类

@Configuration
//扫描DAO层,启动类就不用在扫描了
@MapperScan(basePackages = { "com.paic.srvbot.change.dao" }, sqlSessionFactoryRef = "pgSqlSessionFactory")
public class MyBatisMapperPGConfig {

}

ORACLE配置类


@Configuration
//扫描DAO层,启动类就不用在扫描了
@MapperScan(basePackages = { "com.paic.srvbot.change.dao2oracle" }, sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class MyBatisMapperOracleConfig {

    public static void main(String[] args) {
        for(int i=0;i<778;i++){

            System.out.println(UUID.randomUUID().toString());
        }
    }
}

5. 测试类

PG测试

package com.paic.srvbot.change.dao;

import com.paic.srvbot.change.model.CabTeamUserDto;
import com.paic.srvbot.change.util.MyMapper;

public interface CabTeamUserDao extends MyMapper {
    @Select("select * from srv_cab where user_id = #{um}")
    CabTeamUserDto findCab(@Param("id") String id);


}

ORACLE测试

package com.paic.srvbot.change.dao2oracle;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.paic.srvbot.change.model.feign.User;
import com.paic.srvbot.change.util.MyMapper;//通用MAPPER,忽略掉

public interface PsUserDao extends MyMapper {

    @Select("select * from rsms_users where user_id = #{um}")
    User findByUm(@Param("um") String um);

}

分别请求两个dao中的方法,完美运行~

你可能感兴趣的:(Spring,boot)