Mybatis-Plus中@TableField失效问题及解决

当在Mybatis-Plus中遇到@TableField注解不起作用,导致驼峰命名转换失败的问题时,通常是由于Mybatis-Plus默认的驼峰转下划线策略与自定义查询冲突。解决方法是取消@TableField注解,或者在QueryWrapper的select方法中直接使用原始字段名。例如,在查询条件中,将字段参数改为原来的字段名称,如`department_id`,以确保查询语句正确生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🎈 1 参考文档

Mybatis-Plus中@TableField失效问题及解决 | weixin_42414047-CSDN


🔍2 问题描述

mybatisplus默认开启驼峰命名,所以一般不需要使用@TableField注解,但是我在项目中就算加上了该注解,在日志中的select语句中也显示是departmentId。

在这里插入图片描述


💡3 原因分析

根据参考文档分析:默认情况下Mybatis-Plus会根据@TableFiled生成别名,
而自己指定了QueryWrapper的select属性后就仅仅是属性值而没有了别名。

我的代码:

在这里插入图片描述

在这里插入图片描述


🚀4 解决方法

去掉@TableField注解:

在这里插入图片描述

将wrapper方法中的字段参数改成原来字段的名称:

在这里插入图片描述

    //我的代码参考
    //条件查询带分页
    @PostMapping("findPageUser/{current}/{limit}")
    public Result findPageUser(@PathVariable Integer current, @PathVariable Integer limit, @RequestBody(required = false) UserQueryVo UserQueryVo) {
        //创建page对象,传递当前页,每页记录数
        Page<User> page = new Page<>(current, limit);
        //构建条件
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        String departmentId = UserQueryVo.getDepartmentId();//角色科室id

        if (!StringUtils.isEmpty(departmentId)) {
            wrapper.eq("department_id", departmentId);
        }
        //调用方法实现分页查询
        Page<User> UserPage = userService.page(page, wrapper);
        
        //返回结果
        return Result.ok(UserPage);
    }
### MyBatis-Plus 批量更新失效的原因及解决方案 #### 1. 配置问题 MyBatis-Plus 的批量更新功能依赖于底层数据库的支持以及 Spring Boot 数据源的正确配置。如果未启用 `allowMultiQueries` 参数,则可能导致批量更新失败或抛出异常[^2]。这是因为某些数据库驱动默认情况下不允许执行多条 SQL 语句在一个请求中完成。 解决方法是在数据源 URL 中显式开启该选项,例如 MySQL 数据库可以这样设置: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true ``` #### 2. 插入/更新对象的数据校验 当调用 MyBatis-Plus 提供的批量更新方法(如 `updateBatchById` 或自定义实现)时,需确保传入的对象列表满足以下条件: - **字段非空验证**:对象中的主键字段不能为空,否则无法匹配到对应的记录进行更新。 - **字段映射一致性**:实体类属性名应与数据库列名保持一致,或者通过注解 `@TableField` 进行手动映射[^1]。 #### 3. 性能优化与分批处理 对于大规模数据集的操作,一次性提交可能引发性能瓶颈甚至超时错误。推荐采用分批方式来减少每次操作的影响范围。可以通过如下代码片段展示如何实现分批更新: ```java import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.List; @Service public class YourServiceImpl extends ServiceImpl<YourMapper, YourEntity> { public void batchUpdate(List<YourEntity> list) { int batchSize = 500; // 设置每批次大小 for (int i = 0; i < list.size(); i += batchSize) { int toIndex = Math.min(i + batchSize, list.size()); updateBatchById(list.subList(i, toIndex)); // 调用内置方法 } } } ``` 上述代码利用了 MyBatis-Plus 内建的 `updateBatchById` 方法,并将其分割成若干个小批次逐一提交给数据库处理[^3]。 #### 4. 自定义 SQL 注入器冲突 如果项目中有自定义 SQL 注入器但未正确注册或覆盖了框架原有的行为,可能会导致批量更新逻辑被忽略。此时需要检查是否遗漏了必要的 Bean 定义,比如下面的例子展示了如何声明一个兼容的标准注入器实例: ```java @Bean public MybatisSqlInjector sqlInjector() { return new DefaultSqlInjector(); } ``` 另外还需注意的是,在重写父类方法时要小心保留原有功能以免破坏预期的行为模式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值