当前位置: 首页 > news >正文

Mybatis 中<where>的用法注意事项(附Demo)

目录

  • 前言
  • 1. 问题所示
  • 2. 基本知识

#1024程序员节 | 征文#

在这里插入图片描述

前言

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

先从实战问题中进行分析,在分析相关的基本知识

1. 问题所示

执行后端代码的时候,网页出现如下提示:

axios.js:72  Uncaught (in promise) Error: 
### Error querying database.  Cause: java.sql.SQLException: sql injection violation, dbType mysql, druid-version 1.2.22, select alway true condition not allow : SELECT COUNT(*) FROM (SELECT s.spreader_no, s.spreader_model, d.check_date, DATEDIFF(CURDATE(), d.check_date) AS check_days_between_last, d.end_lock_cumulative_box_quantity, d.end_lock_cumulative_box_quantity - d.last_endLock_cumulative_box_quantity AS end_lock_used_quantity, d.end_lock_replace_date, DATEDIFF(CURDATE(), d.end_lock_replace_date) AS end_lock_replace_days, d.last_endLock_cumulative_box_quantity, d.middle_lock_cumulative_box_quantity, d.middle_lock_cumulative_box_quantity - d.last_middle_lock_cumulative_box_quantity AS middle_lock_used_quantity, d.middle_lock_replace_date, DATEDIFF(CURDATE(), d.middle_lock_replace_date) AS middle_lock_replace_days, d.last_middle_lock_cumulative_box_quantity FROM equipment_spreader AS s JOIN equipment_spreader_running_data AS d ON s.id = d.spreader_id AND '1' = '1' WHERE s.is_deleted = 0 AND d.is_deleted = 0) AS t WHERE 1 = 1
### The error may exist in file [F:\java_project\BladeX-Biz\blade-service\blade-equipment\target\classes\org\springblade\equipment\mapper\SpreaderRunningDataMapper.xml]
### The error may involve org.springblade.equipment.mapper.SpreaderRunningDataMapper.queryCount
### The error occurred while executing a query

截图如下:

在这里插入图片描述

给一个Demo示例:

这个原本是正确的,适应低版本

<select id="listView" resultType="org.springblade.equipment.vo.DeviceScheduleHistVO">SELECT * FROM E_DEVICE_SCHEDULE_HISTwhere 1=1<if test="deviceScheduleHistVO.lowCapacityDeviceName != null and deviceScheduleHistVO.lowCapacityDeviceName != ''">AND LOW_CAPACITY_DEVICE_NAME = #{deviceScheduleHistVO.lowCapacityDeviceName}</if><if test="deviceScheduleHistVO.startTime != null">and CREATE_TIME &gt; #{deviceScheduleHistVO.startTime}</if><if test="deviceScheduleHistVO.endTime != null" >and CREATE_TIME &lt;= #{deviceScheduleHistVO.endTime}</if>order by SEND_TO_DRIVER ASC, CREATE_TIME DESC
</select>

最终应该修改为:(与版本差异有关,后续版本使用<where>保险一点)

<select id="listView" resultType="org.springblade.equipment.vo.DeviceScheduleHistVO">SELECT * FROM E_DEVICE_SCHEDULE_HIST<where><if test="deviceScheduleHistVO.lowCapacityDeviceName != null and deviceScheduleHistVO.lowCapacityDeviceName != ''">LOW_CAPACITY_DEVICE_NAME = #{deviceScheduleHistVO.lowCapacityDeviceName}</if><if test="deviceScheduleHistVO.startTime != null">and CREATE_TIME &gt; #{deviceScheduleHistVO.startTime}</if><if test="deviceScheduleHistVO.endTime != null" >and CREATE_TIME &lt;= #{deviceScheduleHistVO.endTime}</if></where>order by SEND_TO_DRIVER ASC, CREATE_TIME DESC
</select>

2. 基本知识

MyBatis 的 XML 文件中,<where> 标签是用来动态构建 WHERE 子句的,它可以根据传入的条件在运行时自动拼接 SQL 语句,并且避免不必要的语法问题

基本的用法如下:在一个 SELECT 语句中,包裹所有动态条件,它通过内部的 <if> 标签来动态添加查询条件

<select id="selectUsers" resultType="User">SELECT *FROM users<where><if test="username != null and username != ''">username = #{username}</if><if test="age != null">AND age = #{age}</if><if test="status != null">AND status = #{status}</if></where>
</select>

常见的错误如下:<where> 标签内的 ORDER BY 错误
<where> 标签仅用于条件过滤,不能用于排序
ORDER BY 语句必须位于 SELECT 语句的最后,不应放在 <where>

错误的写法如下:

<where><if test="username != null">username = #{username}</if>ORDER BY username DESC
</where>

正确的写法应将 ORDER BY 放在外部:

<where><if test="username != null">username = #{username}</if>
</where>
ORDER BY username DESC

在更复杂的查询中,比如多表查询或分页查询,<where> 依然是构建条件的重要部分

多表查询

<select id="selectUserOrders" resultType="Order">SELECT o.id, o.total, u.usernameFROM orders oLEFT JOIN users u ON o.user_id = u.id<where><if test="u.username != null">u.username = #{username}</if><if test="o.total != null">AND o.total >= #{total}</if></where>
</select>

分页查询

<select id="selectUsersByPage" resultType="User">SELECT *FROM users<where><if test="username != null">username = #{username}</if><if test="status != null">AND status = #{status}</if></where>LIMIT #{pageNum}, #{pageSize};
</select>

使用多个排序条件

<select id="getOrderedEquipment" resultType="EquipmentVO">SELECT *FROM equipment<where><if test="status != null">status = #{status}</if></where><if test="sortBy == 'name'">ORDER BY name ASC</if><if test="sortBy == 'createdDate'">ORDER BY created_date DESC</if>
</select>

实战中的用法如下:
(主要展示where一开始不能接and 以及 where要放在order by前面)

在这里插入图片描述


http://www.mrgr.cn/news/55791.html

相关文章:

  • PostgreSQL模板数据库template0和template1的异同点
  • ChatTTS在Windows电脑的本地部署与远程生成音频详细实战指南
  • 1. 路由定义
  • 基于MEDLL的Loran-C天地波周期联合识别及信号跟踪方法及MATLAB仿真代码和实测信号处理
  • 【最新通知】2024年Cisco思科认证CCNA详解
  • 红日安全vulnstack (一)
  • 商场楼宇室内导航系统
  • 不再手动处理繁琐任务!Python自动化方案梳理
  • 【力扣刷题实战】用队列实现栈
  • SpringBoot整合mybatisPlus实现批量插入并获取ID
  • 用docker Desktop 下载使用thingsboard/tb-gateway
  • 【Java面试——并发编程——相关类和关键字——Day4】
  • 华为OD机试 - 生成哈夫曼树(Python/JS/C/C++ 2024 D卷 100分)
  • 快快收藏!学习 Python 最常访问的10个网站
  • MyBatis-Plus中FieldFill理解与应用
  • 编程题 7-22 龟兔赛跑【PAT】
  • C++游戏开发:从基础到进阶
  • JavaWeb——Maven(6/8):依赖管理-依赖传递 (介绍、直接依赖与间接依赖、演示、排除依赖)
  • Java 分页实战详解
  • 保研推荐信模板
  • Unity地面检测、跳跃
  • 低功耗4G模组的小秘密:RSA算法示例驾到,通通闪开...
  • 一分钟运行DBT入门示例项目(Jaffle Shop)
  • 新的类Rufus应用可带来简单的Windows 11 24H2安装旁路
  • 【07】z检验
  • Redis在实践的关键点