spring boot + mybatis实现动态切换数据源实例代码
前言
前几天有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源。我上网收集了一些资料整合了一下,虽然最后这个需求不了了之了,但是多数据源动态切换还是蛮好用的,所以记录一下,或许以后有用呢?或者自己感兴趣又想玩呢!
下面话不多说了,随着小编来一起看看详细的介绍吧
方法如下:
1.加个依赖
org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.1
2.application.properties配置文件
#主从数据库 master.db.driverClassName=com.mysql.jdbc.Driver master.db.url=jdbc:mysql://localhost:3306/cbd?characterEncoding=UTF-8&useUnicode=true&useSSL=false master.db.username=root master.db.password=admin slave.db.driverClassName=com.mysql.jdbc.Driver slave.db.url=jdbc:mysql://localhost:3306/cbd_test?characterEncoding=UTF-8&useUnicode=true&useSSL=false slave.db.username=root slave.db.password=admin mybatis.config-location=classpath:config/mybatis-config.xml mybatis.mapper-locations=classpath:mapper/**/*.xml
3.禁用springboot默认加载数据源配置
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
publicclassApplication{
publicstaticvoidmain(String[]args)throwsException{
SpringApplication.run(Application.class,args);
}
}
4.数据源配置类
/**
*主数据源
*/
@Configuration
@ConfigurationProperties(prefix="master.db")
publicclassMasterDataSourceConfig{
privateStringurl;
privateStringusername;
privateStringpassword;
privateStringdriverClassName;
}
/**
*从数据源配置
*/
@Configuration
@ConfigurationProperties(prefix="slave.db")
publicclassSlaveDataSourceConfig{
privateStringurl;
privateStringusername;
privateStringpassword;
privateStringdriverClassName;
}
/**
*数据源配置类
*/
@Configuration
publicclassDataSourceComponent{
@Resource
privateMasterDataSourceConfigmasterDataSourceConfig;
@Resource
privateSlaveDataSourceConfigslaveDataSourceConfig;
@Bean(name="master")
publicDataSourcemasterDataSource(){
DataSourcedataSource=newDataSource();
dataSource.setUrl(masterDataSourceConfig.getUrl());
dataSource.setUsername(masterDataSourceConfig.getUsername());
dataSource.setPassword(masterDataSourceConfig.getPassword());
dataSource.setDriverClassName(masterDataSourceConfig.getDriverClassName());
returndataSource;
}
@Bean(name="slave")
publicDataSourceslaveDataSource(){
DataSourcedataSource=newDataSource();
dataSource.setUrl(slaveDataSourceConfig.getUrl());
dataSource.setUsername(slaveDataSourceConfig.getUsername());
dataSource.setPassword(slaveDataSourceConfig.getPassword());
dataSource.setDriverClassName(slaveDataSourceConfig.getDriverClassName());
returndataSource;
}
@Primary//不加这个会报错。
@Bean(name="multiDataSource")
publicMultiRouteDataSourceexampleRouteDataSource(){
MultiRouteDataSourcemultiDataSource=newMultiRouteDataSource();
Map
5.数据源上下文
/**
*数据源上下文
*/
publicclassDataSourceContext{
privatestaticfinalThreadLocalcontextHolder=newThreadLocal<>();
publicstaticvoidsetDataSource(Stringvalue){
contextHolder.set(value);
}
publicstaticStringgetDataSource(){
returncontextHolder.get();
}
publicstaticvoidclearDataSource(){
contextHolder.remove();
}
}
6.DataSource路由类
/*
*重写的函数决定了最后选择的DataSource
*/
publicclassMultiRouteDataSourceextendsAbstractRoutingDataSource{
@Override
protectedObjectdetermineCurrentLookupKey(){
//通过绑定线程的数据源上下文实现多数据源的动态切换,有兴趣的可以去查阅资料或源码
returnDataSourceContext.getDataSource();
}
}
7.使用,修改上下文中的数据源就可以切换自己想要使用的数据源了。
publicUserVOfindUser(Stringusername){
DataSourceContext.setDataSource("slave");
UserVOuserVO=userMapper.findByVO(username);
System.out.println(userVO.getName()+"=====================");
returnnull;
}
这种是在业务中使用代码设置数据源的方式,也可以使用AOP+注解的方式实现控制,方法多多!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。