项目需要配置多个数据源,就研究了下、
配置步骤:
1.在pom.xml添加依赖包;
2.编写配置文件application.properties;
3.编写连接数据源配置类;
4.编写动态数据源配置类;
5.测试类;
<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依赖,不然会报空指针异常
## 需要修改数据库连接信息
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
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);
}
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());
}
}
}
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中的方法,完美运行~