<sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等标签的作用和用法

news2025/7/16 2:29:21

目录

一. sql 代码片段标签

二. resultMap 映射结果集标签

三. where 条件标签

四. set 修改标签

五. trim 标签

六. foreach 循环标签


一. sql 代码片段标签

sql 标签是 mybatis 框架中一个非常常用的标签页,特别是当一张表很有多个字段多,或者要多表查询很多字段时,都会用到。拓本之际是用来定义一个SQL代码片段,然后可以在其它SQL语句中引入此片段。

举例:如下图,m_user 表中有多个字段。

定义方法:将SQL代码片段写在标签内,并定义唯一id,如下

	<sql id="User_Column">
		 id,username,salt,phone,avatar,email,`status`,created,last_login
	</sql>

引用方式:<include refid="被引用的代码片段ID">

	select
		<include refid="User_Column" />
	from m_user

好处:在 mapper.xml 文件中,通常会定义大量的增删改查语句,当我们定义一个SQL片段时,就可以在整个 mapper.xml 文件中进行引用,简化了后续的开发,省去了很多不必要的写字段的时间和精力。

此外,当我们后续要对表添加修改字段时,基本上只需要对SQL片段内部的字段做增减,然后所有引用此SQL片段的SQL语句都会跟着改变,非常方便。

二. resultMap 映射结果集标签

数据库字段与Java代码之前的映射关系是我们经常需要注意的一个问题,例如数据库字段名称为 create_time,但是在Java代码中,通常采用驼峰的方式定义为 createTime,这就会导致字段映射失败,而 resultMap 就是来解决这个问题的。

使用方法:以上述 m_user 表为例

last_login 字段在Java代码中通常定义为 lastLogin;

定义方式: mapper.xml 文件中,在 resultMap 标签中这样写,定义为一 id ,type 就是映射的 Java 实体类,即 User 类。

    <!-- 通用查询映射结果 -->
    <resultMap id="UserResultMap" type="com.markerhub.entity.User">
        <id column="id" property="id" />
        <result column="username" property="username" />
        <result column="avatar" property="avatar" />
        <result column="email" property="email" />
        <result column="password" property="password" />
        <result column="status" property="status" />
        <result column="created" property="created" />
        <result column="last_login" property="lastLogin" />
    </resultMap>

使用方式:以 select 查询语句为例,当查询返回值 resultMap 中全部都有时,就可以通过 resultMap="id值" 来进行引用,当查询数据库时,mybatis 会自动把数据库字段的值映射到我们定义的Java属性值上。

    <select id="selectByUserName" resultMap="UserResultMap">
        select <include refid="User_Column"/>
        from m_user where username = #{username}
    </select>

三. where 条件标签

条件 where 语句,用于动态 SQL 时使用,在查询数据库时,我们不确定用户是否传入值,如果有值,就将条件加入到 where ,如果没有传值,则不加。

使用方法:将 where条件SQL定义在<where>标签内部,当 <where> 标签内部不为空时,where 标签就会生效。如果<where> 标签内部为空,则不会将where条件语句拼接到SQL语句内。

<if>标签也是同样的道理,test ="id != null" 表示如果 id 值不为空,则将 "and id = #{id}"SQL片段拼接到SQL语句中。

    <select id="selectByIdAndUserName" resultMap="UserResultMap">
        select <include refid="User_Column"/>
        from m_user w
        <where>
            <if test="id != null" >
                and id = #{id}
            </if>
            <if test="username != null">
                and username = #{username}
            </if>
        </where>
    </select>

四. set 修改标签

条件 set 语句,和 where 标签是一个道理。

示例代码如下,<set> 标签 搭配 <if> 标签,就可以达到当传入的值不为空时,就更新值的效果。

    <update id="updateUserById" parameterType="com.markerhub.entity.User">
        update m_user
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="avatar != null">
                avatar = #{avatar},
            </if>
            <if test="email != null">
                email = #{email},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
            <if test="created != null">
                created = #{created},
            </if>
            <if test="lastLogin != null">
                last_login = #{lastLogin},
            </if>
        </set>
        where id = #{id}
    </update>

五. trim 标签

trim 标签是一个单独的标签,一共提供了四个属性,如下图所示。

prtefix/suffix:在trim标签中内容前面/后面添加指定内容;

