工作小记2:MyBatis中遇到的小问题(一)

在日常工作中,接触到的orm框架最多得到是mybatis和mybatis plus。这篇文章记一下最近时间遇到的一些问题。后面有新问题还会继续记录。

实体类字段类型问题。

之前遇到一个问题,主要是应用钉钉审批流时,业务对象在数据库的值被改写。

审批流的业务就是新增接口处理完前置业务逻辑后,保存业务数据到数据库,然后发一条消息。消息中主要是发起审批流,发起审批流后会对之前保存的业务数据进行修改,主要是修改一些审批流的一些字段,审批流ID呀,审批流创建人,审批流状态这些。

然后问题来了,有几个布尔值,业务逻辑设置好了true后,一过审批流就被改成false。因为审批流发起的业务通过MyBatis生成了数据库对象,然后去修改了数据库的值。最开始我以为是数据库默认值的问题,后面发现不行。最后打断点发现,问题出在业务类的字段类型。

一般来说数据库类都是包装类型,但是这类的几个布尔值的类型用的是基元类型,然后MyBatis看到这个类型直接赋值false。然后MyBatisPlus修改的时候,这几个值就覆盖掉了正确的true值。

这个问题,主要是大意,另外是不了解这个小知识。

MyBatis在处理基元类型(如int, long, float, double等)时,如果数据库字段为NULL,则会使用基元类型的默认值(如int的默认值为0)。如果你希望MyBatis在获取结果时,对于基元类型字段如果数据库值为NULL时能够映射为null而不是默认值,你可以通过配置typeHandlers来实现。

类型转换问题

公司有个新人同事,有一天找我说他的接口数据一直不对,找我帮忙看看。

问题是这样的:在XML中写SQL语句时,if标签中非空判断的时候写的是 != null and != ’ ‘。有些朋友可能已经想到了。这个字段是一个Integer类型的值,在MyBatis里面,如果Integer的值是0,那么在生成查询语句的判断条件中,会被转成’ ',这个时候你就发现了,是0的时候,会判断会空导致查询条件进不去,最后查询数据一直不对。

这是一个小问题,稍微注意就好了。

null值更新问题。

MyBatisPlus更新的时候,null值默认是不更新的,但是我们业务中有的时候有些字段偏偏就是空值,有几个方法可以更新为空值,常见三个方法是修改全局配置,二是数据库实体类对应字段上加注解,三是使用updateWrapper。第二个注解不能说是坑,主要是团队成员不了解这个注解导致这个值在有的地方该更新为null的时候更新了,在不该更新的时候也更新了。

这里建议大家还是使用第三种方法,打个样:

mapper.update(
    null,
    Wrappers.<User>lambdaUpdate()
        .set(User::getBlogName, "明月望秋思的博客")
		.set(User::getUrl, "https://blog.xieqin.online")
        .set(User::getAge, null) // 把email设置成null
        .eq(User::getBlogId, 1)
);

消息事务问题(这个问题单独算mybatis的坑其实不太合理,属于开发者问题算是)

项目中的队列是kafka。有一个业务需要计算某个值,但是这个值在当前函数的业务中会计算一次,在消息消费的时候也会计算一次。有经验的同学就知道问题了,这个消息消费完,该值有时候会不准。这是因为事务的问题,消息消费的时候事务还未提交,消息消费的时候该值查询出来还是未经过原函数业务计算得值。这种情况该怎么办呢?最简单的办法,设置消息为事务提交后发送:

 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
           kafka.send();
        }
 });
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值