博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-boot +mybatis 配置多数据源
阅读量:6359 次
发布时间:2019-06-23

本文共 4578 字,大约阅读时间需要 15 分钟。

spring-boot +mybatis 配置多数据源

在开发中,有时候我们的数据库是做了读写分库的处理的。那么在开发使用的时候需要读取不同来源的数据库,我们需要配置spring-boot mybatis进行多数据源处理。

需要的四个类

四个类

DatabaseContextHolder:在dao层或service层用来选择使用那个数据源。

DateBaseType:枚举类,枚举所有的数据源名。

DynamicDataSource:继承AbstractRoutingDataSource,实现方法

determineCurrentLookupKey 获取当前线程的数据源。

MybatisConfig:设置数据源,涉及DataSource,DynamicDataSource,sqlSessionFactory

DataSource(接口):数据源的对象化,驱动,连接地址,用户名,密码是他的属性,我们使用的是的是alibaba提供的Druid。

sqlSessionFactory:创建sqlSession(可以理解为jdbc里的connection)

DateBaseType

/** * 列出所有的数据源key(常用数据库名称来命名) * 注意: * 1)这里数据源与数据库是一对一的 * 2)DatabaseType中的变量名称就是数据库的名称 * @Author xuelongjiang */public enum DatabaseType {    main,yuntu}

DatabaseContextHolder

/** * 保存一个线程安全的DatabaseType容器 * @Author xuelongjiang */public class DatabaseContextHolder {    private static final  ThreadLocal
contextHolder = new ThreadLocal<>(); public static void setDatabaseType(DatabaseType type){ contextHolder.set(type); } public static DatabaseType getDatabaseType(){ return contextHolder.get(); }}

DynamicDataSource

/** * 动态数据源(需要继承AbstractRoutingDataSource) * @Author xuelongjiang */public class DynamicDataSource  extends AbstractRoutingDataSource{    @Nullable    @Override    protected Object determineCurrentLookupKey() {        return DatabaseContextHolder.getDatabaseType();    }}

MybatisConfig

/** * springboot集成mybatis的基本入口 1)创建数据源(如果采用的是默认的    tomcat-jdbc数据源,则不需要) * 2)创建SqlSessionFactory 3)配置事务管理器,除非需要使用事务,否则不    用配置 * @Author xuelongjiang */@Configuration // 该注解类似于spring配置文件@ComponentScan(basePackages = "fm.xiaoai.wxmanager.dao")public class MyBatisConfig {    @Autowired    private Environment environment;    /**     * 创建数据源(数据源的名称:方法名可以取为XXXDataSource(),XXX为数据    库名称,该名称也就是数据源的名称)    */    @Bean    public DataSource mainDataSource() throws Exception {        Properties props = new Properties();        props.put("driverClassName", environment.getProperty("main-datasource.driverClassName"));        props.put("url", environment.getProperty("main-datasource.url"));        props.put("username", environment.getProperty("main-datasource.username"));        props.put("password", environment.getProperty("main-datasource.password"));        return DruidDataSourceFactory.createDataSource(props);}    @Bean    public DataSource yuntuDataSource() throws Exception {        Properties props = new Properties();        props.put("driverClassName", environment.getProperty("yuntu-datasource.driverClassName"));        props.put("url", environment.getProperty("yuntu-datasource.url"));        props.put("username", environment.getProperty("yuntu-datasource.username"));        props.put("password", environment.getProperty("yuntu-datasource.password"));        return DruidDataSourceFactory.createDataSource(props);}    /**     * @Primary 该注解表示在同一个接口有多个实现类可以注入的时候,默认选择        哪一个,而不是让@autowire注解报错     * @Qualifier 根据名称进行注入,通常是在具有相同的多个类型的实例的一个    注入(例如有多个DataSource类型的实例)     */    @Bean    @Primary    public DynamicDataSource dataSource(@Qualifier("mainDataSource") DataSource mainDataSource,                                    @Qualifier("yuntuDataSource") DataSource yuntuDataSource) {        Map
targetDataSources = new HashMap<>(); targetDataSources.put(DatabaseType.main, mainDataSource); targetDataSources.put(DatabaseType.yuntu, yuntuDataSource); DynamicDataSource dataSource = new DynamicDataSource(); dataSource.setTargetDataSources(targetDataSources);// 该方法是AbstractRoutingDataSource的方法 dataSource.setDefaultTargetDataSource(mainDataSource);// 默认的datasource设置为myTestDbDataSource return dataSource; } /** * 根据数据源创建SqlSessionFactory */ @Bean public SqlSessionFactory sqlSessionFactory(@Qualifier("mainDataSource") DataSource mainDataSource, @Qualifier("yuntuDataSource") DataSource yuntuDataSource) throws Exception{ SqlSessionFactoryBean fb = new SqlSessionFactoryBean(); fb.setDataSource(this.dataSource(mainDataSource, yuntuDataSource)); fb.setTypeAliasesPackage("fm.xiaoai.exmanager");//可以不设置 fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); return fb.getObject(); } /** * 配置事务管理器 */ @Bean public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throws Exception { return new DataSourceTransactionManager(dataSource); }}

参考

关注我的公众号第一时间阅读有趣的技术故事

扫码关注:
也可以在微信搜索公众号即可关注我:codexiulian
渴望与你一起成长进步!

转载地址:http://hpbma.baihongyu.com/

你可能感兴趣的文章
第26天,Django之include本质
查看>>
Java中静态变量和实例变量的区别
查看>>
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>
D语言/DLang 2.085.1 发布,修复性迭代
查看>>
感觉JVM的默认异常处理不够好,既然不好那我们就自己来处理异常呗!那么如何自己处理异常呢?...
查看>>
Java 基础 之 算数运算符
查看>>
Windows下配置安装Git(二)
查看>>
一个最简单的基于Android SearchView的搜索框
查看>>
铁路开通WiFi“钱景”不明
查看>>
Facebook申请专利 或让好友及陌生人相互拼车
查看>>
电力“十三五”规划:地面光伏与分布式的分水岭
查看>>
美联社再告FBI:要求公开请黑客解锁iPhone花费
查看>>