美文网首页
【教3妹学编辑-mysql】mybatis查询条件遇到的坑及解决

【教3妹学编辑-mysql】mybatis查询条件遇到的坑及解决

作者: 程序员小2 | 来源:发表于2023-11-13 22:36 被阅读0次
伤心
2哥 :3妹,今天怎么下班这么晚啊。
3妹:嗨,别提了,今天线上出bug了, 排查了好久。
2哥:啊,什么问题呀?
3妹:我们内部的一个管理系统报错了, 最近排查下来是mybatis报的错。 背景是这样的: 听我说

背景

这个系统的功能比较简单,就是从DB查询用户,并列表展示,用了1年了,都没什么问题。mybatis查询sql是这样的:

<select id="query" resultMap="BaseResultMap">
 select id, name, age from user_info where 
<if test="name !=null and name !='' ">
 name = #{name} 
</if> 
<if test="age !=null >
 AND age = #{age}
</if> 
</select>

2哥:这个sql看着也没问题啊
3妹:是的, 本来这个name不会这空的, 所以这个sql一直没问题, 可是最近业务逻辑变了,name可能为空。如果name为空的话就导致这条sql是 where and age=**, 这样就报错了。。

2哥:哦 明白,那3妹觉得有什么优化的方案吗?
3妹:把age查询放在前面吗?那这样age为空就也报错了,那怎么办呢?
2哥:其实,这种问题有2种解决方案,但本质思想是一样的:

方案一:在where最前面增加 1=1

比如改成:

<select id="query" resultMap="BaseResultMap">
 select id, name, age from user_info where 1=1 
<if test="name !=null and name !='' ">
 AND name = #{name} 
</if> 
<if test="age !=null >
 AND age = #{age}
</if> 
</select>

这样where后面不会紧跟and, 就不会报错啦。

方案二:表中增加字段deleted

表中增加字段deleted, 一是删除可以软删除, 二是在where最前面加上deleted=0, 这样比加1=1更优雅,也更意义。

<select id="query" resultMap="BaseResultMap">
 select id, name, age from user_info where deleted=0 
<if test="name !=null and name !='' ">
 AND name = #{name} 
</if> 
<if test="age !=null >
 AND age = #{age}
</if> 
</select>

扩展:增加1=1, 对性能有影响吗?

网上有种说法是,增加1=1后, 就不走索引,影响查询性能。那我们来测试下吧:
name字段为索引字段,
sql1:

EXPLAIN SELECT * FROM user_info WHERE name='张三';

sql2:

EXPLAIN SELECT * FROM user_info WHERE 1=1 AND name='张三';

通过对比上面两种sql输出结果可以看到possible_keys 和 key都使用到了索引进行检索。

结论:where 1=1 也会走索引,不影响查询效率。

3妹: 我还是在表里增加deleted吧,这样更优雅一些,还可以软删除,一举两得~

学到了

相关文章

  • mysql 查询

    mysql的查询、子查询及连接查询 一、mysql查询的五种子句 where(条件查询)、having(筛选)、g...

  • mybatis对MySQL和SqlServer的like查询是不

    mybatis对MySQL和SqlServer的like查询是不同的。。。 已经踩了多少次坑了。。

  • mybatis常用条件查询总结(迭代一)

    目录1.mybatis中大于等于小于等于的写法2.mybatis动态查询条件组装3.mybatis批量条件4.my...

  • Java代码提升小技巧

    一、MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件,使用where 1=1 可以很方便的...

  • JAVA规范写代码常用技巧,非常实用

    JAVA规范写代码常用技巧,非常实用 一、MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件...

  • 设计注意点

    一、列表页面 1、排序规则; 2、查询条件及生效规则; 3、批量按钮及单行按钮:位置、只读/可编辑场景、相关提醒;...

  • mysql删除重复数据

    Mysql 查询重复数据: 1.单条件查询: 2.多条件查询: 3.删除重复数据,只保留最小ID的数据:(多条件)

  • 11django模型[条件查询]

    字段查询查询mysql数据库日志条件查询1) 查询等2) 模糊查询3) 空查询4) 范围查询5) 比较查询6) 日...

  • Mybatis-plus使用中遇到的问题

    mybatis-plus 使用遇到问题 条件组合查询过程中 由于条件的较多,or和and都有的情况下 由于括号问题...

  • MySQL实战 目录

    MySQL实战 MySQL实战1 数据库概念介绍MySQL实战2 语法、筛选条件和函数MySQL实战3 分组查询和...

网友评论

      本文标题:【教3妹学编辑-mysql】mybatis查询条件遇到的坑及解决

      本文链接:https://www.haomeiwen.com/subject/sdwdwdtx.html