开发手记:简单的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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步