MyBatis查询数据库(4)

news2024/11/16 12:06:14

前言🍭

❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️

Spring + Spring MVC + MyBatis_冷兮雪的博客-CSDN博客

终于到了MyBatis最后一篇,这篇讲的是动态SQL的使用。

复杂情况:动态SQL使用🍭

动态 SQL 是Mybatis的强大特性之⼀,能够完成不同条件下不同的 SQL 拼接。 可以参考官方文档:mybatis – MyBatis 3 | 动态 SQL

一、<if>标签🍭

在注册用户的时候,可能会有这样⼀个问题,有的信息是必填,有的是选填,那如果在添加⽤户的时候有不确定的字段传入,程序应该 如何实现呢?

这个时候就需要使用动态标签 <if> 来判断了,比如添加的时候性别 sex 为非必填字段,具体实现如下:

<insert id="insert">
        insert into user(
        username,
        password,
        <if test="sex != null">
            sex,
        </if>
        birthday,
        head
        ) values (
        #{username},
        #{password},
        <if test="sex != null">
            #{sex},
        </if>
        #{birthday},
        #{head}
        )
    </insert>

需要注意 test 中的 sex,是传入对象中的属性,不是数据库字段。而且if标签都是成对出现的

二、<trim>标签🍭

之前的插入用户功能,只是有⼀个 sex 字段可能是选填项,如果所有字段都是非必填项,就考虑使用<trim>标签结合<if>标签,对多个字段都采取动态生成的方式。

<trim>标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

调整 UserMapper.xml 的插入语句为:

    <insert id="insert">
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">
                username,
            </if>
            <if test="password != null">
                password,
            </if>
            <if test="sex != null">
                sex,
            </if>
            <if test="birthday != null">
                birthday,
            </if>
            <if test="head != null">
                head,
            </if>
            <if test="createTime != null">
                create_time,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="username != null">
                #{username},
            </if>
            <if test="password != null">
                #{password},
            </if>
            <if test="sex != null">
                #{sex},
            </if>
            <if test="birthday != null">
                #{birthday},
            </if>
            <if test="head != null">
                #{head},
            </if>
            <if test="createTime != null">
                #{createTime},
            </if>
        </trim>
    </insert>

在以上 sql 动态解析时,会将第⼀个 <trim> 部分做如下处理:

  • 基于 prefix 配置,前缀部分加上 (
  • 基于 suffix 配置,后缀部分加上 )
  • 多个 <if>组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于 suffixO verrides 配置去掉最后⼀个 ,
  • 注意 <if test=“createTime != null”> 中的 createTime 是传入对象的属性,不是数据库字段

三、<where>标签🍭

传入的用户对象,根据属性做 where 条件查询,用户对象中属性不为 null 的,都为查询条件。如user.username 为 "a",则查询条件为 where username="a":

UserMapper:

List<User> selectByCondition(User user);

UserMapper.xml:

 <select id="selectByCondition" parameterType="com.example.ssmdemo1.entity.Userinfo" resultMap="baseMap">
        select id, username, password, nickname, sex, birthday, head, create_time from user
        <where>
            <if test="username != null">
                and username=#{username}
            </if>
            <if test="password != null">
                and password=#{password}
            </if>
            <if test="sex != null">
                and sex=#{sex}
            </if>
            <if test="birthday != null">
                and birthday=#{birthday}
            </if>
            <if test="head != null">
                and head=#{head}
            </if>
            <if test="createTime != null">
                and create_time=#{createTime}
            </if>
        </where>
    </select>
以上<where>标签也可以使用<trim prefix="where" prefixOverrides="and"> 替换,中间的if标签代码不需要变。

四、<set>标签🍭

根据传入的用户对象属性来更新用户数据,可以使用<set>标签来指定动态内容。

UserMapper 接口中修改用户方法:根据传入的用户 id 属性,修改其他不为 null 的属性:

int updateById(User user); 

UserMapper.xml 中添加更新用户 SQL:

<update id="updateById" parameterType="com.example.ssmdemo1.entity.Userinfo">
        update user
        <set>
            <if test="username != null">
                username=#{username},
            </if>
            <if test="password != null">
                password=#{password},
            </if>
            <if test="sex != null">
                sex=#{sex},
            </if>
            <if test="birthday != null">
                birthday=#{birthday},
            </if>
            <if test="head != null">
                head=#{head},
            </if>
            <if test="createTime != null">
                create_time=#{createTime},
            </if>
        </set>
        where id=#{id}
    </update>

