【MyBatis】(动态SQL <if> 标签 <trim>标签 <where>标签<set>标签<foreach>标签<include>标签)

文章目录

    • 动态SQL
      • < if > 标签
      • < trim> 标签
      • < where> 标签
      • < set> 标签
      • < foreach> 标签
      • < include> 标签


动态SQL

在MyBatis框架中,动态SQL是一个强大的特性。它允许我们根据不同的条件动态的组装SQL语句,能够灵活的发挥SQL强大的功能,方便解决一些其他方法难以解决或解决方法繁琐的问题。

在MyBatis中,我们可以使用特定的标签来实现这些功能,如< if >用于条件判断,< choose >、< when >和< otherwise >用于多条件选择,< trim >、< where >和< set >用于处理SQL语句的前缀和后缀,以及< foreach >用于迭代处理。

< if > 标签

注解写法

  1. 把全部的sql放在script标签下
  2. 使用if标签

性别为空:

/**
 * 性别字段为空
 * @param userInfo
 * @return
 */
@Insert("<script>" +
        "insert into userinfo (username,password,age," +
        "<if test='gender!=null'>gender,</if>" +
        "phone)" +
        "values(#{username},#{password},#{age}," +
        "<if test='gender!=null'>#{gender},</if>" +
        "#{phone})" +
        "</script>")
Integer insert(UserInfo userInfo);

在这里插入图片描述

@Test
void insert() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("libai-2024-1");
    userInfo.setPassword("liibaiiili");
    userInfo.setAge(14);
    userInfo.setPhone("10290192");
    userInfo2Mapper.insert(userInfo);
}

在这里插入图片描述
在这里插入图片描述
XML写法:

<insert id="insertByXML">
    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>
@Test
void insertByXML() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("libai-2024-2");
    userInfo.setPassword("liibaiiili");
    userInfo.setAge(18);
    userInfo.setPhone("10290192");
    userInfo2Mapper.insertByXML(userInfo);
}

在这里插入图片描述
在这里插入图片描述

< trim> 标签

帮助我们去除多余的字符

prefixOverrides:去除trim标签代码块指定的字符
prefix:在trim标签代码块最前面添加制定的字符
suffix:在trim标签代码块最后面添加制定的字符
suffixOverrides:去除trim标签代码块最后面指定的字符
XML:

去除最后一个符号,去除括号:

Integer insertByXML(UserInfo userInfo);
 <insert id="insertByXML">
    insert into userinfo
    <trim 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 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>
@Test
void insertByXML() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("libai-2024-3");
    userInfo.setPassword("liibaiiili");
    userInfo.setAge(18);
//        userInfo.setGender(1);
//        userInfo.setPhone("10290192");
    userInfo2Mapper.insertByXML(userInfo);
}

在这里插入图片描述
在这里插入图片描述

查询年龄为14的用户

List<UserInfo> selectByCondition(UserInfo userInfo);
<select id="selectByCondition" resultType="com.example.demo.model.UserInfo">
    select * from userinfo
    where
    <trim prefixOverrides="and">
        <if test="username!=null">
            username = #{username}
        </if>
        <if test="age!=null">
            and age = #{age}
        </if>
        <if test="gender!=null">
            and gender = #{gender}
        </if>
    </trim>
</select>
@Test
void selectByCondition() {
    UserInfo userInfo = new UserInfo();
//        userInfo.setUsername("libai");
//        userInfo.setGender(0);
    userInfo.setAge(14);
    userInfo2Mapper.selectByCondition(userInfo);
    log.info(userInfo.toString());
}

在这里插入图片描述

在这里插入图片描述

如果是查询来说,还有更简单的方式,就是使用where标签,where标签可以替代上面trim标签的功能

< where> 标签

它会把前面的and自动去掉

<select id="selectByCondition" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
        <where>
            <if test="username!=null">
                username = #{username}
            </if>
            <if test="age!=null">
                and age = #{age}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </where>    
    </select>

在这里插入图片描述

使用trim存在的问题,当所有条件都为空时,SQL语句会变成select * from userinfo where,如果查询条件都为空,where标签会自动去去除where关键字,还会帮我们去除最前面的and字符

问题的解决方式:where 1=1
在这里插入图片描述

注解写法:

@Select("<script>" +
        "select * from userinfo" +
        "        <where>" +
        "            <if test=\"username!=null\">" +
        "                username = #{username}" +
        "            </if>" +
        "            <if test=\"age!=null\">" +
        "                and age = #{age}" +
        "            </if>" +
        "            <if test=\"gender!=null\">" +
        "                and gender = #{gender}" +
        "            </if>" +
        "        </where>" +
        "</script>")
List<UserInfo> selectByCondition3(UserInfo userInfo);
    @Test
    void selectByCondition3() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("libai");
//        userInfo.setGender(0);
//        userInfo.setAge(14);
        userInfo2Mapper.selectByCondition3(userInfo);
        log.info(userInfo.toString());
    }

