首页 > 其他分享 >记一次MyBatis驼峰与下划线转化问题

记一次MyBatis驼峰与下划线转化问题

时间:2022-10-30 10:00:09浏览次数:44  
标签:实体类 下划线 驼峰 NPE 代码 adset MyBatis 日志 id


最近在做一个项目优化与重构,测试同学在回归功能测试时,指出一个页面功能有Bug,并扔出日志:

记一次MyBatis驼峰与下划线转化问题_字段


NPE嘛,这还不简单,根据日志记录的行数,定位到代码行数,都几乎不需要执行接口测试单步调试,几乎就可以确定修改方案如下:

记一次MyBatis驼峰与下划线转化问题_字段_02


于是,代码push,并提交Merge Request。过了几分钟,测试再次反馈,还是有Bug:

记一次MyBatis驼峰与下划线转化问题_字段_03


此时,如果死死分析上面的错误信息,就不难知道解决方案。奈何,我并没有参与之前的项目研发。对于这里面的业务逻辑并不清楚。另一方面,通过postman接口单步调试,发现这个方法超500行代码(这也是项目亟需优化与重构的原因),一时半会也不会很快理解里面的完整业务逻辑。这是后话。。

话说回来,我坚持跟测试同学说,这是NPE问题,日志里写的清清楚楚。但是测试坚持说,数据库明明有这一条数据:

  1. 证据1:
  2. 证据2,重新拿出文章开头的日志(修复NPE问题后,没有下面的错误stacktrace):

    Total: 1
    并且记录的SQL语句,和参数Parameters,和postman调试时,RequestBody一模一样。

此时才发现问题不仅仅是一个简简单单的NPE异常。

诸般死锁,加上leader的提示,此处可能

给出简化版的​​mybatis-config.xml​​配置文件:

<configuration>
<settings>
<!-- 数据库下划线写法自动改为java驼峰写法 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>

出错的代码片段:

ChannelAdset adset = channelJobMapper.getAdsetById(map.getLong("adset_id"));
if (adset != null) {
map.put("facebook_adset_id", adset.getFacebook_adset_id());
}

对应的mybatis mapper查询文件:​​ChannelJobMapper.xml​

<select id="getAdsetById" parameterType="Long" resultType="com.ppdai.cbd.platform.po.ChannelAdset">
select adset_id, facebook_adset_id
from channel_ad_adset
where adset_id = #{id}
</select>

对应的PO实体类:

@Data
@NoArgsConstructor
public class ChannelAdset implements Serializable {
private Long adset_id;
private String facebook_adset_id, account_id, status;
}

发现没有,实体类PO的定义,极其不规范:

  1. 没有使用驼峰命名;
  2. 多个字段使用一个private修饰符。

​mapUnderscoreToCamelCase​​配置为true,就是把数据表里面查询出来的下划线命名的字段映射到实体类的驼峰命名的属性字段。然后我们的PO实体类属性字段命名是下划线。导致实体类是一个空类,及仅仅只是一个new Object,Object里面的全部属性都是null。

最后总结一下:

日志记录不出问题来,select 查出数据,但是在mybatis转换层,就没有数据;之前没有空指针判断,报错NPE;加了空指针判断,条件不为空那行代码没有执行,导致出现

记一次MyBatis驼峰与下划线转化问题_字段_04


标签:实体类,下划线,驼峰,NPE,代码,adset,MyBatis,日志,id
From: https://blog.51cto.com/u_15851118/5807211

相关文章

  • 验证码案例的实现---MyBatis+Session+Cookie
    展示验证码(jsp页面)首先,我们需要自己利用BufferedImage类去生成一张可以变换的验证码图片;之后,我们就可以利用这样一串代码去将验证码里面的内容获取到:这是一串测试代码:O......
  • 对于MyBatis的模糊查询的实现+文本框、单选框以及复选框的数据回显的实现
    MyBatis的模糊查询sql语句与之前使用的不太一样主要是利用下面这种语句实现的(查了好久的,认真记一下吧!)select*fromhuodongwherethemelikeconcat('%',#{theme},'%......
  • Mybatis中#{}与${}的区别
    Mybatis中#{}与${}的区别#{}#{}表示一个占位符“?”,采用preparedStatement给占位符设置值,自动进行java类型和jdbc类型转换,进行预编译处理,#{}可以有效防止sql注入(预编译......
  • MyBatis初学心得
    一、MyBatis是一个优秀的大型持久层框架,用于简化JDBC的开发,javaee分为表现层、业务层和持久层三层架构。框架是一个半成品软件。  ......
  • 在 MyBatis 中使用 <、<= 等特殊符号
    在实际的开发中,经常会遇到一些场景,比如查询小于某个时间,或者是查询小于某个年龄等。这个时候就需要在MyBatis的XML文件中使用一些>=、<=等符号,但是如果直接使用的话......
  • 《MyBatis从入门到精通》读书笔记
    第一章mybatis入门第二章mybatisxml基本使用第三章mybatis注解基本使用不推荐的使用方法。优点:对于需求简单的系统,效率较高;缺点:SQL变化时,需要重新编译代码。四个......
  • MyBatis关联查询基础 | Java
    mybatis关系映射1.用户与订单的关系一个用户有多个订单,一个订单只属于一个用户查询一个用户的所有订单属于一对多查询示例publicinterfaceUserMapper{@......
  • Mybatis 之 自定义插件 yyyy-MM
    请结合上一篇>>> MP插件原理  <<<  以及  >>>  Mybatis插件原理 <<< 进行查看查看 使用场景:在写一些与月份为单位的场景中,如:薪资系统(月薪制)1、Ja......
  • Spring整合Mybatis
    spring中整合mybatis一先添加spring框架1.创建一个maven项目2.在pom.xml中添加springjar包<!--Spring--><dependency><groupId>org.springframework</groupI......
  • Mybatis 之 自定义别名处理插件
    请结合上一篇>>> MP插件原理  <<<  以及  >>>  Mybatis插件原理 <<< 进行查看查看 MP开发中,遇到的问题,动态的Wrapper产生的SQL中,主要出现在组合......