MyBatis - 动态SQL

news2024/11/15 5:08:19

前言

我们在某网站填写个人信息时,时常会遇到可以选填的空(即可填,可不填),由于之前讲过的Java中的SQL语句都是固定的,且我们不可能对所有情况都写出与之对应的插入语句(太过繁琐),所以这里就引入了动态SQL。

一,<if>标签

可以通过判断当前传入的参数是否为null,来删减对应的参数。

@Mapper
public interface UserInfoXmlMapper {
    Integer insertUserInfo(UserInfo userInfo);
}
    <insert id="insertUserInfo" useGeneratedKeys="true" keyProperty="id">
        insert into userInfo
        (username,password,age,
         <if test="gender!=null">
             gender,
         </if>
         phone)
        values
        (#{username},#{password},#{age},
         <if test="gender!=null">
             #{gender},
         </if>
        #{phone})
    </insert>

二,<trim> 标签

但是如果光使用<if>标签可能会出现错误,比如:

<insert id="insertUserInfo" useGeneratedKeys="true" keyProperty="id">
        insert into userInfo
        (
         <if test="username!=null">
             username,
         </if>
         <if test="password!=null">
             password,
         </if>
         <if test="age!=null">
             age,
         </if>
         <if test="gender!=null">
             gender,
         </if>
         <if test="phone!=null">
             phone
         </if>
         )
        values
        (
        <if test="username!=null">
            #{username},
        </if>
        <if test="password!=null">
            #{password},
        </if>
        <if test="age!=null">
            #{age},
        </if>
        <if test="gender!=null">
            #{gender},
        </if>
        <if test="phone!=null">
            #{phone}
        </if>
        )
    </insert>

这时就要使用<trim>标签,该标签有四个属性:

  • prefix:表示整个语句块,以 prefix 的值作为前缀
  • suffix:表示整个语句块,以 suffix 的值作为后缀
  • prefixOverrides:表示整个语句块要删去的前缀
  • suffixOverrides:表示整个语句块要删去的后缀
    <insert id="insertUserInfo" useGeneratedKeys="true" keyProperty="id">
        insert into userInfo
        <trim prefixOverrides="," suffixOverrides="," prefix="(" suffix=")">
            <if test="username!=null">
                username,
            </if>
            <if test="password!=null">
                password,
            </if>
            <if test="age!=null">
                age,
            </if>
            <if test="gender!=null">
                gender,
            </if>
            <if test="phone!=null">
                phone
            </if>
        </trim>
        values
        <trim prefixOverrides="," suffixOverrides="," prefix="(" suffix=")">
            <if test="username!=null">
                #{username},
            </if>
            <if test="password!=null">
                #{password},
            </if>
            <if test="age!=null">
                #{age},
            </if>
            <if test="gender!=null">
                #{gender},
            </if>
            <if test="phone!=null">
                #{phone}
            </if>
        </trim>
    </insert>

解释各个属性的作用:

  • prefix:在开始部分加上(
  • suffix:在结束部分加上 )
  • prefixOverrides:如果在所以<if>标签中内容拼接之后,以 ',' 开头,那么就将它删除
  • suffixOverrides:如果在所以<if>标签中内容拼接之后,以 ',' 结尾,那么就将它删除

后两个属性就避免出现上述SQL语句的问题

三,<where> 标签

在where条件查询中,我们的查询条件也有可能为null,所以也需要用到<if>标签,也就是说这里也会出现上述问题,只不过这里多出来的是and / or,这时就需要使用<where>标签来帮我们删除where语句开头的 and / or。注:虽然使用<trim>标签也能达到上述效果,但是如果where查询中的所有参数都为 null 时,<where>标签能将自己本身给删除,而<trim>标签仍会保留where。

    <select id="queryUserList" resultType="com.example.javaeespringioc.controller.UserInfo">
        select * from userInfo
        <where>
            <if test="username!=null">
                username = #{username}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </where>
    </select>

四,<set> 标签

<set>标签也是删除因<if>标签产生的多余的 ',' ,它是可以使用<trim>标签替代的

    <update id="updateUserInfo">
        update userInfo
        <set>
            <if test="username!=null">
                username = #{username},
            </if>
            <if test="password!=null">
                password = #{password}
            </if>
        </set>
        where id = #{id}
    </update>

五,<foreach>标签

我们SQL中有这样的语句:delete from userinfo where id in (1,2,3,4,5),这无法使用之前的内容来表示,这时就会用到<foreach>标签,它有以下5个属性:

  • collections:绑定参数中集合,如 List,Set,Map 或 数组对象
  • item:遍历集合中的对象,类似于Java中,for(int x : nums) 中的 x
  • open:语句开头的字符串
  • close:语句结尾的字符串
  • separator:每个元素之间使用separator间隔开来
    <delete id="deleteUserInfo">
        delete from userInfo where id in
        <foreach collection="idx" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

六,<include>标签

xml中的配置的SQL语句可能会存在很多重复的片段,我们可以对重复的片段进行抽取,通过<sql>标签进行封装,然后再通过<include>标签进行引用。

    <sql id="allColumn">
        id, username, password, age, gender, phone
    </sql>

    <select id="queryUserList" resultType="com.example.javaeespringioc.controller.UserInfo">
        select
        <include refid="allColumn"></include>
        from userInfo
        <where>
            <if test="username!=null">
                username = #{username}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </where>
    </select>

七,<script>标签

上述6个标签都是通过.xml文件来实现动态SQL,那么我们注解如何来实现动态SQL呢?就是使用<script>标签,代码如下:

    @Select("<script>" +
            "select * from userInfo " +
            "<where>" +
            "<if test='username!=null'>" +
            "username = #{username} " +
            "</if>" +
            "<if test='gender!=null'>" +
            "and gender = #{gender}" +
            "</if>" +
            "</where>" +
            "</script>")
    List<UserInfo> queryBy(@Param("username") String username, @Param("gender") Integer gender);

注意:注解中的是字符串,所以要注意字符串拼接时的空格,单双引号的问题。且使用注解方式如果出错,报错信息不会告诉你哪里出问题了,所以不推荐使用该方法!!! 

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

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

相关文章

虚幻引擎的三种输入模式和将控件显示到屏幕上

首先要知道一个概念 , HUD 和 Input 都是由 PlayerController 来控制的 而虚幻的Input控制模式有三种 Set Input Mode Game Only (设置输入模式仅限游戏): 视角会跟着鼠标旋转 , 就是正常游戏的模式 , 这也是游戏默认输入模式 Set Input Mode UI Only (设置输入模式仅限UI): …

【操作系统强化】王道强化一轮笔记

第一章 计算机系统概述 考点1 操作系统的概念、特征和功能 1. 2. 考点2 内核态与用户态 1. 2.用户态和内核态之间的切换本质上就是应用程序和操作系统对CPU控制器的切换 考点3 中断和异常 1. 2. 考点4 系统调用 1. 2. 3.C 考点5 操作系统引导 1. 2. ①磁盘的物理格式化&…

APP自动化中 ADB Monkey用法

一、monkey是干什么的&#xff1f; 我们可以使用monkey做手机端性能的压力测试&#xff0c;稳定性测试 二、monkey在使用的时候&#xff0c;他的运行特性 monkey默认配置下执行&#xff0c;会在手机中随机的点击或者轻触我们的手机中应用&#xff0c;不过这个时候&#xff0…

在Windows系统上安装的 flatbuffers C++ 库

步骤一 下载:https://github.com/google/flatbuffers git clone gitgithub.com:google/flatbuffers.git步骤二 打开安装目录,然后再打开该目录下的powershell, 新建build目录 cd build cmake ..步骤三 进入步骤二生成的build目录里面,点击FlatBuffers.sln,打开vs2019 补充…

信息安全工程师(13)网络攻击一般过程

前言 网络攻击的一般过程是一个复杂且系统化的行为&#xff0c;其目标往往在于未经授权地访问、破坏或窃取目标系统的信息。 一、侦查与信息收集阶段 开放源情报收集&#xff1a;攻击者首先会通过搜索引擎、社交媒体、论坛等公开渠道获取目标的基本信息&#xff0c;如姓名、地址…

【经验分享】电商api接口——各类商品数据一键获取

目前&#xff0c;双十一促销活动正在火爆预热进行中。大促期间&#xff0c;消费者常常会做攻略以防被坑&#xff0c;而活动期间&#xff0c;品牌商家方也需要有所行动&#xff0c;避免一些不必要的损失。 大促期间&#xff0c;商家前前后后的改价活动往往比较频繁&#xff0c;…

超分之SPIN

Lightweight image super-resolution with superpixel token interaction[C]利用超像素token交互实现轻量级图像超分辨率Zhang A, Ren W, Liu Y, et al.Proceedings of the IEEE/CVF International Conference on Computer Vision. 2023: 12728-12737. 文章目录 摘要1. 引言2. …

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 048 &#xff0c;文末自助获取源码 \color{red}{T048&#xff0c;文末自助获取源码} T048&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

元器件数据手册识别工具

数据手册识别方案&#xff0c;目前有多家厂商实现了这个功能&#xff0c;分别采用不同的技术路线实现。 基于AI方法&#xff1a;使用大量的数据手册进行训练&#xff0c;训练后的将模型文件提供给客户&#xff0c;用户在程序中加载模型文件和数据手册得到手册里面的数据结果。 …

Python中requests模块(爬虫)基本使用

Python的requests模块是一个非常流行的HTTP库&#xff0c;用于发送HTTP/1.1请求。 一、模块导入 1、requests模块的下载&#xff1a; 使用包管理器下载&#xff0c;在cmd窗口&#xff0c;或者在项目的虚拟环境目录下&#xff1a; pip3 install -i https://pypi.tuna.tsingh…

JUC高并发编程1:JUC概述

1 什么是JUC 1.1 JUC简介 JUC就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包&#xff0c;JDK 1.5 开始出现的。 1.2 进程与线程 进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中用于实现多任务处理的两种基本概…

Linux 基本指令的学习

01. ls 指令 语法 &#xff1a; ls [ 选项 ][ 目录或文件 ] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

计算机二级C语言疑难

1.strcpy函数 在C语言中strcpy&#xff08;&#xff09;函数会将字符串2&#xff08;包括字符串结束字符/0&#xff09;的函数覆盖到字符串1&#xff0c;如果字符串1没有足够的空间容纳字符串会导致缓冲溢出的错误 例题&#xff1a;程序设计 规定输入的字符串中只包含字母和…

2.Spring-容器-注入

注册&#xff1a;将组件放入容器中&#xff1b; 注入&#xff1a;让容器按需进行操作&#xff1b; 一、Autowired&#xff1a;自动注入组件 原理&#xff1a;Spring调用容器的getBean 二、Qualifier 精确指定 精确指定&#xff1a;如果容器中组件存在多个&#xff0c;则使用…

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强

Nginx基础详解1(单体部署与集群部署、负载均衡、正反代理、nginx安装)

本阶段的任务 1.学会集群的操作概念 2.完成对Nginx的入门操作 3.使用Nginx实现集群和负载均衡 4.使用Nginx实现高可用的方案 目录 1.单体部署与集群部署 1.1单体部署的概念 1.2单体部署的优缺点 1.3集群部署的概念 1.4集群部署的优缺点 1.5集群部署需要注意的点 1.…

嵌入式linux方向细分工作岗位分析

大家好,今天主要给大家分享一下,linux方向细分的工作岗位有哪些?,为即将进入linux领域的开发者指明方向。 第一:总结分布 第二:Linux BSP工程师岗位 工作内容: 1、开发和维护Linux系统的板级支持包(BSP),包括启动加载程序、设备驱动、文件系统等。 2、负责解决硬件和软…

2003-2022年各省区域创新能力评价相关指标数据(报告年份2003-2022年)

2003-2022年各省区域创新能力相关指标数据&#xff08;报告年份2003-2022年&#xff09; 1、来源&#xff1a;2003-2022年中国区城创新能力评价报告 2、指标&#xff1a;综合值、知识创造综合指标、研究开发投人综合指标、专利综合指标、科研论文综合指标、知识获取综合指标、…

个人导航网站介绍和部署

前言&#xff1a; 大家好&#xff0c;我是神的孩子都在歌唱&#xff0c;这是我csdn的博客 , 这是我做的一个神唱导航网站项目&#xff0c;这是一个练习项目&#xff0c;所以还存在很多问题&#xff0c;目的是方便收集和查阅日常浏览的网站&#xff0c;代码完全开源github&#…

LeetCode 面试经典150题 201.数字范围按位与

题目&#xff1a;给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 提示&#xff1a;0 < left < right < 2^31 - 1 思路&#xff1a; 位与的特性…