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

伤心
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吧,这样更优雅一些,还可以软删除,一举两得~
学到了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/174438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[CANN训练营]UART通信笔记

文章目录 前言一、前提知识1.串行通信2.并行通信3.单工、半双工、全双工通信3.1单工通信3.2半双工通信3.3全双工通信 4.补充&#xff1a;通信速率 二、UART通信1.UART通信2.UART工作原理 总结 前言 在ROS学习中&#xff0c;我们在入门基础除了ROS的小乌龟外&#xff0c;在通信…

YOLOV5中parser参数配置

源码下载链接&#xff1a;ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite (github.com) 需要配置的参数&#xff1a;--data parser.add_argument(--data, ...)&#xff1a;添加一个用于数据配置文件的路径的参数。 可以直接修改&am…

【算法|动态规划 | 区间dp No.1】AcWing 282. 石子合并

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…

视频封装格式

FLV&#xff08;Flash Video&#xff09; FLV封装格式 Tag Data分为Audio&#xff0c;Video&#xff0c;Script三种 TS&#xff08;Transport Stream&#xff09;传输流 TS文件分为三层&#xff0c;&#xff08;倒叙更好理解&#xff09; TS层&#xff1a;在PES层基础上加入…

易点易动固定资产管理系统助您轻松应对复杂的固定资产管理挑战

在现代企业运营中&#xff0c;固定资产是企业的重要财产&#xff0c;对于企业的发展和运营至关重要。然而&#xff0c;随着企业规模的扩大和业务的复杂化&#xff0c;固定资产管理面临着越来越多的挑战。传统的手工管理方法已经无法满足企业的需求&#xff0c;因此&#xff0c;…

蒙特卡洛树搜索(Monte Carlo Tree Search)揭秘

一. 什么是蒙特卡洛树搜索 蒙特卡洛树搜索(MCTS)是一种启发式搜索算法&#xff0c;一般用在棋牌游戏中&#xff0c;如围棋、西洋棋、象棋、黑白棋、德州扑克等。MCTS与人工神经网络结合&#xff0c;可发挥巨大的作用&#xff0c;典型的例子是2016年的AlphaGo&#xff0c;以4:1…

viple模拟器使用(一):线控模拟

(1)unity模拟器 通过viple程序&#xff0c;将viple编写逻辑运行在unity模拟器中。 首先编写viple程序&#xff0c;逻辑&#xff1a;设置一个机器人主机&#xff0c;并且&#xff0c;按↑、↓、←、→方向键的时候&#xff0c;能分别控制模拟机器人在unity模拟器中运行。 主机…

【软考篇】中级软件设计师 第二部分(一)

中级软件设计师 第二部分&#xff08;一&#xff09; 八. 层次化结构8.1 局部性原理8.2 体系8.3 分类8.3.1 存取方式8.3.2 工作方式 8.4 Cache8.4.1 例题 8.5 地址映像 九. 主存编址9.1 例题一 十. 可靠性10.1 串联系统和并联系统 十一. 网络安全11.1 保密性11.2 完整性&#x…

蓝桥杯每日一题2023.11.13

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 由于每次吹灭的蜡烛与年龄相同故我们想到使用前缀和可以让我们求出各个区间的和&#xff0c;我们将每个区间都枚举一遍&#xff0c;如果符合要求就输出区间开始的位置&#xff08;答案&#xff…

linux之IPC

linux之IPC 什么是IPC共享内存(shm)ftokshmgetshmatshmdtshmctl 消息队列msggetmsgrcvmsgsndmsgctl 旗语(信号量)semgetsemctlsemopsem三级标题三级标题 ipc命令守护进程查看守护进程 什么是IPC IPC: Inter(内核) Process(进程) Communicton&#xff08;通信&#xff09; 共享内…

问AI经历网是什么

为AI生成的文案点赞 &#x1f44d;

java实现插入排序

图解 以下是Java实现插入排序的代码&#xff1a; public class InsertionSort {public static void main(String[] args) {int[] arr {5, 2, 4, 6, 1, 3};insertionSort(arr);System.out.println(Arrays.toString(arr)); // output: [1, 2, 3, 4, 5, 6]}public static void i…