【Mybatis-Plus】调用updateById方法,部分字段有赋值却未更新问题。

文章讨论了在项目中使用自定义service层和mapper层的updateById方法时遇到的问题,即新字段未被更新。原因在于自定义方法未处理这些字段,解决方案包括注释自定义方法或在方法中添加缺失字段处理。

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

问题描述

项目内有自定义的service层和mapper层的updateById方法。

后续有新增字段,懒得去修改xml文件,索性直接调用mybatisplus的updateById方法,发现有的字段明明赋值了,但是并没有对这个字段进行修改,调试发现mp生成的sql并没有对这些字段进行修改。

因为service层有一个自定义的updateById方法,用了super.updateById来调用mp的方法

@Override
public boolean updateById(CustomerBankLimitContract customerBankLimitContract) {
   UserInfoCache cacheInfo = CacheDataUtil.getAuthUserInfo();
   Preconditions.checkNotNull(cacheInfo);

   LocalDateTime now = LocalDateTime.now();
   customerBankLimitContract.setUpdateTime(now);
   customerBankLimitContract.setUpNo(cacheInfo.getUsrId());
   boolean result = super.updateById(customerBankLimitContract);
   if (!result) {
       throw new FrontBusiException("更新失败,数据不存在或内容输入错误");
   }
   return result;
}

原因分析:

default boolean updateById(T entity) {
       return SqlHelper.retBool(this.getBaseMapper().updateById(entity));
}

查看mp的updateById源码发现,service层的方法本质上还是调用的mapper层的updateById。

项目中mapper层也有一个自定义的updateById方法,此时mp会调用自定义的方法而不是其自带的方法。

由于自定义的方法没有对这些字段去处理,所有这些字段是不会更新的。


解决方案:

在dao层将自定义的updateById方法给注释或者换名字,对应的xml也注释了或者换名字。

或者去自定义方法中补全字段。。。

### 如何在 MyBatis-Plus 中使用 Join 查询并指定字段MyBatis-Plus 的生态系统中,`mybatis-plus-join` 是一款非常强大的多表联查插件。它允许开发者轻松实现复杂的联表查询逻辑,并且可以灵活地指定需要的字段。 #### 插件简介 `mybatis-plus-join` 提供了一种无缝的方式来进行多表联查,完全遵循 MyBatis-Plus (MP) 的设计风格[^3]。这意味着如果你已经熟悉 MP 的基本用法,则无需学习新的语法即可快速上手 `mybatis-plus-join`。 --- #### 指定字段方法 当使用 `mybatis-plus-join` 进行联表查询时,可以通过以下几种方法来指定所需的字段: 1. **通过 Select 方法显式声明所需字段** 在构建查询条件时,可以直接调用 `select()` 方法来明确指出希望获取哪些字段。这不仅提高了性能,还减少了不必要的数据传输。 ```java List<UserVo> list = new MpJLambdaWrapper<>() .select(User::getUserId, User::getName) // 显式选择 userId 和 name 字段 .leftJoin(Department.class, d -> d.getDeptId().eq(User::getDeptId)) .list(new UserVo()); ``` 2. **利用自定义 VO 类映射特定字段** 如果仅需部分字段而不是整个实体对象,可以创建一个专门用于接收查询结果的数据传输对象 (DTO 或 VO),并通过构造器注入或手动赋值完成字段匹配。 ```java public class UserDepartmentVo { private Long userId; private String userName; private String departmentName; // Getters and Setters... } ``` 配合上述代码片段中的 `UserVo` 替换为目标类实例化即可。 3. **设置别名以区分同名列冲突** 当两个表存在相同名称列的情况下(如 id),可通过设定别名为每张表分配唯一标识符从而避免混淆问题发生。 ```java List<Map<String, Object>> resultMaps = new MpJWrapper() .selectAs(User::getId, "userId") // 将 user 表 ID 设置为 userId 别名 .selectAs(Department::getId, "deptId") // 将 department 表 ID 设为 deptId 别名 .innerJoin(Department.class, Department::getUserId.eq(User::getId)) .getResultMap(); ``` 4. **链式调用来简化复杂 SQL 构建过程** 借助 Lambda 表达式的强大功能以及流利接口模式的支持下,能够更加直观简洁地表达我们的意图而不需要编写冗长繁琐的传统字符串拼接形式SQL语句。 --- #### 示例代码展示 以下是基于官方文档的一个简单例子演示如何执行带字段筛选的 JOIN 操作: ```java // 导入必要的依赖包 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.ylchang.mpj.MpJLambdaWrapper; import java.util.List; public class ExampleService { public void queryWithFields() { // 创建 Wrapper 对象 MpJLambdaWrapper<OrderEntity> wrapper = new MpJLambdaWrapper<>(); // 添加联结条件 wrapper.innerJoin(ProductEntity.class, product -> product.getId().eq(OrderEntity::getProductId)); // 指定要查询的字段 wrapper.select( OrderEntity::getOrderId, // 订单编号 ProductEntity::getProductName // 商品名称 ); // 执行分页查询 Page<OrderProductVO> pageResult = orderMapper.pageJoin( new Page<>(current, size), wrapper.allEq(map), OrderProductVO.class // 自定义的结果集模型 ); System.out.println(pageResult); } } ``` 此示例展示了如何在一个订单管理系统里关联产品信息的同时只提取必要属性组合成一个新的视图结构。 --- ### 总结 综上所述,在 MyBatis-Plus 中借助第三方库 `mybatis-plus-join` 能够方便快捷地达成跨多个关系型数据库表格之间相互参照的需求;与此同时还可以精确控制最终输出记录所含有的具体项数及其顺序安排等问题[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值