以上<set>标签也可以使用 <trim prefix="set" suffixOverrides=","> 替换。

五、<foreach>标签🍭

对集合进⾏遍历时可以使用该标签。<foreach>标签有如下属性:

  • collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

示例:根据多个文章 id 来删除文章数据。

ArticleMapper 中新增接口方法:

int deleteByIds(List<Integer> ids);

ArticleMapper.xml 中新增删除 SQL:

<delete id="deleteByIds">
        delete from article where id in
        <foreach collection="list" item="item" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </delete>

单元测试代码,删除id为5和6的用户:

@Test
    void deleteByIds() {
        List<Integer> ids=new ArrayList<>();
        ids.add(5);
        ids.add(6);
        int result=userMapper.deleteByIds(ids);
        System.out.println("删除:"+result);
    }

六、choose-when-otherwise🍭

类似于Java中的switch语句,根据不同条件选择不同的SQL片段。

<select id="getUserList" resultType="User">
  SELECT * FROM users
  <where>
    <choose>
      <when test="status != null">
        AND status = #{status}
      </when>
      <when test="name != null and name != ''">
        AND name = #{name}
      </when>
      <otherwise>
        AND active = 1
      </otherwise>
    </choose>
  </where>
</select>

动态SQL是MyBatis的一个重要特性,它允许你在SQL语句中根据条件动态地添加、修改或删除语句片段,以便更灵活地构建SQL查询和更新操作。

上面这些示例只是MyBatis动态SQL的一小部分用法。你可以根据自己的需求和情况,结合使用这些特性来构建更灵活、可维护的数据库操作语句。记得阅读MyBatis的官方文档以深入了解动态SQL的更多用法和细节。

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

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

相关文章

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

【类和对象】基础知识

目录 一、类的定义 定义方式一&#xff1a;定义与声明都在类中 定义方式二&#xff1a;定义与声明分离 二、类的实例化&&类对象存储方式 类的实例化 类对象存储模式 三、this指针 一、类的定义 定义方式一&#xff1a;定义与声明都在类中 #include<iostream&…

深入学习 Redis - 谈谈你对 Redis 的 RDB、AOF、混合持久化的了解吧?

目录 一、Redis 是怎么存储数据的&#xff1f; 二、Redis 具体是按照什么样的策略来实现持久化的&#xff1f; 2.1、RDB&#xff08;Redis Database&#xff09; 2.1.1、触发机制 2.1.2、bgsave 命令处理流程 2.1.3、RDB 文件的处理 2.1.4、演示效果 1&#xff09;手动执…

GEE:谐波模型在遥感影像中的应用(季节性变化的拟合与可视化)

作者:CSDN @ _养乐多_ 谐波模型是一种常用的工具,用于拟合和分析影像数据中的周期性和季节性变化。本文将介绍如何使用Google Earth Engine平台实现谐波模型,通过对Landsat影像进行处理和拟合,展示季节性变化的拟合结果,并通过图表和地图可视化展示数据。 谐波模型是一种…

《Java-SE-第二十九章》之Synchronized原理与JUC常用类

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

OpenAI 已为 GPT-5 申请商标,GPT-4 发布不到半年,GPT-5 就要来了吗?

据美国专利商标局&#xff08;USPTO&#xff09;信息显示&#xff0c;OpenAI已经在7月18日申请注册了“GPT-5”商标。 在这份新商标申请中&#xff0c;OpenAI将“GPT-5”描述为一种“用于使用语言模型的可下载计算机软件”。 继GPT-4发布之后&#xff0c;它预计将成为OpenAI下一…

【硬件设计】模拟电子基础三--放大电路

模拟电子基础三--放大电路 一、集成运算放大器1.1 定义、组成与性能1.2 电流源电路1.3 差动放大电路1.4 理想运算放大器 二、集成运算放大器的应用2.1 反向比例运算电路2.2 同向比例运算电路2.3 反向加法运算电路2.4 反向减法运算电路2.5 积分运算电路2.6 微分运算电路2.7电压比…

备战秋招 | 笔试强训23

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、2 —3—6—7—8—14—15—30&#xff0c;下面的数字哪一个是不属于这组数字的系列? A. 3 B. 7 C. 8 D. 15 2、下列关于线性链表的叙述中&#xff0c;正确的是&#xff08; &#xff09; A. 各数…

