mybatis 中 多数据 map 结果集 转驼峰 返回null值 yml 设置方式

mybatis:
  mapper-locations: classpath:/mapper/*Dao.xml
  configuration:
    call-setters-on-nulls: true
    map-underscore-to-camel-case: true
    object-wrapper-factory: com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory

// 报错问题后 加入如下配置 
package com.clear.tracesource.common.db.config;

import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
@ConfigurationPropertiesBinding
public class ObjectWrapperFactoryConverter implements Converter<String,ObjectWrapperFactory> {
    @Override
    public ObjectWrapperFactory convert(String source) {
        try {
            return (ObjectWrapperFactory) Class.forName(source).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

// 因为多数据源,yml中的配置会不生效,需要加入如下配置

 @Bean()
    @ConfigurationProperties(prefix = "mybatis.configuration")
    public org.apache.ibatis.session.Configuration configuration(){
        return new org.apache.ibatis.session.Configuration();
    }
    @Bean(name = "sessionFactory")
    public SqlSessionFactory sessionFactory(@Qualifier("dynamicDataSource") DataSource dataSource, org.apache.ibatis.session.Configuration configuration) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        //*Mapper.xml位置
        sessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        sessionFactoryBean.setConfiguration(configuration);
        return sessionFactoryBean.getObject();
    }
<think> 我们已知用户的问题:在Yml文件中同时配置多个数据源时,如何使用Mybatis-Plus? 根据之前的引用,我们有关于多数据源配置的信息。特别是引用[2]和引用[3]提供了多数据源的配置方法。 引用[2]展示了在Spring Boot中通过配置类设置MybatisPlusInterceptor(包含分页插件)并指定了Mapper扫描路径。 引用[3]则展示了在application.yml中配置动态数据源(使用dynamic datasource)的方法,并通过`@DS`注解切换数据源。 因此,我们可以总结出在Yml文件中配置多个数据源并结合Mybatis-Plus使用的步骤如下: 1. 添加多数据源依赖(如dynamic-datasource-spring-boot-starter) 2. 在application.yml中配置多个数据源(使用dynamic datasource配置),并指定默认数据源 3. 配置Mybatis-Plus(例如分页插件等)时,注意多数据源环境下的特殊配置(可能需要为每个数据源配置不同的方言,但引用[2]中在一个拦截器里添加了多个分页拦截器,每个对应不同的数据库类型) 4. 在Mapper接口或Service方法上使用`@DS`注解来指定具体的数据源 需要注意的是,引用[4]提到了在多数据源环境下事务的问题,即一个事务只能对应一个数据源,不能跨数据源事务。 下面我们详细展开步骤: </think> ### MyBatis-Plus 多数据源配置与使用指南 在 YAML 文件中配置多数据源时,需结合 **dynamic-datasource** 组件实现数据源动态切换,以下是完整流程: --- #### **1. 添加依赖** ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> ``` --- #### **2. YAML 配置文件** (`application.yml`) ```yaml spring: datasource: dynamic: primary: master # 默认数据源 datasource: master: # 数据源1 url: jdbc:mysql://localhost:3306/db1 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver slave: # 数据源2 url: jdbc:mysql://localhost:3306/db2 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true # 驼峰命名 ``` > **注**: > - 通过 `dynamic.datasource` 定义多个数据源 > - `primary` 指定默认数据源[^3] --- #### **3. 配置 MyBatis-Plus 插件** ```java @Configuration public class MybatisConfig { // 分页插件(需适配每个数据源的数据库类型) @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` --- #### **4. 数据源动态切换** 使用 `@DS` 注解指定操作的数据源: ```java // 默认使用 master 数据源 @Mapper public interface UserMapper extends BaseMapper<User> { // 方法级切换:查询 slave 数据源 @DS("slave") @Select("SELECT * FROM user WHERE age > #{age}") List<User> selectByAge(int age); } // 类级切换:所有方法使用 slave 数据源 @DS("slave") @Service public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Override public List<Order> listOrders() { return orderMapper.selectList(null); // 自动访问 slave 库 } } ``` --- #### **5. 编程式切换数据源** 手动控制数据源上下文: ```java @Service public class DataSyncService { @Autowired private DynamicDataSourceContextHolder contextHolder; public void syncData() { // 切换到 slave 数据源 contextHolder.push("slave"); List<User> slaveUsers = userMapper.selectList(null); // 切换回默认 master 数据源 contextHolder.poll(); userMapper.insert(new User(...)); } } ``` > **事务注意**:单个方法内禁止跨数据源事务操作[^4] --- #### **6. 多数据源事务管理** 需使用分布式事务框架(如 Seata): ```java @DS("master") @GlobalTransactional // Seata分布式事务注解 public void crossDBUpdate() { masterMapper.update(...); // 操作 master 库 contextHolder.push("slave"); slaveMapper.delete(...); // 操作 slave 库 contextHolder.clear(); } ``` --- ### 关键总结 | 功能 | 实现方式 | 示例 | |--------------------|------------------------------|----------------------| | **数据源声明** | `spring.datasource.dynamic` | YAML 配置[^3] | | **静态切换** | `@DS("数据源名")` | 注解类/方法[^3] | | **动态切换** | `DynamicDataSourceContextHolder` | 编程式控制[^4] | | **分页插件** | `PaginationInnerInterceptor` | 配置类声明[^2] |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值