MyBatis——进阶操作(2)

news2025/1/18 13:55:35

标签

if标签

当提交的表单中有些为非必填项,用户并没有上传这些属性的值,那么程序可以上传NUll,也可以用if标签判断用户有没有上传这个值

<if test="参数!=null">
	操作
</if>

其中test中填写一条语句,如果得到true,就执行下面的操作,否则就不执行

例如,添加username,password和photo属性
UserMapper

int add2(UserInfo userInfo);

UserMapper.xml:
需要注意逗号的位置,如果photo未传输数值,那么形成的句子就是username,password,不会有语法问题

<insert id="add2">
    insert into userinfo(username,
    <if test="photo != null">
        photo,
    </if>
    password)
    values(#{username},
    <if test="photo != null">
        #{photo},
    </if>
    #{password})
</insert>

UserMapperTest:

@Test
void add2() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("zhangsan");
    userInfo.setPhoto(null);
    userInfo.setPassword("333");
    int result = userMapper.add2(userInfo);
    System.out.println(result);
}

可以看到,当photo并没有传值时,生成的JDBC语句中就没有photo
在这里插入图片描述

trim标签

如果所有的属性都是非必填项,那么逗号的位置就很难确定了,因此可以使用trim标签来拼接字符串

<trim prefix="前缀内容" suffix="后缀内容" prefixOverrides="去除前缀相关值" suffixOverrides="去除后缀相关值">
	
</trim>
  • prefix会在最前面添加内容
  • suffix会在最后面添加内容
  • prefixOverrides则是如果最后一个字符是指定值,就去掉该值(例如prefixOverrides=“,”,那么如果最前面是逗号就会去除最前面的逗号)
  • suffixOverrides则是去除最后面的值
    一般来说,trim会搭配if标签来使用,例如下面这个场景:username,password,photo都是非必填项

UserMapper:

int add3(UserInfo userInfo);

UserMapper.xml
这里会自动添加(),并且如果最后是逗号,会删除这个逗号

<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>

UserMapperTest:

@Test
void add3() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("lisi");
    userInfo.setPhoto(null);
    userInfo.setPassword("444");
    int result = userMapper.add2(userInfo);
    System.out.println(result);
}

可以看到确实去除了password后面的逗号(也就是最后一个字符)
在这里插入图片描述

where标签

用来查找相关信息,会生成where的语句

  • where标签一般也是配合if来使用
  • where标签会自动帮助我们删除最前面的and关键字
  • where标签中如果没有内容,那么就不会产生where的关键字
    也就是说,下面这两种写法都是可以的,只不过where的写法更加简介
<select id="getListByParam" resultType="com.example.demo.entity.UserInfo">
    select * from userinfo
    <where>
        <if test="username!=null">
            username = #{username}
        </if>
        <if test="password!=null">
            and password = #{password}
        </if>
    </where>
</select>
<select id="getListByParam" resultType="com.example.demo.entity.UserInfo">
    select * from userinfo
    <trim prefix="where" prefixOverrides="and">
        <if test="username!=null">
            username = #{username}
        </if>
        <if test="password!=null">
            and password = #{password}
        </if>
    </trim>
</select>

在这里插入图片描述

set标签

用来更改属性的值,会自动生成set语句

  • set标签一般配合if标签使用
  • set标签会自动去除最后一个逗号(英文)
<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>

也可以使用trim来完成这段代码
在这里插入图片描述

foreach标签

当我们需要大批量进行操作时,可以在代码中使用for循环,也可以直接在sql中进行批量操作,具体方法就是使用in()
语法格式:

<foreach collection="集合变量" open="前缀" close="后缀" item="集合中变量名" separator="分隔符">
	操作
</foreach>

例如,要删除大量指定id的用户信息:
UserMapper:

int deleteById(List<Integer> ids);

UserMapper.xml:

<delete id="deleteById">
    delete from userinfo where id in
    <foreach collection="ids" open="(" close=")" item="id" separator=",">
        #{id}
    </foreach>
</delete>

UserMapperTest:

@Test
void deleteById() {
    List<Integer> ids = new ArrayList<>();
    ids.add(1);
    ids.add(2);
    ids.add(3);
    int result = userMapper.deleteById(ids);
    System.out.println(result);
}

在这里插入图片描述

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

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

相关文章

uniapp实现地图点聚合功能

前言 在工作中接到的一个任务&#xff0c;在app端实现如下功能&#xff1a; 地图点聚合地图页面支持tab切换&#xff08;设备、劳务、人员&#xff09;支持人员搜索显示分布 但是uniapp原有的map标签不支持点聚合功能&#xff08;最新的版本支持了点聚合功能&#xff09;&am…

爬虫碎碎念

20230304 - &#xff08;非专业人士&#xff0c;简单记录自己的需求和思考&#xff09; 0. 引言 平时看到一些网站的照片什么的&#xff0c;有那种批量下载的需求&#xff0c;当然有些也是视频网站的图片介绍什么的&#xff0c;也即是说&#xff0c;我需要把这些网站的照片批…

剑指 Offer II 013. 二维子矩阵的和

题目链接 剑指 Offer II 013. 二维子矩阵的和 mid 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1)&#xff0c;右下角为 (row2, col2)。 实现 NumMatrix类&#xf…

测开:前端基础-css

一、CSS介绍和引用 1.1 css概述 层叠样式表&#xff0c;是一种样式表语言&#xff0c;用来描述HTML和XML文档的呈现。 CSS 用于简化HTML标签&#xff0c;把关于样式部分的内容提取出来&#xff0c;进行单独的控制&#xff0c;使结构与样式分离开发。 CSS 是以HTML为基础&…

docker环境下安装jenkins

