mybatis的xml中<trim>标签的用法

news2024/12/23 5:56:36

文章目录

  • 1. 前言
  • 2. 先说结论
  • 3. 验证
    • 1. 情况一
    • 2. 情况二
    • 3. 情况三
    • 4. 情况四
    • 5. 验证prefixOverrides去掉的是trim内原sql内容

1. 前言

  1. 在工作中离不开跟数据库打交道,目前流行的固然是mybatis,在xml中写sql的时候,可能会出现下面情况:

    <select id="select" resultType="User">
       select * from user2
       where 
         <if test="name != null">
            name = #{name}
         </if>
         <if test="pwd != null">
             and pwd = #{pwd}
         </if>
    </select>
    

    上述写法问题,sql中可能会有where条件,但是条件的个数未定,且条件任意一条都随机成立
    1. 情况一:name与pwd 都不为空,sql正常
    2. 情况二:name不为空,pwd为空,sql正常
    3. 情况三:name为空,pwd不为空,sql异常,因为sql就变成select * from user2 where and pwd = #{pwd}
    4. 情况四:name、pwd都为空,sql异常,因为sql就变成select * from user2 where

  2. 针对上述情况,有人可能会这样子解决,确实完全解决上述出现的问题,并且简单,但是唯一就是出现 1 = 1,很不美观:

    <select id="select" resultType="User">
       select * from user2
       where 1 = 1
         <if test="name != null">
            and name = #{name}
         </if>
         <if test="pwd != null">
             and pwd = #{pwd}
         </if>
    </select>
    
  3. 为了追求更好的写法,因此则稍微研究了一下:mybatis中自带的标签完美解决这个事情,如下文。

2. 先说结论

  1. mybatis中有标签,语法如下:

    <trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
    <!--名词解析-->
    prefix:若条件成立,在trim标签内sql语句前面加上前缀
    prefixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,前面去掉多余前缀内容
    suffix:若条件成立,在trim标签内sql语句后面加上后缀
    suffixOverrides:若条件成立,在trim标签内原sql语句,原sql语句,后面去掉多余后缀内容
    
  2. 例子:

        <select id="select" resultType="User">
             select * from user2
             <trim prefix="where" prefixOverrides="ADN|and" suffix="" suffixOverrides="">
                 <if test="name != null and name.length() > 0">
                   and name = #{name}
                 </if>
                 <if test="pwd != null and pwd.length() > 0">
                  and pwd = #{pwd}
                 </if>
             </trim>
        </select>
    
    1. 情况一:name与pwd ,都不为空,则trim内的sql语句前加上where 并且去掉name多余的前缀and
    2. 情况二:name不为空,pwd为空,则trim内的sql语句前加上where 并且去掉name多余的前缀and
    3. 情况三:name为空,pwd不为空,则trim内的sql语句前加上where 并且去掉pwd多余的前缀and
    4. 情况四:name、pwd都为空,则trim内的sql语句直接不存在

3. 验证

  1. 最终XML的sql如下写:

    <select id="select" resultType="User">
             select * from user2
             <trim prefix="where" prefixOverrides="ADN|and">
                 <if test="name != null">
                   and name = #{name}
                 </if>
                 <if test="pwd != null">
                   and pwd = #{pwd}
                 </if>
             </trim>
    </select>
    

1. 情况一

  1. 当name与pwd 都不为空时,trim内sql前面加上where,并去掉name前面的前缀and
    在这里插入图片描述

2. 情况二

  1. 当name不为空,pwd为空,则trim内的sql语句前加上where 并且去掉name多余的前缀and
    在这里插入图片描述

3. 情况三

  1. name为空,pwd不为空,则trim内的sql语句前加上where 并且去掉pwd多余的前缀and
    在这里插入图片描述

4. 情况四

  1. name、pwd都为空,则trim内的sql语句直接不存在
    在这里插入图片描述

5. 验证prefixOverrides去掉的是trim内原sql内容

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性表的顺序实现【C语言版的真代码】

顺序表线性表顺序表顺序表的概念及其结构顺序表基本操作顺序表的初始化顺序表的插入顺序表的删除顺序表的查找线性表 线性表&#xff1a;一个线性表是含n个数据元素的有限序列。 它的逻辑结构要求是线性的&#xff0c;但其存储结构并没有做要求&#xff0c;即逻辑结构类似于如…

非DBA人员从零到一,MySQL InnoDB数据库调优之路(四)-数据备份与迁移

上一篇【非DBA人员从零到一&#xff0c;MySQL InnoDB数据库调优之路(三)-分区表与分库分表】 我认为分表在数据库的调优中是一种加法&#xff0c;通过拆分单表数据到多个表中&#xff0c;减少单表的压力&#xff0c;从而达到调优的效果&#xff0c;那么这一篇博文会通过对数据…

Spring Security权限管理原理

1.简介 授权是更具系统提前设置好的规则&#xff0c;给用户分配可以访问某一资源的权限&#xff0c;用户根据自己所具有的权限&#xff0c;去执行相应的操作&#xff0c;spring security提供的权限管理功能主要有两种&#xff1a; 基于过滤器的权限管理功能&#xff08;Filte…

Syntax Error: Error: Missing binary. See message above.

安装完nvm&#xff0c;选择后node版本&#xff0c;在idea中引入vue项目&#xff0c;npm install后&#xff0c;运行npm run serve后 控制台出现下面错误&#xff1a; Try running this to fix the issue: D:\Program Files\nodejs\node.exe E:\vue-project\node_modules\fibe…

篮球竞赛预约平台设计与实现的源码+文档

摘 要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;篮球竞赛预约平台也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#x…

platform总线

