在开发中,有时候咱们的数据库是作了读写分库的处理的。那么在开发使用的时候须要读取不一样来源的数据库,咱们须要配置spring-boot mybatis进行多数据源处理。html
DatabaseContextHolder:在dao层或service层用来选择使用那个数据源。java
DateBaseType:枚举类,枚举全部的数据源名。spring
DynamicDataSource:继承AbstractRoutingDataSource,实现方法
determineCurrentLookupKey 获取当前线程的数据源。sql
MybatisConfig:设置数据源,涉及DataSource,DynamicDataSource,sqlSessionFactory数据库
DataSource(接口):数据源的对象化,驱动,链接地址,用户名,密码是他的属性,咱们使用的是的是alibaba提供的Druid。tomcat
sqlSessionFactory:工厂模式建立sqlSession(能够理解为jdbc里的connection)安全
/** * 列出全部的数据源key(经常使用数据库名称来命名) * 注意: * 1)这里数据源与数据库是一对一的 * 2)DatabaseType中的变量名称就是数据库的名称 * @Author xuelongjiang */ public enum DatabaseType { main,yuntu }
/** * 保存一个线程安全的DatabaseType容器 * @Author xuelongjiang */ public class DatabaseContextHolder { private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>(); public static void setDatabaseType(DatabaseType type){ contextHolder.set(type); } public static DatabaseType getDatabaseType(){ return contextHolder.get(); } }
/** * 动态数据源(须要继承AbstractRoutingDataSource) * @Author xuelongjiang */ public class DynamicDataSource extends AbstractRoutingDataSource{ @Nullable @Override protected Object determineCurrentLookupKey() { return DatabaseContextHolder.getDatabaseType(); } }
/** * 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<Object, Object> 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); } }
http://www.cnblogs.com/java-z...springboot
关注个人公众号第一时间阅读有趣的技术故事
扫码关注:
也能够在微信搜索公众号便可关注我:codexiulian
渴望与你一块儿成长进步!微信