Spring-Boot + Mybatis 多数据源配置

简介: Spring-Boot + Mybatis 多数据源


折腾了一天,终于完成了多数据源的配置,记录在这里!

1,先上SpringBoot 基础配置



        ①,系统引入了Security的包,但是没有配置Security相关信息,在启动时会打印警告log,故这里排除SecurityAutoConfiguration这个类


2,配置两个数据源



@Configuration
public class DataBaseConfig implements EnvironmentAware {

	private RelaxedPropertyResolver dbPropertyResolver;

	private static final Logger logger = LoggerFactory.getLogger(EnvironmentAware.class);

	@Override
	public void setEnvironment(Environment environment) {
		dbPropertyResolver = new RelaxedPropertyResolver(environment,"jdbc.");
	}


	/**
	 * 写库
	 * @return
	 */
	@Bean(name="writeDataSource", destroyMethod = "close", initMethod="init")
	@Primary
	public DataSource writeDataSource() {
		DruidDataSource datasource = new DruidDataSource();
		datasource.setUrl(dbPropertyResolver.getProperty("url"));
		datasource.setDriverClassName(dbPropertyResolver.getProperty("driverClass"));
		datasource.setUsername(dbPropertyResolver.getProperty("username"));
		datasource.setPassword(dbPropertyResolver.getProperty("password"));
		return datasource;
	}

	/**
	 * 读库
	 * @return
	 */
	@Bean(name="readDataSource", destroyMethod = "close", initMethod="init")
	public DataSource readOneDataSource() {
		DruidDataSource datasource = new DruidDataSource();
		datasource.setUrl(dbPropertyResolver.getProperty("url"));
		datasource.setDriverClassName(dbPropertyResolver.getProperty("driverClassName"));
		datasource.setUsername(dbPropertyResolver.getProperty("username"));
		datasource.setPassword(dbPropertyResolver.getProperty("password"));
		return datasource;
	}
}

②,将写库作为默认主数据源,在注入时,若没有指定该注入哪一个数据源,默认注入使用写库数据源



3,配置只读数据源与Mybatis的配置信息



@Configuration
@EnableTransactionManagement
@AutoConfigureAfter(WriteMybatisConfig.class)
public class ReadMybatisConfig implements EnvironmentAware {

	/**
	 * 日志记录器
	 */
	private static final Logger LOGGER = LoggerFactory.getLogger(ReadMybatisConfig.class);

	private RelaxedPropertyResolver mybatisPropertyResolver;

	/**
	 * 获取配置信息
	 * @param environment
	 */
	@Override
	public void setEnvironment(Environment environment) {
		mybatisPropertyResolver = new RelaxedPropertyResolver(environment,"mybatis.");
	}

	//从库数据源
	@Resource(name = "readDataSource")
	private DataSource readDataSource;

	/**
	 * 只读sqlSessionFactory
	 * @return
	 */
	@Bean(name = "readSqlSessionFactory")
	public SqlSessionFactory readSqlSessionFactory() {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(readDataSource);
		bean.setTypeAliasesPackage(mybatisPropertyResolver.getProperty("typeAliasesPackage"));

		//分页插件
		PageHelper pageHelper = new PageHelper();
		Properties properties = new Properties();
		properties.setProperty("reasonable", "true");
		properties.setProperty("supportMethodsArguments", "true");
		properties.setProperty("returnPageInfo", "check");
		properties.setProperty("params", "count=countSql");
		pageHelper.setProperties(properties);
		bean.setPlugins(new Interceptor[]{pageHelper});

		//添加mybatis配置文件
		PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
		bean.setConfigLocation(resourceResolver.getResource(mybatisPropertyResolver.getProperty("configLocation")));
		try {
			bean.setMapperLocations(resourceResolver.getResources(mybatisPropertyResolver.getProperty("mapperLocations")));
			return bean.getObject();
		} catch (IOException e) {
			LOGGER.error("获取mapper资源出现异常",e);
			throw new RuntimeException("获取mapper资源出现异常",e);
		} catch (Exception e){
			LOGGER.error("初始化sqlSessionFactory时出现异常",e);
			throw new RuntimeException("初始化sqlSessionFactory时出现异常",e);
		}
	}

}

4,配置写数据源与Mybatis的配置