< set> 标签

修改id为 6的用户的信息
在这里插入图片描述
根据前面学的知识我们可以这样写:

XML写法:

Integer updateByCondition(UserInfo userInfo);(使用trim标签)

<update id="updateByCondition">
    update userinfo
    set
    <trim suffixOverrides=",">
        <if test="username!=null">
            username = #{username},
        </if>
        <if test="age!=null">
            age = #{age},
        </if>
        <if test="gender!=null">
            gender = #{gender}
        </if>
    </trim>
    where id = 6
</update>

上面的写法我们可以用 < set > 标签来代替:

/**
 * 使用set标签
 * @param userInfo
 * @return
 */
Integer updateByCondition2(UserInfo userInfo);
<update id="updateByCondition2">
    update userinfo
    <set>
        <if test="username!=null">
            username = #{username},
        </if>
        <if test="age!=null">
            age = #{age},
        </if>
        <if test="gender!=null">
            gender = #{gender}
        </if>
    </set>
    where id = 6
</update>
@Test
void updateByCondition2() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("libai2024-01");
//        userInfo.setGender(0);
//        userInfo.setAge(14);
    userInfo2Mapper.updateByCondition2(userInfo);
}

在这里插入图片描述
在这里插入图片描述

< foreach> 标签

对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
• collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
• item:遍历时的每⼀个对象
• open:语句块开头的字符串
• close:语句块结束的字符串
• separator:每次遍历之间间隔的字符串

在这里插入图片描述

删除一个集合的数据

删除id7 8 9 的数据

在这里插入图片描述

Integer batchDelete(@Param("ids") List<Integer> ids);
<delete id="batchDelete">
     delete from userinfo
     where id in
     <foreach collection="ids" separator="," item="id" open="(" close=")">
        #{id}
     </foreach>
</delete>

在这里插入图片描述

@Test
void batchDelete() {
    userInfo2Mapper.batchDelete(Arrays.asList(7,8,9));
}

删除成功:

在这里插入图片描述
在这里插入图片描述

< include> 标签

在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码。

在这里插入图片描述
可以对重复的sql段进⾏抽取,通过 < sql > 标签封装到⼀个SQL片段,然后再通过<include>标签进行引用。
< include > :标签进⾏引用。
< sql > :定义可重⽤的SQL片段
< include > :通过属性refid,指定包含的SQL片段

<sql id="allColumn">
	id, username, age, gender, phone, delete_flag, create_time, update_time
</sql>

通过 <include> 标签在原来抽取的地⽅进⾏引⽤。操作如下:

<select id="queryAllUser" resultMap="BaseMap">
	 select
	 <include refid="allColumn"></include>
	 from userinfo
</select>
<select id="queryById" resultType="com.example.demo.model.UserInfo">
	 select
	 <include refid="allColumn"></include>
	 from userinfo where id= #{id}
</select>

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

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

相关文章

【pycharm】调试模式中四个常用按钮介绍

【pycharm】调试模式中四个常用按钮介绍 在 PyCharm 的调试模式中&#xff0c;有四个常用的按钮&#xff0c;它们的功能如下&#xff1a; Step Over (F8)&#xff1a;单步执行&#xff0c;但在遇到函数调用时&#xff0c;不会进入函数内部&#xff0c;而是将整个函数作为一步执…

UVa12313 A Tiny Raytracer

UVa12313 A Tiny Raytracer 题目链接题意分析AC 代码 题目链接 UVA - 12313 A Tiny Raytracer 题意 给出 《训练指南》题意翻译 本题的任务是实现一个小型光线追踪渲染器。场景由若干三角形网格&#xff08;triangle mesh&#xff09;组成&#xff0c;有且仅有一个点光源&…

三苯基膦以及副产物的处理方式

参考文献&#xff1a; Easy Removal of Triphenylphosphine Oxide from Reaction Mixtures by Precipitation with CaBr2 | Organic Process Research & Development (acs.org) Triphenylphosphine Oxide Removal from Reactions: The Role of Solvent and Temperature |…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…

[华为OD] 给航天器一侧加装长方形或正方形的太阳能板 100

给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支 柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。但航天器不同位置的支柱长度 不同&#xff0c;太阳能板的安装面…

学习笔记-数据结构-线性表(2024-04-18)- 单向链表选择排序

试以单向链表为存储结构实现简单选择排序的算法。 实现递增排序&#xff0c;首先选择一个元素作为第一个比较值&#xff0c;遍历其他所有的元素&#xff0c;如果发现其他元素中有比它小的元素&#xff0c;则交换两个元素&#xff0c;这样每一趟都能找到符合要求的最小值 正经…

selenium 自动化测试课上实操指南1——百度搜索

