【MyBatisⅡ】动态 SQL

news2025/1/13 16:46:33

目录

🎒1 if 标签

🫖2 trim 标签

👠3 where 标签

🦺4 set 标签

🎨5 foreach 标签


动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。

在 xml 里面写判断条件。

动态SQL 在数据库里的体现就是,phtot 这个字段在数据输入的时候,在没有默认值情况下,可以为空。

 

 在 SQL 中,空和 NULL 是两个不同的概念。空什么也没有显示,而 NULL 显示了 NULL。

1 if 标签

    /**
     * 动态 sql
     * if 标签
     * @param userInfo
     * @return
     */
    int add2(UserInfo userInfo);
    <insert id="add2">
        insert into userinfo(username,password
        <if test="photo != null">
            ,photo
        </if>
        )values(#{username},#{password}
        <if test="photo != null">
            ,#{photo}
        </if>
        )
    </insert>
    @Test
    void add2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("猪八戒");
        userInfo.setPassword("569875");
        userInfo.setPhoto("lion.png");
        int result = userMapper.add2(userInfo);
        System.out.println(result);
    }

 

    @Test
    void add2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("如来佛祖");
        userInfo.setPassword("99999");

        int result = userMapper.add2(userInfo);
        System.out.println(result);
    }

2 trim 标签

多个字段可以为空的情况下,只要有一个字段不为空,就需要用到添加操作。动态拼接。

    /**
     * trim 标签
     * @param userInfo
     * @return
     */
    int add3(UserInfo userInfo);
    <insert id="add3">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                username,
            </if>
            <if test="password!=null">
                password,
            </if>
            <if test="photo!=null">
                photo
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username!=null">
                #{username},
            </if>
            <if test="password!=null">
                #{password},
            </if>
            <if test="photo!=null">
                #{photo}
            </if>
        </trim>
    </insert>

 

    @Test
    void add3() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("观音菩萨");
        userInfo.setPassword("3785");

        int result = userMapper.add3(userInfo);
        System.out.println(result);
    }

 

    @Test
    void add3() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("卓耿");
        userInfo.setPassword("sfgoz");
        userInfo.setPhoto("dragon.jpn");

        int result = userMapper.add3(userInfo);
        System.out.println(result);
    }

 

 

3 where 标签

根据传入参数,来决定 SQL 语句是否有 where 关键字。动态生成 where 语句。

对于 int 类型,不传的话,默认为 0 ,而不是 null。

where 标签除了动态生成 where 语句外,还可以自动的去掉语句前面的 and。所以 and 只能放在语句的前面,放在最后面会报错!

    /**
     * where 标签
     * @param userInfo
     * @return
     */
    List<UserInfo> getListByWhere(UserInfo userInfo);
    <select id="getListByWhere" resultType="com.example.demo.Model.UserInfo">
        select * from userinfo
        <where>
            <if test="id>0">
                id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
            <if test="photo!=null">
                and photo=#{photo}
            </if>
        </where>
    </select>
    @Test
    void getListByWhere() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        List<UserInfo> list = userMapper.getListByWhere(userInfo);
        System.out.println(list);
    }

    @Test
    void getListByWhere() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("白骨精");
        List<UserInfo> list = userMapper.getListByWhere(userInfo);
        System.out.println(list);
    }

 

也可以使用 trim 标签完成上述 where 标签的功能,代码如下:

   <select id="getListByWhere" resultType="com.example.demo.Model.UserInfo">
        select * from userinfo
        <trim prefix="where" prefixOverrides="pre">
            <if test="id>0">
                id=#{id}
            </if>
            <if test="username!=null">
                and username=#{username}
            </if>
            <if test="password!=null">
                and password=#{password}
            </if>
            <if test="photo!=null">
                and photo=#{photo}
            </if>
        </trim>
    </select>

4 set 标签