1、什么是platform总线&#xff1f; platform是Linux内核抽象出来的软件代码&#xff0c;用于设备与驱动的连接&#xff0c;设备与驱动通过总线进行匹配&#xff1b;匹配成功后会执行驱动中的probe函数&#xff0c;在probe函数中可以获取到设备的信息&#xff1b; 设备与驱动…

gitlab的使用方法,详解gitlab操作

1.导读 本教程主要讲解了GitLab在项目的环境搭建和基本的使用&#xff0c;可以帮助大家在企业中能够自主搭建GitLab服务&#xff0c;并且可以GitLab中的组、权限、项目自主操作。 - GitLab简介 - GitLab环境搭建 - GitLab基本使用(组、权限、用户、项目) 2.GitLab简介 Gi…

debug - JLX12864C(ST7920-12864)液晶屏不能使用串行通讯的原因

文章目录debug - JLX12864C(ST7920-12864)液晶屏不能使用串行通讯的原因概述调试备注ENDdebug - JLX12864C(ST7920-12864)液晶屏不能使用串行通讯的原因 概述 正在给板子写出厂测试程序, 买的12864型号是JLX12864C. STC官方给的例程是并行通讯, 好使. 但是想在测试程序中改为…

Linux线程基础

目录 一&#xff0c;线程函数 1、创建一个线程 2、获取自身线程ID 3、线程终止 4、取消正在执行线程 5、线程等待 6、线程分离 二&#xff0c;线程的使用 1&#xff0c;线程等待和线程分离 (1)、线程等待 (2)、线程分离 (3)、线程等待线程分离同时进行 三&#xff…

中英翻译《森林火灾的预防措施》

The Preventive Measures for Forest Fire 森林火灾的预防措施 The preventive measures for forest fires include some preemptive methods that can help reduce the risks of fires and contril their severity and spread, and thus, maintain ecological balance …

vue与es6的知识点

var let const let const 不能重复声明&#xff0c;局部作用域&#xff0c; 案例 let name "未来"; let str 我是${name}; console.log(str); 箭头函数 let add (x)>{ return x; } console.log(add(9)) v-bind 绑定标签的属性 src class a titie等等…

Qt for Android实现开机自启动

前言 最近项目需要&#xff0c;在Android上编写的程序&#xff0c;需要实现开机自启动。笔者查询了下资料&#xff0c;基本原理如下&#xff1a; 当Android启动时&#xff0c;会发出一个系统广播&#xff0c;内容为ACTION_BOOT_COMPLETED&#xff0c;它的字符串常量表示为 an…

详解时间复杂度计算公式(附例题细致讲解过程)

这几天开始刷力扣上面的算法题&#xff0c;有些题目上面限制时间复杂度和空间复杂度&#xff0c;题目虽然写出来了&#xff0c;但是很没底。印象里数据结构老师讲过一点&#xff0c;沉睡的记忆苏醒了。只记得一个时间复杂度是O(n)&#xff0c;空间复杂度是S(n)。for循环常常是O…

中学语文教学参考杂志社中学语文教学参考编辑部2022年第27期目录

理论学术_课题荟萃《中学语文教学参考》投稿&#xff1a;cn7kantougao163.com 统编教材鲁迅作品的民俗文化分析及教学应用 张家波;张晓静; 3-5 高中语文线上学习的实践与反思 张灵贵; 6-797 不同课型导学案设计建议 张桂霞; 8-997 现代化进程中的阵痛:《哦,香雪…

遇到Bug漏测,不能总想着甩锅吧

背景 漏测Bug是指产品逻辑缺陷在测试过程中没有被发现&#xff08;尤其是测试环境可以重现的缺陷&#xff09;&#xff0c;上线版本发布后或者在用户使用体验后发现并反馈回来的缺陷。 漏测Bug可能造成线上故障或者资损&#xff0c;在对产品测试过程中&#xff0c;自己也难免…

Pandas常见筛选数据的五种方法其一逻辑筛选。看见必懂,懂者必会,会者必加分

前言&#xff1a;Pandas的数据操作中&#xff0c;最基本的就是操作的筛选了&#xff0c;但是对新学员来说的这又是一个难点&#xff0c;因为方法比较多&#xff0c;不容易记。在此总结一下pandas中的一些常用的数据筛选操作。 逻辑筛选数据&#xff1a;切片&#xff08;[ ]&am…

ubuntu 安装、配置FTP

ubuntu 安装、配置FTP 提示&#xff1a;ubuntu 16.0.4&#xff0c;不同版本操作可能稍有不同 前言 本文主要对服务器安装及配置FTP做一个记录&#xff0c;涉及安装、配置、创建FTP账号、以及第一次连接异常等。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

单载波频域均衡matlab仿真,包括卷积编码维特比译码,矩阵交织,QPSK调制解调,导频插入,MMSE-FDE频域均衡

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 频域均衡是从校正系统的频率特性出发&#xff0c;利用一个可调滤波器的频率的频率特性去补偿信道或系统的频率特性&#xff0c;使包括可调滤波器在内的基带系统的总特性接近无失真传输条件。频域…

【Spring项目中的Controller理解】

目录 1. 添加依赖 2. 关于异常 1. 添加依赖 首先&#xff0c;需要保障此项目中存在spring-boot-starter-web依赖项&#xff0c;否则&#xff0c;当前项目并不具备Web应用程序开发所需的依赖&#xff01; 提示&#xff1a;spring-boot-starter-web是建立在spring-boot-starte…

基于Python的Django开发接口框架搭建

1、安装Django&#xff0c;如图1 命令行执行&#xff1a;pip install django 2、创建Django项目&#xff0c;如图2 django-admin startproject imooc 3、创建Django的应用项目&#xff0c;如图3 必须进入项目文件下执行命令&#xff1a; python3 manage.py startapp app …