Springboot 多数据源配置

环境: JDK17 springboot 3.2.4 durid 1.2.23

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.23</version>
</dependency>

新建数据连接配置类(其它数据源参考下方配置即可)

@SpringBootConfiguration
@MapperScan(basePackages = {"com.galaxy.**.db.mapper"}, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class DruidConfiguration {}
  1. 通常在单数据源项目中我们习惯于配置MapperScan在启动类中,且sqlSessionFactoryRef未做指定(未作指定会读取服务中唯一的factory或标记了@Primary的factory)
  2. masterSqlSessionFactory 在下面配置sqlSessionFactor时指明bean的名称相同即可。
  3. 那么在多数据源下可以配置在各自的配置文件中方便维护。
  4. 多数据源下可以对以下相同的bean添加@Primary标记主数据源。
  • 数据源配置
 @Bean(name = "masterDataSource")
 public DataSource masterDataSource() {
     return buildDataSource(url, username, password);
 }

构建数据源公共方法

 public DataSource buildDataSource(String url,String username,String password) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUsername(username));
        dataSource.setPassword(password);
        //初始连接数
        dataSource.setInitialSize(1);
        //最大连接数
        dataSource.setMaxActive(20);
        //最小连接数
        dataSource.setMinIdle(5);
        //获取连接等待超时时间
        dataSource.setMaxWait(60000);
        //间隔60秒检测一次需要关闭的空闲连接
        dataSource.setTimeBetweenEvictionRunsMillis(60000);
        //一个连接在池中的最小生存时间30秒
        dataSource.setMinEvictableIdleTimeMillis(30000);
        //打开PSCache
        dataSource.setPoolPreparedStatements(true);
        //指定每个连接上PSCache的大小
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
        return dataSource;
    }
  • 事务配置
 @Bean(name = "masterTransactionManager")
 public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
     return new DataSourceTransactionManager(dataSource);
 }
  • SqlSessionFactory 配置

mybatis的配置需要在这里配置进去,比如前面提到的自定义的插件(Mybatis SQL自定义拦截器

 @Bean(name = "masterSqlSessionFactory")
 public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
     return buildSqlSessionFactory(dataSource, "classpath*:mappers/*Mapper.xml", );
 }

构建sqlSessionFactory公共方法

  1. locationPattern: mybatis xml sql的文件地址。
  2. MybatisSqlInterceptor:是我们之前介绍的自定义sql拦截器
  3. PaginationInnerInterceptor:是mybatis的分页插件,可以自己注入Bean修改分页插件配置,如默认的单页限制500可以自定义单页数 setLimit(size)
  4. MybatisMetaObjectHandler: 自定义的实现MetaObjectHandler接口,覆写其中的insertFill和updateFill方法配合实体类属性上标注的注解@TableField(fill = FieldFill.INSERT_UPDATE)实现字段属性值填充
public SqlSessionFactory buildSqlSessionFactory(DataSource dataSource, String locationPattern) {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        //数据源
        sessionFactory.setDataSource(dataSource);
        //xml文件路径
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources(locationPattern));
        //mybatis日志和驼峰
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        mybatisConfiguration.setLogImpl(StdOutImpl.class);
        mybatisConfiguration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(mybatisConfiguration);
         //分页插件、自定义的sql拦截插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        sessionFactory.setPlugins(interceptor, new MybatisSqlInterceptor());
        //设置实体类填充字段值的mybatis拦截器
        GlobalConfig globalConfig = GlobalConfigUtils.defaults();
        globalConfig.setMetaObjectHandler(new MybatisMetaObjectHandler());
        sessionFactory.setGlobalConfig(globalConfig);
        return sessionFactory.getObject();
}
  • SqlSessionTemplate 配置
 @Bean(name = "masterSqlSessionTempalte")
 public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
   return new SqlSessionTemplate(sqlSessionFactory);
 }

可以使用sqlSessionTemplate执行xml sql中的方法

//namespace是xml中配置的<mapper namespace = "com.galaxy.**"> methold是具体的方法标签中的id值 <select id="selectList">
sqlSessionTemplate.selectList("namespace.methold",params);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值