【数理知识】协方差,随机变量的的协方差,随机变量分别是单个数字和向量时的协方差

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】协…

Java上传文件图片到阿里云OSS

开通阿里云OSS 进入阿里云官网&#xff0c;开通对象存储 OSS服务进入对象存储 OSS管理控制台&#xff0c;在Bucket 列表中创建Bucket 在AccessKey管理中创建AccessKey ID和AccessKey Secret。保存起来&#xff0c;代码中需要 代码开发 pom引入依赖 <!-- 阿里云OSS -->…

Java的变量与常量

目录 变量 声明变量 变量的声明类型 变量的声明方式&#xff1a;变量名 变量名的标识符 初始化变量 常量 关键字final 类常量 总结 变量和常量都是用来存储值和数据的基本数据类型存储方式&#xff0c;但二者之间有一些关键差别。 变量 在Java中&#xff0c;每个变…

架构训练营学习笔记:5-2 负载均衡架构

多级负载架构 设计关键点 性能需求、维护复杂度之间做取舍。 一可以去掉F5、LVS &#xff1a; F5 是成本较高&#xff0c;LVS 是复杂&#xff0c;对于性能没那么高需求&#xff0c;可以去掉。 二 去掉ng: 服务网关服务 适应于初创公司快速验证&#xff0c;内部的 小系统…

深入解析人脸识别技术:原理、应用与未来发展

人脸识别技术&#xff1a;从原理到应用 引言人脸识别技术的重要性和应用领域 人脸识别的基本原理图像采集与预处理特征提取与表征数据匹配与比对 传统人脸识别方法主成分分析&#xff08;PCA&#xff09;线性判别分析&#xff08;LDA&#xff09;小波变换在人脸识别中的应用 深…

论文笔记:SUPERVISED CONTRASTIVE REGRESSION

2022arxiv的论文&#xff0c;没有中&#xff0c;但一作是P大图班本MIT博&#xff0c;可信度应该还是可以的 0 摘要 深度回归模型通常以端到端的方式进行学习&#xff0c;不明确尝试学习具有回归意识的表示。 它们的表示往往是分散的&#xff0c;未能捕捉回归任务的连续性质。…

mysql8配置binlog日志skip-log-bin,开启、关闭binlog,清理binlog日志文件

1.概要说明 binlog 就是binary log&#xff0c;二进制日志文件&#xff0c;这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复&#xff0c;增量备份&#xff0c;主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注&#xff0c;但是对于运维或者架…

continue有什么作用

学习算法以来&#xff0c;break使用的比较多&#xff0c;continue使用的比较少&#xff0c;只知道break是跳出循环的作用,不知道continue有什么作用。 continue可以跳过本次循环&#xff0c;强制执行下一次循环。 比如这个代码 #include<iostream>using namespace std…

开源进展 | WeBASE v3.1.0发布,新增多个实用特性

WeBASE是一个友好、功能丰富的区块链中间件平台&#xff0c;通过一系列通用功能组件和实用工具&#xff0c;助力社区开发者更快捷地与区块链进行交互。 目前WeBASE已更新迭代至v3.1.0版本&#xff0c;本次更新中&#xff0c;WeBASE带来了最新的合约Java脚手架导出功能&#xff…

U盘连接电脑显示为灰色怎么办?

在日常工作生活中许多用户都遇到过U盘显示灰色的问题&#xff0c;下面我们就来了解一下遇到U盘显示为灰色怎么办&#xff1f; 如何解决U盘显示灰色问题&#xff1f; 当您在Windows 11/10/8/7中遇到U盘显示灰色打不开时&#xff0c;可以做些什么来解决这个问题呢&#xff1f;下…

redis的缓存更新策略

目录 三种缓存更新策略 业务场景&#xff1a; 主动更新的三种实现 操作缓存和数据库时有三个问题 1.删除缓存还是更新缓存&#xff1f; 2.如何保证缓存与数据库的操作的同时成功或失败&#xff1f; 3.先操作缓存还是先操作数据库&#xff1f; 缓存更新策略的最佳实践方案&am…

Could not autowire. There is more than one bean of ‘ xxx ‘ type.

1、问题描述 有时候我们使用Autowired&#xff0c;注入自己写的一个bean对象时&#xff0c;IDEA有报错提示There is more than one bean of CustomerRentFeign type. 虽然可以忽略&#xff0c;但是 也可以 彻底解决。 spring容器中 本身就有一个CustomerRentFeign类型的代理对…