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 ThreadLocalcontextHolder = 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
参考
关注我的公众号第一时间阅读有趣的技术故事
扫码关注:也可以在微信搜索公众号即可关注我:codexiulian 渴望与你一起成长进步!