前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不敢相信,相同SQL下Mybatis查询结果和数据库竟然不一样!

不敢相信,相同SQL下Mybatis查询结果和数据库竟然不一样!

作者头像
用户5224393
发布2019-10-10 15:42:46
4.6K0
发布2019-10-10 15:42:46
举报
文章被收录于专栏:Java研发军团Java研发军团

来源:https://www.jianshu.com/p/7c569ca6852e

问题描述

mybatis查询无结果, 数据库运行相同sql查询出结果, 如下

  • 这是数据库记录
  • 这是mybatis查询出的结果, 记录条数0
  • 这是直接将控制台一模一样的sql查询语句放到Navicat执行的结果, 记录条数1

解决办法

where条件后的username = '${username}'and password = '${password}'置为同一行

代码语言:javascript
复制
<select id="selectByUsernameAndPassword" resultMap="BaseResultMap" parameterType="string">
    SELECT
    <include refid="Base_Column_List" />
    FROM user
    where username = '${username}'
    and password = '${password}'
</select>
代码语言:javascript
复制
<select id="selectByUsernameAndPassword" resultMap="BaseResultMap" parameterType="string">
    SELECT
    <include refid="Base_Column_List" />
    FROM user
    where username = '${username}' and password = '${password}'
</select>

可以看到, 查询结果一致

异常分析

1.很多小伙伴都遇到过类似问题, 很懵逼, 难不成mybatis bug? 没, 原因可能千万种, 但根本原因基本上就一个, 那就是实际查询语句与我们看到的sql不一致, 即, sql写的有问题。

2.再来分析一下上面这个问题, 看似xml sql没有问题, 控制台打印的sql也没问题, 但放到数据库执行结果就不一致了, 因为, xml sql两个条件换行了, mybatis实际执行的sql是这样的:

代码语言:javascript
复制
SELECT id, username, password FROM user where username = 'aaa' # '' 
and password = 'xxx' 
代码语言:javascript
复制
SELECT id, username, password FROM user where username = 'aaa' # '' and password = 'xxx' 

查询结果自然不一致

总结

本文只是提供一种解决类似问题的思路, 出错原因可能不一样, 但问题关键就是实际执行的sql不一致, 才会导致mybatis和mysql查询结果不一致, 所以, 仔细点, 检查sql。

另, 本文是为了测试sql注入, 所以用的${username}, 实际应该使用#{}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java研发军团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 解决办法
  • 异常分析
  • 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档