2023-05-19 17:42阅读: 810评论: 0推荐: 0

开发手记:简单的mapper接口查询数据为空?

问题描述

简单的mapper查询接口返回的数据,但是却查不到数据,返回null,问题出现在两处,分别是简单的单查询和分页查询

问题定位

简单的断点调试后确定问题出在Dao层,也就是mapper接口,于是接下来:

  • 检查了数据库表数据,没有问题
  • 静态检查并单独提取了xml中的SQL语句手动执行,没有问题
  • 使用Junit单测了mapper接口(参数写死),没有问题

最离谱并且让我非常费解的是:


打断点,参数没有问题,但是就是查询返回null。
而我在下面补一句一摸一样的查询语句,唯一的区别是参数是写死的,但是是与请求参数是一样的,结果是上一句返回null下一句就成功查到数据了

MyBatis参数注入?

我百思不得其解,也有想到可能是传参得问题,但是感觉不应该呀,以前都没有出过问题,于是去咨询了一下其他朋友的意见
给出的参考猜测是:

可能是参数没绑定参数名的原因,要么加注解,要么转成map或者对象,又或者xml里面用 0 ,1 ,2代替这三个参数,0,1,2指的是参数的顺序

注解我知道@Param,对于多参数的分页查询我觉得有道理,可能是因为参数没能正确匹配上,虽然以前似乎没出过错
而对于单参数得查询我对这个说法就比较质疑了,单参数传参应该不会出现问题,而且两边使用得参数名也是一样的
不管怎样,我还是决定调试试试

打印MyBatis执行日志

我尝试了通过添加注解,但事实上并没有起作用,于是我尝试了为MyBatis的执行打印日志,检查具体执行的SQL

# 单独添加这个配置并没有起作用
logging:
level:
org.mybatis: TRACE
# 额外添加了这一段才起作用,不确定是不是这里单独起作用的
mybatis:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

问题解决

最后发现对于上面两个问题中的分页问题,其实是很蠢的低级问题:PageHelper的分页偏移量是从1开始的,我给的参数0自然就查询不到任何数据

这里我注意到PageHelper似乎是拦截器的实现,并且它会自动先于我的SQL执行一段count(0)已查询所有的记录数

那么第一个问题查询为空又是如何导致的呢?
果不其然,又是PageHelper的不当使用造成的

PageHelper.startPage((current - 1) * 10, limit);

这里因为改用PageHepler插件时没有真正理解业务,而导致参数问题offset===0,于是查询不到数据

总结

说来惭愧,最近我遇到了三个问题都与offset这个参数有关,意识到分页插件的offset、SQL语句的offset不是一个东西,分页插件的offset从1开始是页偏移,而SQL从0开始是行偏移,另外Redis中的zset也是0开始,这些概念没记牢搞清楚,然后加上代码逻辑没有完全理解才会出现这些低级问题卡了这么久

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/17415903.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(810)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起