@Configuration
@EnableTransactionManagement
@AutoConfigureAfter
public class WriteMybatisConfig implements EnvironmentAware {
    public static final Logger LOGGER = LoggerFactory.getLogger(WriteMybatisConfig.class);

	private RelaxedPropertyResolver mybatisPropertyResolver;

	@Override
	public void setEnvironment(Environment environment) {
		mybatisPropertyResolver = new RelaxedPropertyResolver(environment,"mybatis.");
	}

	//写库
	@Resource(name = "writeDataSource")
    private DataSource writeDataSource;

	/**
	 * 可读可写sqlSessionFactory
	 * @return
	 */
    @Bean(name = "writeSqlSessionFactory")
    public SqlSessionFactory writeSqlSessionFactory() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(writeDataSource);
        bean.setTypeAliasesPackage(mybatisPropertyResolver.getProperty("typeAliasesPackage"));

        //分页插件
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("reasonable", "true");
        properties.setProperty("supportMethodsArguments", "true");
        properties.setProperty("returnPageInfo", "check");
        properties.setProperty("params", "count=countSql");
        pageHelper.setProperties(properties);
        bean.setPlugins(new Interceptor[]{pageHelper});

        //添加mybatis配置文件
		PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
		bean.setConfigLocation(resourceResolver.getResource(mybatisPropertyResolver.getProperty("configLocation")));
        try {
			bean.setMapperLocations(resourceResolver.getResources(mybatisPropertyResolver.getProperty("mapperLocations")));
			return bean.getObject();
        } catch (IOException e) {
			LOGGER.error("获取mapper资源出现异常",e);
            throw new RuntimeException("获取mapper资源出现异常",e);
        } catch (Exception e){
			LOGGER.error("初始化sqlSessionFactory时出现异常",e);
			throw new RuntimeException("初始化sqlSessionFactory时出现异常",e);
		}
    }

	/**
	 * 因为当前项目中有
	 * @return
	 */
	@Bean(name = "writeTransactionManager")
	public DataSourceTransactionManager writeTransactionManager() {
		DataSourceTransactionManager manager = new DataSourceTransactionManager(writeDataSource);
		return manager;
	}


}


注意,写数据源对应的持久化操作需要用到事务,所以配置了 DataSourceTransactionManager


5,配置Mybatis的Mapper扫描器



@Configuration
public class MybatisMapperScannerConfig {

	/**
	 * 扫描读写模式-mapper,只有在basePackage包下且继承自BaseWriterMapper的mapper才会被扫描到
	 * @return
	 */
	@Bean(name = "writeMapperScanner")
	public MapperScannerConfigurer writeMapperScanner(){
		MapperScannerConfigurer configurer = new MapperScannerConfigurer();
		configurer.setBasePackage("com.llktop.dao");
		configurer.setMarkerInterface(BaseWriteMapper.class);
		configurer.setSqlSessionFactoryBeanName("writeSqlSessionFactory");
		return configurer;
	}

	/**
	 * 扫描只读模式-mapper,只有在basePackage包下且继承自BaseReadMapper的mapper才会被扫描到
	 * @return
	 */
	@Bean(name = "readMapperScanner")
	public MapperScannerConfigurer readMapperScanner(){
		MapperScannerConfigurer configurer = new MapperScannerConfigurer();
		configurer.setBasePackage("com.llktop.dao");
		configurer.setMarkerInterface(BaseReadMapper.class);
		configurer.setSqlSessionFactoryBeanName("readSqlSessionFactory");
		return configurer;
	}
}

注意,这里多配置了一个叫MarkerInterface的属性,目的是,所有的mapper中只有继承自BaseWriteMapper这个类的Mapper会走写数据源,而所有继承自ReadMapper的Mapper会走读数据源


这样,就做到了多套数据源,可以配合Mysql读写分离进行使用!



目录
相关文章
|
2月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
2月前
|
XML Java 数据库连接
MyBatis的常见配置
MyBatis 常见配置包括数据库连接、类型别名、映射器等核心模块,合理配置可提升开发效率与系统性能。主要内容涵盖核心配置文件结构、关键配置项详解及配置优先级说明。
346 4
|
2月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
2月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
1月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
540 5
|
3月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
281 18
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
182 0
探索Spring Boot的@Conditional注解的上下文配置
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1019 1
Spring boot 使用mybatis generator 自动生成代码插件
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
704 0

热门文章

最新文章