用于修改。

    /**
     * set 标签
     * @param userInfo
     * @return
     */
    int update2(UserInfo userInfo);

 

    <update id="update2">
        update userinfo
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password},
            </if>
            <if test="photo!=null">
                photo=#{photo}
            </if>
        </set>
        where id=#{id}
    </update>

 

    @Test
    void update2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("小玫瑰");
        userInfo.setId(6);
        userInfo.setPassword("palsov");
        userInfo.setPhoto("rose.jpg");
        int result = userMapper.update2(userInfo);
        System.out.println(result);
    }

    @Test
    void update2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("卡莉熙");
        userInfo.setId(4);
        userInfo.setPassword("msjf");

        int result = userMapper.update2(userInfo);
        System.out.println(result);
    }

 

可以看出,set 标签会自动去除末尾的逗号! 

5 foreach 标签

多条 sql 数据删除的时候。批量删除。

    /**
     * foreach 标签
     * @param ids
     * @return
     */
    int delByIds(List<Integer> ids);
    <delete id="delByIds">
        delete from userinfo
        where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>
    @Test
    void delByIds() {
        List<Integer> list = new ArrayList<Integer>(){{
            add(1);
            add(2);
            add(3);
        }};

        int ret = userMapper.delByIds(list);
        System.out.println(ret);
    }


 

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

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

相关文章

TypeScript_线性结构-数组-栈结结构

数据结构与算法 面试经典 150 题 编程的最终目的只有一个&#xff1a;对数据进行操作和处理 术之尽头炁体源流编程尽头数据结构 数据结构与算法的本质就是一门专门研究数据如何组织、存储和操作的科目 系统、语言、框架源码随处可见数据结构与算法 无论是操作系统&#xff…

openlayers-16-添加一组轨迹动画

实现一组动画&#xff0c;即根据一组只有起止点坐标的线段&#xff0c;实现点在这些线段上较为平滑的移动&#xff0c;移动速度和平滑程度均可控制。 下面的代码仅作为思路参考&#xff0c;还欠缺很多细节&#xff0c;比如在进行插值计算时&#xff0c;还需要判断经纬度坐标差&…

RocketMQ(消息中间件)

目录 一、为什么会出现消息中间件&#xff1f; 二、消息中间件是干嘛的&#xff1f; 三、应用解耦 四、流量削峰 五、异步处理 1.串行方式&#xff1a; 2.并行方式&#xff1a; 3.引入消息队列&#xff1a; 六、RocketMQ的架构及概念 一、为什么会出现消息中间件&#…

opencv-人脸识别

对https://blog.csdn.net/weixin_46291251/article/details/117996591这哥们代码的一些修改 import cv2 import numpy as np import os import shutil import threading import tkinter as tk from PIL import Image, ImageTkchoice 0# 首先读取config文件&#xff0c;第一行…

国内8个能用AI赚钱的在线兼职渠道整理

hi&#xff0c;同学们&#xff0c;我是赤辰&#xff0c;本期是赤辰第3篇AI工具类教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完可以领取&#xff01;即将迎来新学期了&#xff0c;今天就来聊聊学生党如何应用AI技能通过兼职&#xff0c;赚取生活费&#xff0c;这里指…

使用HTTPS模式建立高效爬虫IP服务器详细步骤

嘿&#xff0c;各位爬虫小伙伴们&#xff01;想要自己建立一个高效的爬虫IP服务器吗&#xff1f;今天我就来分享一个简单而强大的解决方案——使用HTTPS模式建立工具&#xff01;本文将为你提供详细的操作步骤和代码示例&#xff0c;让你快速上手&#xff0c;轻松建立自己的爬虫…

【枚举区间+线段树】CF Ehu 152 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 感觉是个套路题 对区间计数&#xff0c;按照CF惯用套路&#xff0c;枚举其中一个端点&#xff0c;对另一个端点计数 对于这道题&#xff0c;枚举右端点&#xff0c;对左端点计数 Code&#xff1a; #include &…

Form.Item创建自定义表单

一、概述 Antd是一个非常强大的UI组件库&#xff0c;里面的Form表单组件也基本能满足我们大多数场景。但是也有需要自定义表单的场景。 Vue2里我们使用v-model&#xff0c;结合子组件的model属性&#xff0c;来实现自定义组件的双向绑定。 Vue3里我们使用v-model&#xff0c;…

没有苹果开发者账号能否创建ios证书-最新