prefixOverrides/suffixOverrides:在trim标签中内容前面/后面去掉指定内容;

完整的SQL语句

这样写表示当 <if> 标签内容不为空时,添加 where 过滤条件,并且将 <if> 标签内不多余的后缀关键词 and 去掉防止语法错误。

    <select id="selectUserByIdAndUserName" parameterType="com.markerhub.entity.User">
        select <include refid="User_Column"/>
        from m_user
        <trim prefix="where" suffixOverrides="and">
            <if test="id != null and id != ''">
                id = #{id} and
            </if>
            <if test="username != null and username != ''">
                username = #{username} and
            </if>
        </trim>
    </select>

六. foreach 循环标签

foreach 就是用来循环的语句,通常出现在按照列表数据批量添加或批量删除数据时使用,它提供了五个属性;

cllection:代表要遍历的数组,Java接口在定义是最好使用@Parm进行标注;

item:表示数组中的每个元素;

open:表示该标签体以什么开头;

close :表示该标签体以什么结尾;

separator:表示数据之间的分隔符是什么;

示例代码:

这段代码的意思就是参数传递一个ID集合,集合不为空时,where 过滤条件按照 id 值循环删除所有符合条件的数据。

    <delete id="deleteUserByIds" parameterType="arraylist">
        delete from m_user
        <where>
            id in
            <foreach collection="array" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </where>
    </delete>

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

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

相关文章

【项目】CherrySudio配置MCP服务器

CherrySudio配置MCP服务器 &#xff08;一&#xff09;Cherry Studio介绍&#xff08;二&#xff09;MCP服务环境搭建&#xff08;1&#xff09;环境准备&#xff08;2&#xff09;依赖组件安装<1> Bun和UV安装 &#xff08;3&#xff09;MCP服务器使用<1> 搜索MCP…

【技术派后端篇】 Redis 实现用户活跃度排行榜

在各类互联网应用中&#xff0c;排行榜是一个常见的功能需求&#xff0c;它能够直观地展示用户的表现或贡献情况&#xff0c;提升用户的参与感和竞争意识。在技术派项目中&#xff0c;也引入了用户活跃度排行榜&#xff0c;该排行榜主要基于 Redis 的 ZSET 数据结构来实现。接下…

模拟算法(一)作业分析及答案

目录 作业1&#xff1a;角谷猜想 解题思路 &#xff1a; 代码实现&#xff1a; 作业2&#xff1a;校门外的树 解题思路 注意事项 代码实现 作业3&#xff1a;乒乓球 ​编辑 问题重述 解题思路&#xff1a; 作业1&#xff1a;角谷猜想 【描述】 所谓角谷猜想&#xf…

西红柿番茄检测数据集VOC+YOLO格式2320张1类别可用于计数

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2320 标注数量(xml文件个数)&#xff1a;2320 标注数量(txt文件个数)&#xff1a;2320 …

专题十六:虚拟路由冗余协议——VRRP

一、VRRP简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;虚拟路由冗余协议通过把几台设备联合组成一台虚拟的设备&#xff0c;使用一定的机制保证当主机的下一跳设备出现故障时&#xff0c;及时将业务切换到备份设备&#xff0c;从而保持通讯的连续性和…

DDPM(diffusion)原理

DDPM&#xff08;diffusion&#xff09;原理 1、DDPM&#xff08;原理&#xff09;2、DDPM和 Conditional DDPM&#xff08;原理解释&#xff09;2.1. Diffusion Models 原理详解核心思想前向扩散过程&#xff08;Forward Diffusion&#xff09;反向去噪过程&#xff08;Revers…

《软件设计师》复习笔记(2.2)——效验码、体系结构、指令、流水线

目录 一、校验码 码距 奇偶校验码 循环冗余校验码&#xff08;CRC&#xff09; 海明码 真题示例&#xff1a; 二、体系结构 Flynn分类法 三、指令系统 指令组成 指令执行过程 指令的寻址方式 操作数的寻址方式 CISC vs RISC 真题示例&#xff1a; 四、流水线技…

IsaacSim Asserts 配置

IsaacSim Asserts 配置 背景解决方案资源准备具体操作步骤验证 背景 我是习惯使用 isaacsim 的 standalone 模式&#xff0c;使用 python 脚本直接运行 script&#xff0c;然后弹窗&#xff0c;按照规则正确运行即可&#xff0c;但是&#xff0c;这就导致了一些问题出现&#…