1.环境准备 下面的所有资源可以从超星班级资料中下载&#xff0c;机房的同学在收到的文件夹中可以找到文件 非本校同学&#xff0c;免费加入学银在线课程&#xff0c;就可以在资料 根目录 > 02 课件新 > week09 web自动化测试02 里下载本次实操资料 1&#xff09;安…

K8S探针分享

一&#xff0c;探针介绍 1 探针类型 livenessProbe&#xff1a;存活探针&#xff0c;用于判断容器是不是健康&#xff1b;如果探测失败&#xff0c;Kubernetes就会重启容器。 readinessProbe&#xff1a;就绪探针&#xff0c;用于判断是否可以将容器加入到Service负载均衡池…

使用Tortoise 创建远程分支

1。首先创建本地分支branch1&#xff0c;右键tortoise git->创建分支&#xff0c;输入分支名称branch1&#xff0c;确定。 2。右键tortoise git->推送&#xff0c;按下图设置&#xff0c;确定&#xff0c;git会判断远程有没有分支branch1&#xff0c;如果没有会自动创建…

C++学习随笔(11)——vector

本章我们来学习一下vector&#xff01; 目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5 vector 迭代器失效问题。 1.vector的介绍及使用 1…

ANSYS WorkBench基础说明

1引入CAE产品设计流程 2有限元法简介 有限元法的基本概念:把一个原来是连续的物体划分为有限个单元&#xff0c;这些单元通过有限个节点相互连接&#xff0c;承受与实际载荷等效的节点载荷&#xff0c;根据力的平衡条件进行分析&#xff0c;并根据变形协调条件把这些单元重新组…

【Redis 开发】全局ID生成器

全局ID生成器 为了增加ID的安全性&#xff0c;我们可以不直接使用Redis自增的数值&#xff0c;而是拼接一些其他信息&#xff1a; ID的组成部分&#xff1a; 符号位:1bit,一直为0 时间戳:31bit&#xff0c;一秒为单位&#xff0c;可以使用69年 序列号:32bit&#xff0c;秒内…

idea 通过maven构建无法使用@SpringBootApplication

问题描述 SpringBootApplication标红&#xff0c;没有提示&#xff0c;无法启动springboot使用maven构建。通过idea的标准版本构建 原因 springboot构建启动依赖spring-boot-maven-plugin idea的标准版本没有指定构建版本&#xff0c;然后在springboot-parent里面没有指定默…

(已解决)PyQT5问题:控件和背景色同色,如何解决?

一、问题复现 难看到吐是不是 二、解决方案 拖动一个widget&#xff0c;设置其背景色&#xff0c;并且右键放到最后一层 三、解决结果 如上图所示 四、问题原因 直接在窗体右键设置背景色&#xff0c;由于Form是父类&#xff0c;即其下所有控件都与其同色&#xff0c;即使…

知识在人工智能中的核心作用:连接主义与符号主义的交融

知识在人工智能中的核心作用&#xff1a;连接主义与符号主义的交融 一、连接主义与深度学习的崛起二、感知与认知&#xff1a;AI的双眼与大脑三、知识的多元表示与处理四、符号主义与知识工程的实践五、知识在AI中的核心地位六、AI的具体应用案例分析七、知识图谱&#xff1a;认…

Linux多线程(一) 线程的创建与控制

一、线程概述 线程是轻量级的进程&#xff08;LWP&#xff1a;light weight process&#xff09;&#xff0c;在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合&#xff0c;指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位&#…

element-ui et -i 编译默认主题报错:ReferenceError: primordials is not defined

报错信息如下 fs.js:40 } primordials;^ ReferenceError: primordials is not defined导致这个问题的原因&#xff1a;node和gulp版本冲突&#xff01;&#xff01; 我使用的是node 14版本 解决方法&#xff1a; 看了好几个帖子&#xff0c;都推荐使用node 11.15.0版本&am…

css中新型的边框设置属性border-block

border-block 是 CSS 中的一个属性&#xff0c;主要用于在样式表中一次性设置元素的逻辑块向边框的属性值。这个属性是简写属性&#xff0c;可以同时设置 border-block-width、border-block-style 和 border-block-color。其中&#xff0c;border-block-start 用于设置元素的开…

物联网应用技术综合实训室解决方案

一、背景 随着物联网技术的快速发展和广泛应用&#xff0c;物联网产业已经成为新的经济增长点&#xff0c;对于推动产业升级、提高社会信息化水平具有重要意义。因此&#xff0c;培养具备物联网技术应用能力的高素质人才成为了迫切需求。 传统的教育模式往往注重理论教学&…

新科技辅助器具赋能视障生活:让盲人出行融入日常

随着科技日新月异的发展&#xff0c;一款名为蝙蝠避障专为改善盲人日常生活的盲人日常生活辅助器具应运而生&#xff0c;它通过巧妙整合实时避障与拍照识别功能&#xff0c;成功改变了盲人朋友们的生活格局&#xff0c;为他们提供了更为便捷、高效的生活体验。 这款非同…