​ 目录 摘要&#xff1a; 引言&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 步骤四&#xff1a; 步骤五&#xff1a; 总结&#xff1a; 摘要&#xff1a; 本文介绍了在没有Mac电脑的情况下&#xff0c;使用appuploader工具生成iOS证书和描…

高通QualComm、MTK耦合测频段工具和综测校准工具的自由定制 与工厂Mes对接、使用PowerMeter测量等

一.MTK耦合工具V1.3 20220409 MTK芯片 1.逻辑&#xff1a; 打开软件&#xff0c;扫码SN&#xff0c;自动连接&#xff0c;连接成功后 1).开启强发&#xff08;强发参数 LTE频段 1、3、5、7、28&#xff09; 2).读测量值 3).结果判定&#xff…

【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理&#xff08;11-39--&#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路&#xff0c;想要了解计算机组成的基本原理&#xff0c;还是需要有…

电脑报错提示xinput1_3.dll缺失怎么办?xinput1_3.dll丢失的简单恢复方案

今天&#xff0c;我将为大家分享一个与我们日常工作息息相关的话题——xinput1_3.dll丢失的4种解决方法。在我们的日常工作和生活中&#xff0c;电脑出现问题是常有的事&#xff0c;而xinput1_3.dll丢失则是其中较为常见的一种问题。那么&#xff0c;什么是xinput1_3.dll?它为…

C盘扩容遇到的问题(BitLocker解密、)

120G的C盘不知不觉的就满了&#xff0c;忍了好久终于要动手了。 尽管电脑-管理--磁盘管理里可以进行磁盘大小调整&#xff0c;但由于各盘都在用&#xff0c;不能够连续调整&#xff0c;所以选用DiskGenius。 # DiskGenius调整分区大小遇到“您选择的分区不支持无损调整容量” …

undolog

一、原子性 ACID&#xff1a;通过undolog保证原子性 二、undolog 如何做 把回滚时所需的东西都给记下来&#xff1a; 1、插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;回滚的时候只需要把这个主键值对应的记录删掉就好了。 2、删除了一条记录&…

10 行代码能做什么?

10 行代码能做什么&#xff1f; 写一串 SQL Join&#xff0c;统计全渠道市场营销的 ROI 用 JS 画个饼图&#xff0c;展示最有效的广告投放策略 用 Python 写段算法&#xff0c;分析销量骤降的原因是什么 …… 数据出错了&#xff0c;写个对数脚本 -_-|| AI 时代&#xff0c;…

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…

管理类联考——逻辑——汇总篇——知识点突破——形式逻辑——联言选言——定义

角度——本质定义 联言 联言命题是断定两种或两种以上事物情况同时存在的命题&#xff0c;用“A并且B”表示&#xff0c;逻辑符号为A ∧ B。 若“A ∧ B”为真&#xff0c;表明A是真的&#xff0c;同时B也是真的。 【定义】联言命题是表示若干判断同时成立的命题。 【刻画】…

Java与其他编程语言比较分析,编程语言选择与优点、缺点和适用场景详解

原文地址&#xff1a;Java与其他编程语言比较分析&#xff0c;编程语言选择与优点、缺点和适用场景详解 Java 擅长可移植性和可靠性&#xff0c;Python 擅长通用性和简单性&#xff0c;JavaScript 擅长 Web 开发&#xff0c;C 擅长性能&#xff0c;Go 擅长效率。网址:yii666.c…

网御星云-上网行为管理系统bottomframe.cgi接口存在SQL注入

一、免责声明&#xff1a; 本次文章仅限个人学习使用&#xff0c;如有非法用途均与作者无关&#xff0c;且行且珍惜&#xff1b;由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;公众号望雪阁及作者不为此…

OS 内存使用和分段

磁盘很大但是内存很小&#xff0c;当进程一堵塞的时候&#xff0c;就把进程一放入磁盘&#xff0c;然后进程二进去。进程三睡眠的时候在把二和三交换&#xff0c;所以载入之后重定位不太行 GDT是整个操作系统的段表&#xff0c;多个进程的 LDT时某个进程的段表