前言 废话不多说&#xff0c;上来就是干&#xff0c;jenkins是干嘛用的&#xff0c;小白的话&#xff0c;自己去查&#xff0c;首先我的环境时centos7&#xff0c;自己在vmware建立的一套centos虚拟机环境。docker版本如图所示: 第一步 其实可以先查看一下又那些镜像jenkin…

DC-5 靶场学习

文章目录环境配置&#xff1a;信息搜集&#xff1a;漏洞测试&#xff1a;漏洞利用&#xff1a;提权&#xff1a;得到flag&#xff1a;下载地址&#xff1a;环境配置&#xff1a; 直接将其与攻击机放在同一网段。 信息搜集&#xff1a; arp-scan -l nmap -sP 192.168.28.0/24漏…

基于SSH的网上图书俱乐部的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;网上图书俱乐部是一个虚拟的书友会&#xff0c;该平台是为了给那些爱好读书的人提供一个网上交流的场所。以服务广大读者朋友为主&#xff0c;强调互动性、知识性、趣味性&#xff0c;是读书、会友的好去处&#xff0c;读者可以在线…

【Spring学习】Spring自定义标签详细步骤

目录标题前言一、自定义标签步骤1、定义属性POJO2、定义XSD文件描述组件内容3、定义标签解析器4、注册标签解析器5、定义spring.handlers和spring.schemas文件6、user.xml文件配置7、测试类二、仓库位置总结前言 Spring中除了http://www.springframework.org/schema/beans命名…

pytorch-在竞赛中去摸索用法,用房价预测比赛了解数据处理流程

实战Kaggle比赛&#xff1a;房价预测 让我们动手实战一个Kaggle比赛&#xff1a;房价预测House Prices - Advanced Regression Techniques | Kaggle。本文将提供未经调优的数据的预处理、模型的设计和超参数的选择。通过动手操作、仔细观察实验现象、认真分析实验结果并不断调…

5分钟被美团面试官请出去,3年测试经验被这几个题问到心虚

5分钟前&#xff1a;“哥们我去美团面试了&#xff01;祝我好运~”5分钟后&#xff1a;“刚从美团走出来&#xff0c;被自动化测试的一些面试题难到了…”“越想越觉得可惜回想面试经过&#xff0c;在几个关键的问题没有给到面试官想要的答案。”“我不是不会&#xff0c;我都干…

工业互联网标识解析二节节点平台_能源管理工业互联网大数据平台

能源管理工业互联网大数据平台项目&#xff0c;是由吉佳通达负责建设的&#xff0c;通过建设形成能源管理的数字化产业基地&#xff0c;推动能源数字化转型升级&#xff0c;形成大数据运营平台。以能源管理与各个企业节点进行数据对接后&#xff0c;利用工业互联网唯一标识身份…

几个C语言容易忽略的问题

1 取模符号自增问题 我们不妨尝试写这样的程序 #include<stdio.h> int main(){int n,t5;printf("%d\n",7%(-3));//1printf("%d\n",(-7)%3);//-1while(--t)printf("%d\n",t);t5;while(t--)printf("%d\n",t);return 0; } 运行…

十、Spring IoC注解式开发

1 声明Bean的注解 负责声明Bean的注解&#xff0c;常见的包括四个&#xff1a; ComponentControllerServiceRepository Controller、Service、Repository这三个注解都是Component注解的别名。 也就是说&#xff1a;这四个注解的功能都一样。用哪个都可以。 只是为了增强程序…

CSS奇思妙想之-利用CSS裁剪(clip-path)完成各种图形

在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 clip-path介绍 css裁剪&#xff08;clip-path&#xff09;这个属性平时率非常低。但是…

Submodule命令:android如何将自己项目中的某个Module作为gitlab中第三方公共库

一、创建远程公共库 1、Android Studio创建本地仓库 创建一个新的module 在新建module中添加代码(此处示例代码) 右击新建的module&#xff0c;打开新建module的命令行界面&#xff0c; 因为我们只上传这个module的代码&#xff0c;而不是整个项目的代码 命令行中输入以下命令…

2023年03月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年03月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

【vue】环境安装与实例创建

vue是一套用于构建前端界面的框架。 文章目录1. vue环境安装2. 创建项目vue init创建项目Vite创建项目vue create创建项目vue ui创建项目3. 打包项目1. vue环境安装 首先安装nodejs并配置npm国内镜像&#xff1a;https://zhuanlan.zhihu.com/p/442215189 升级或安装cnpm并查看…

Java 字符编码

编码&#xff1a;数据存储进计算机中需要转换为二进制存储&#xff0c;这个过程就是编码。 解码&#xff1a;计算机读取数据并展示在页面上&#xff0c;需要将二进制转换为人类语言的过程&#xff0c;叫做解码。 乱码&#xff1a;如果编码和解码时使用的码表不一样&#xff0c;…

ChatGPT火爆,元宇宙“熄火”?别操之过急,也别敷衍了事

近期&#xff0c;在ChatGPT火爆的同时&#xff0c;元宇宙“遇冷”的消息引起关注。据科技圈流传&#xff0c;大量元宇宙聊天群一夜之间改名为ChatGPT聊天群。ChatGPT火爆出圈导致元宇宙“熄火”&#xff0c;真的是这样吗&#xff1f;ChatGPT与元宇宙二者有怎样的底层逻辑关联&a…

Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

首先区分一下Linux信号跟进程间通信中的信号量&#xff0c;它们的关系就犹如老婆跟老婆饼一样&#xff0c;没有一毛钱的关系。 信号的概念 信号的概念&#xff1a;信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。比如&#xff1a;红绿灯是一种信号&#xff0c…