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_HIST
    where 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.username
    FROM orders o
    LEFT 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前面)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp使用html2canvas时,页面内的image元素模糊

不废话很简单只需要将image改成img就行 改之前 改之后 原因可能是因为uniapp里面的image标签做了某种处理

基于Java+Springboot+Vue开发的酒店客房预订管理系统

项目简介 该项目是基于JavaSpringbootVue开发的酒店客房预订管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java…

监控易监测对象及指标之:Kafka中间件JMX监控指标解读

监控易作为一款功能强大的监控软件&#xff0c;旨在为企业提供全方位的IT系统监控服务。其中&#xff0c;针对Kafka中间件的JMX监控是监控易的重要功能之一。本文将详细解读监控易中Kafka的JMX监控指标&#xff0c;帮助企业更好地理解并运用这些数据进行系统性能调优和故障排查…

开启RefCell debug_refcell feature查看借用冲突位置

文章目录 背景分析解决方法 本文解决两个问题&#xff1a; 开启rust源码库中的feature开启debug_refcell feature的方法查看 borrow 借用冲突的位置 背景 使用 RefCell 来实现内部可变性是在 Rust 开发中常用的方式&#xff0c;但是当逻辑复杂起来&#xff0c;常常会有可变借…

word建立目录以及修改页码

1、为word建立新的目录 &#xff08;1&#xff09;选中word中的标题设置为第几级标题&#xff0c;将所有的标题均设置完成。最后可以鼠标右击标题&#xff0c;对不同的标题字体大小等进行设置。右击-->修改-->格式-->段落 &#xff08;2&#xff09;在word中插入新的…

算法01----移动零(C++)

题目展示 算法原理 我们这里要用到的算法是双指针移动&#xff0c;和我们之前学的快排的核心思想是一样的。我们看看怎么做吧。我会以图片的形式将我的思路告知大家。 这就是整个题目的整体思想算法&#xff0c;大家理解一下&#xff0c;其实这道题目还是很简单的。 代码编写…

【C++ 11】移动构造函数

文章目录 【 1. 问题背景&#xff1a;深拷贝引起的内存开销问题 】【 2. 移动构造函数 】【 3. 左值的移动构造函数: move 实现 】 【 1. 问题背景&#xff1a;深拷贝引起的内存开销问题 】 拷贝构造函数 在 C 11 标准之前&#xff08;C 98/03 标准中&#xff09;&#xff0c;…

Vue脚手架学习 vue脚手架配置代理、插槽、Vuex使用、路由、ElementUi插件库的使用

目录 1.vue脚手架配置代理 1.1 方法一 1.2 方法二 2.插槽 2.1 默认插槽 2.2 具名插槽 2.3 作用域插槽 3.Vuex 3.1 概念 3.2 何时使用&#xff1f; 3.3 搭建vuex环境 3.4 基本使用 3.5 getters的使用 3.6 四个map方法的使用 3.6.1 mapState方法 3.6.2 mapGetter…

LabVIEW中句柄与引用

在LabVIEW中&#xff0c;句柄&#xff08;Handle&#xff09; 是一种用于引用特定资源或对象的标识符。它类似于指针&#xff0c;允许程序在内存中管理和操作复杂的资源&#xff0c;而不需要直接访问资源本身。句柄用于管理动态分配的资源&#xff0c;如队列、文件、网络连接、…

[python flask 数据库ORM操作]

一、链接数据库 我们选择的框架是flask-sqlAlchemy 这个框架是对pymysql的封装。 连接数据库 #导入包 from flask_sqlalchemy import SQLAlchemy #创建flask app对象 app Flask(__name__) #设置配置信息 HOSTNAME "localhost" PORT 3306; USERNAME "root&…

在C++中比大小

关于min()函数和max()函数: min()、max()这两个函数如果需要使用&#xff0c;要在程序头文件中加上<algorithm>库就可以使用这个函数了 #include <algorithm>min()函数是比较数中哪一个数最小&#xff0c;就返回最小的数&#xff0c;而max()函数则是比较数中哪一个…

计算机毕业设计Flask+Vue.js空气质量预测 空气质量可视化 空气质量分析 空气质量爬虫 大数据毕业设计 Hadoop Spark

《FlaskVue.js空气质量预测与可视化系统》开题报告与任务书 一、研究背景与意义 随着工业化进程的加速和城市化水平的不断提高&#xff0c;空气质量问题日益成为全球关注的焦点。空气污染不仅严重影响着人们的身体健康&#xff0c;如增加呼吸系统疾病、心血管疾病等风险&…

商场楼宇室内导航系统

商场楼宇室内导航系统 本文所涉及所有资源均在传知代码平台可获取 文章目录 商场楼宇室内导航系统效果图导航效果图查看信息数据加载加载模型模型选型处理楼层模型绑定店铺创建店铺名称动态显示隐藏2d元素空气墙查看信息楼梯导航效果图 导航效果图 查看信息 数据加载 因为是一…

Java最全面试题->Java主流框架->Srping面试题

Spring面试题 下边是我自己整理的面试题,基本已经很全面了,想要的可以私信我,我会不定期去更新思维导图 哪里不会点哪里 谈谈你对 Spring 的理解? Spring 是一个开源框架,为简化企业级应用开发而生。Spring 可以是使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。…

定时开关机功能实现

提示&#xff1a;本文仅仅针对MTK平台实现需求&#xff0c;对其它芯片主控平台暂无借鉴可言 文章目录 需求需求描述实际手机功能图 资料相关说明实现方案修改方案修改内容点内置App修改MtkAlarmManagerService.java 坑点解决总结 需求 实现手机一样的定时开关机功能 需求描述…

计算不停歇,百度沧海数据湖存储加速方案 2.0 设计和实践

本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 今天给大家介绍下百度沧海存储团队在数据湖加速方面的工作进展情况。 数据湖这个概念&#xff0c;从 2012 年产生到现在已经有十余年的时间&#xff0c;每家公司对它内涵的解读都不太一样。但是数据湖的主要存储底座…

具备哪些特质的内外网文件交换系统 才是高科技企业需要的?

高科技企业是指涉及对国家产生深远和积极影响的先进技术的产业集群&#xff0c;它们以持续的创新和高研发投入为核心&#xff0c;推动科技进步和产业升级。高科技企业是市场经济的重要组成&#xff0c;为经济发展和技术进步提供充足动力&#xff0c;因此&#xff0c;高科技企业…

【南开X上海交大】OPUS:效率显著提升的OCC网络

1. 摘要 占据预测任务旨在预测体素化的3D环境中的占据状态&#xff0c;在自动驾驶领域中迅速获得了关注。主流的占据预测方法首先将3D环境离散化为体素网格&#xff0c;然后在这些密集网格上执行分类。然而&#xff0c;样本数据分析显示&#xff0c;大多数体素实际上是未占据的…

《15分钟轻松学Go》教程目录

在AI快速发展的时代&#xff0c;学习Go语言依然很有用。Go语言擅长处理高并发任务&#xff0c;也就是说可以同时处理很多请求&#xff0c;这对于需要快速响应的AI服务非常重要。另外&#xff0c;Go适合用来处理和传输大量数据&#xff0c;非常适合机器学习模型的数据预处理。 …

并查集 --- Java通用模版

什么是并查集 并查集可以解决什么问题&#xff1a;判断两个节点是否在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 并查集常用于处理大规模数据下的元素分组问题&#xff0c;特别是在数据量极大时&#xff0c;使用正常的数据结构可能会导致空间或时间复杂度过高…