本文主要是介绍springboot 集成 mybaits 多数据源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
application.yml中数据源配置:
#数据库连接 天气数据
spring:
datasource:
keshangjdbc:
url: jdbc:oracle:thin:@//IP:1565/ods
username:
password:
# driver-class-name: oracle.jdbc.driver.OracleDriver
#数据库连接 客商数据
weatherjdbc:
url: jdbc:oracle:thin:@//IP:1565/ods
username:
password:
# driver-class-name: oracle.jdbc.driver.OracleDriver
对每中链接写一个配置类,主要是通过aop的方式链接注入到SqlSessionTemplate中,
客商的配置类如下:
package com.neusoft.interf.dataSources;
import javax.sql.DataSource;
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 com.alibaba.druid.pool.DruidDataSource;
/**
* @author
* @Time:2018年12月19日 上午11:08:35
* @version 1.0
*/
@Configuration
@MapperScan(basePackages = "com.neusoft.interf.mapper.keShang", sqlSessionTemplateRef = "keShangSqlSessionTemplate") //代表扫描的dao层接口,在dao层接口处理前注入数据库连接
public class keShangDataSource {
@Bean(name = "keShangData")
@ConfigurationProperties(prefix = "spring.datasource.keshangjdbc") // application.properteis中对应属性的前缀
//这里特别注意的是application.properteis中对应属性一定要和DruidDataSource的属性字段一直
@Primary
public DataSource keShangData() {
return new DruidDataSource();
}
@Bean(name = "keShangSqlSessionFactory")
@Primary
public SqlSessionFactory keShangSqlSessionFactory(@Qualifier("keShangData") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//工程上默认使用的是Mybatis的DefaultVFS进行扫描,但是在springboot的环境下,Mybatis的DefaultVFS这个扫包会出现问
//题,所以只能修改VFS,为了清晰可见,
VFS.addImplClass(SpringBootVFS.class);//手动触发扫描
bean.setTypeAliasesPackage("com.neusoft.interf.entity");//对应的实体类文件夹
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/keShang/*.xml"));//对应的xml文件夹
return bean.getObject();
}
@Bean(name = "keShangTransactionManager")
@Primary
public DataSourceTransactionManager keShangTransactionManager(@Qualifier("keShangData") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "keShangSqlSessionTemplate")
@Primary
public SqlSessionTemplate keShangSqlSessionTemplate(@Qualifier("keShangSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
天气的配置类如下:
package com.neusoft.interf.dataSources;
import javax.sql.DataSource;
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 com.alibaba.druid.pool.DruidDataSource;
/**
* @author
* @Time:2018年12月19日 上午11:08:35
* @version 1.0
*/
@Configuration
@MapperScan(basePackages = "com.neusoft.interf.mapper.weather", sqlSessionTemplateRef = "weatherSqlSessionTemplate")
public class weatherDataSource {
@Bean(name = "weatherData")
@ConfigurationProperties(prefix = "spring.datasource.weatherjdbc") // application.properteis中对应属性的前缀
public DataSource weatherData() {
return new DruidDataSource();
// return DataSourceBuilder.create().build();
}
@Bean(name = "weatherSqlSessionFactory")
public SqlSessionFactory weatherSqlSessionFactory(@Qualifier("weatherData") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//工程上默认使用的是Mybatis的DefaultVFS进行扫描,但是在springboot的环境下,Mybatis的DefaultVFS这个扫包会出现问
//题,所以只能修改VFS,为了清晰可见,
VFS.addImplClass(SpringBootVFS.class);//手动触发扫描
bean.setTypeAliasesPackage("com.neusoft.interf.entity");
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/weather/*.xml"));
return bean.getObject();
}
@Bean(name = "weatherTransactionManager")
public DataSourceTransactionManager weatherTransactionManager(@Qualifier("weatherData") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "weatherSqlSessionTemplate")
public SqlSessionTemplate weatherSqlSessionTemplate(@Qualifier("weatherSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
如果有多个数据源,配置类中的@Primary只能写在其中一个,否则会报错。
此处有一个 技巧:
静态工具类中如果调用,springboot中bean,通过@Autowired引入bean,@PostConstruct注解方法中,把此bean
赋给静态变量
@Autowired
private DictService dictService;
@Autowired
private static DictService dictService1;
@PostConstruct
public void init() {
dictService1 = dictService;
}
public static List<Dict> getDictList(String type) {
Map<String, Object> dictMap = Maps.newHashMap();
List<Dict> dicts = null;
try {
dicts = dictService1.findAllList();
} catch (Exception e) {
e.printStackTrace();
}
for (Dict dict : dicts) {
List<Dict> dictList = (List<Dict>) dictMap.get(dict.getType());
if (dictList != null) {
dictList.add(dict);
} else {
dictMap.put(dict.getType(), Lists.newArrayList(dict));
}
}
List<Dict> dictList = (List<Dict>) dictMap.get(type);
if (dictList == null) {
dictList = Lists.newArrayList();
}
return dictList;
}
}
1.@PostConstruct说明
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
2.@PreDestroy说明
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。(详见下面的程序实践)
这篇关于springboot 集成 mybaits 多数据源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!