首页 > 其他分享 >乌龙!mybatis-plus的@TableId注解不生效,原来竟是因为它!

乌龙!mybatis-plus的@TableId注解不生效,原来竟是因为它!

时间:2023-11-28 20:13:24浏览次数:29  
标签:bug getById plus mybatis TableId PayMerchantBankCardFlow

【先来个小测试】

大家觉得下面的sql返回什么?

select * from table1 where null=1

 

答案:无返回。因为null=1是个false的表达式。这就像我们写where 1=2一样。

 

【↓↓正文开始↓↓】

需求开发完成,将开发分支merge到test分支,部署测试环境提测后,QA提了一个bug,附下面log截图。 


通过logtrace排查程序,定位到如下代码。代码很简单,调用mybatis-plus的getById函数按主键查数据得到entity对象。PayMerchantBankCardFlow这个实体类里在主属性里是标记了@TableId的。那么,mybatis-plus底层拼接sql时,怎么没有把主键字段拼出来呢?

PayMerchantBankCardFlow bankCardFlow = payMerchantBankCardFlowManager.getById(cardBindDTO.getFlowNo());

 

@TableName(value = "pay_merchant_bankcard_flow",autoResultMap = true)
public class PayMerchantBankCardFlow implements Serializable {

    private static final long serialVersionUID = 5112092241305418545L;

    /**请求流水号*/
    @JsonSerialize(using= ToStringSerializer.class)
    @TableId(type = IdType.ID_WORKER)
    private Long flowNo;

 

这确实令人费解!当时我在参加一个代码评审会,修复bug优先,于是临时在PayMerchantBankCardFlowManager里重写了getById。然后发布让QA继续后续的功能测试。

public class PayMerchantBankCardFlowManager{

    @Override
    public PayMerchantBankCardFlow getById(Serializable id) {
        return getOne(Wrappers.query(new PayMerchantBankCardFlow().setFlowNo((Long) id)));
    }

 

bugfix就算完事了吗?不,作为靠谱的程序员,我们有必要对这个bug查明原因。

一个小伙在本地通过junit测试,发现getById是没问题的。当然,凭借我们历往对mybatis-plus的掌握程度,这个@TableId必然不会有问题的。

但是结论呢?为什么本地没bug而测试环境有bug呢?

这时就考验技术人员的综合能力了。

还是组内的jason同学协助给破解了。

原来,在test分支里,PayMerchantBankCardFlow#flowNo的@TableId注解被别的开发分支给合没了。这下就真相大白了。

最终修正代码,还原临时改动的代码,这个乌龙事件得以消停。

 

 

 

标签:bug,getById,plus,mybatis,TableId,PayMerchantBankCardFlow
From: https://www.cnblogs.com/buguge/p/17862888.html

相关文章

  • element-plus 报错 ResizeObserver loop limit exceeded 解决
    解决方案代码如下:constdebounce=(fn,delay)=>{lettimer=null;returnfunction(){letcontext=this;letargs=arguments;clearTimeout(timer);timer=setTimeout(function(){fn.apply(context,args);},delay);}}......
  • mybatisPlus报orq.apache ibatisbinding.BindingException: Invalid bound statement
     出现这种问题依次检查下列内容1.检查xml映射文件中标签绑定包名地址是否正确(即namespace的值)2.检查xxxMapper接口中的方法,对应xml映射文件中是否有3.检查标签中的resultType是否与xxxMapper接口中的方法返回值类型一致,若一个是对象一个是集合,那也会报错~4.检查yml配置文件中......
  • MyBatisPlus主键生成策略
    @[TOC]什么是主键生成策略?在数据库中,每一行数据都需要一个唯一的标识符,这就是主键。主键生成策略决定了如何为新插入的行生成这个唯一标识符。不同的数据库和框架提供了不同的主键生成策略选项。MyBatisPlus中的主键生成策略AUTO:这是默认的策略,根据数据库的不同自动选择合适的主......
  • 带有 on duplicate key update 的批量插入 mybatisPlus
    1packagecom.autewifi.dataaods.common.data.datascope;23importcom.baomidou.mybatisplus.annotation.IdType;4importcom.baomidou.mybatisplus.core.enums.SqlMethod;5importcom.baomidou.mybatisplus.core.injector.AbstractMethod;6importcom......
  • mybatis---CURD
    查询记录<selectid="getUserList"resultType="org.example.pojo.User">select*fromuser.use1</select><selectid="getUserByid"resultType="org.example.pojo.User"parameterType="i......
  • MyBatis `<include refid="XXX">`标签详解
    MyBatis<includerefid="XXX">标签详解MyBatis作为一种优秀的持久化框架,提供了丰富的XML配置选项,其中<include>标签是一个非常有用的特性,用于引入SQL片段,提高代码的可维护性和可读性。解释<include>标签用于引用SQL代码片段。refid是引用的SQL片段的id名称,必须保持唯一。......
  • MyBatis 大于等于小于等于常用写法
    前言经常在工作中使用mybatis范围筛选的时候忘记大于等于小于怎么写,这里做记录分享给有需要的人。不喜别喷方法一:使用转义字符含义原符号转义字符小于<<小于等于<=<=大于>>大于等于>=>=逻辑与(和)&&amp;单引号‘&apos;双引号“"使用示......
  • 若依集成mybatisplus实现mybatis增强
    ......
  • 【C++ Primer Plus】类、运算符重载、虚函数、友元函数模板
    1.运算符重载1.1普通运算符重载在类内重写operator+函数,实现加号运算符的重载,下面给出了两种调用方式,注意加号前为调用者,加号后为参数,第三行代码的完整写法实际上是第四行TimeTime::operator+(intminutes)const;Timetime;Timetime2=time+50;Timetime3=time.o......
  • 一文讲明Mybatis 的使用 超详细 【爆肝两万字教程】
    >我|在这里>......