接口自动化 ——fixture allure

一.参数化实现数据驱动 上一篇介绍了参数化&#xff0c;这篇 说说用参数化实现数据驱动。在有很多测试用例的时候&#xff0c;可以将测试用例都存储在文件里&#xff0c;进行读写调用。本篇主要介绍 csv 文件和 json 文件。 1.读取 csv 文件数据 首先创建 csv 文件&#xff…

systemctl管理指令

今天我们来继续学习服务管理指令,接下来才是重头戏-systemctl,那么话不多说,直接开始吧. systemctl管理指令 1.基本语法: systemctl [start | stop | restart | status]服务 注&#xff1a;systemctl指令管理的服务在/usr/lib/ systemd/system查看 2.systemctl设置服务的自…

【文件操作与IO】详细解析文件操作与IO (二)

本篇博客是上一篇文章的续写,重点介绍数据流,还包括三道练习题. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心…

go-map+sync.map的底层原理

map 哈希冲突解决方式 1.拉链法 2.开放地址法 底层结构 Go 的 map 在源码中由 runtime.hmap 结构体表示&#xff0c;buckets-指向桶数组的指针(常规桶)&#xff0c;oldbuckets-扩容时指向旧桶数组的指针。 type hmap struct {count int // 当前元素个数&#xff08;len…

Day53 二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* T…

物联网智慧教室项目(完整版)

物联网智慧教室项目(一)&#xff1a;智慧教室项目解决方案 一、智慧教室项目设计 &#xff08;一&#xff09;环境信息采集控制功能 1、硬件设计 使用STM32开发板模拟灯光控制&#xff0c;报警控制&#xff0c;光照信息采集&#xff1a; 灯光控制通过GPIO控制板载LED报警控…

计算机网络期中复习笔记(自用)

复习大纲 –第一章 概述 计算机网络的组成 网络边缘&#xff1a;主机和网络应用程序&#xff08;又称为“端系统”&#xff09; 端系统中运行的程序之间的通信方式可划分为两大类&#xff1a; 客户/服务器方式&#xff08;C/S方式&#xff09; 对等方式&#xff08;P2P方式…

14.Chromium指纹浏览器开发教程之WebGL指纹定制

WebGL指纹概述 当在浏览器打开的网页上浏览内容时&#xff0c;看到的大多是平面的、静态的图像和文字。但是有时想要在网页上看到更加生动、立体的图像&#xff0c;如3D游戏、虚拟现实应用等。这时&#xff0c;就需要用到WebGL。 简单来说&#xff0c;WebGL&#xff08;Web G…

GitHub SSH连接终极解决方案

GitHub SSH连接终极解决方案&#xff1a;443端口修改多场景故障排查指南 一、问题现象速查 当开发者执行以下命令时出现连接异常&#xff1a; ssh -T gitgithub.com常见报错类型&#xff1a; 经典端口阻塞ssh: connect to host github.com port 22: Connection refused密钥验…

每日算法【双指针算法】(Day 1-移动零)

双指针算法 1.算法题目&#xff08;移动零&#xff09;2.讲解算法原理3.编写代码 1.算法题目&#xff08;移动零&#xff09; 2.讲解算法原理 数组划分&#xff0c;数组分块&#xff08;快排里面最核心的一步&#xff09;只需把0改为tmp 双指针算法&#xff1a;利用数组下标来…

B端管理系统:企业运营的智慧大脑,精准指挥

B端管理系统的定义与核心功能 B端管理系统&#xff08;Business Management System&#xff09;是专门设计用于支持企业内部运作和外部业务交互的一套软件工具。它集成了多种功能模块&#xff0c;包括但不限于客户关系管理(CRM)、供应链管理(SCM)、人力资源管理(HRM)以及财务管…

使用Java基于Geotools的SLD文件编程式创建与磁盘生成实战

前言 在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地图的可视化呈现至关重要&#xff0c;而样式定义语言&#xff08;SLD&#xff09;文件为地图元素的样式配置提供了强大的支持。SLD 能够精确地定义地图图层中各类要素&#xff08;如点、线、面、文本等&#x…