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

目录

一. 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.mzph.cn/pingmian/77253.shtml

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

相关文章

《MySQL:MySQL数据库的基本操作》

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 大写表示关键字[]&#xff1a;表示可选项CHARACTER SET ch…

深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失

学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异&#xff0c;如何量化&#xff1f; 计算真实概论分布P信息量 和 估计概论分布为Q&#xff0c;但实际概率分布为P时信息量的差值 那么设&#xff0c;概率分…

MySQL:Join连接的原理

连接查询的执行过程&#xff1a; 确定第一个需要查询的表【驱动表】 选取代价最小的访问方法去执行单表查询语句 从驱动表每获取到一条记录&#xff0c;都需要到t2表中查找匹配的记录 两表连接查询需要查询一次t1表&#xff0c;两次t2表&#xff0c;在两表的连接查询中&…

【Drools+springboot3规则匹配】

文章目录 一、 业务场景概述二、整体技术架构三、Drools概述1. Drools 简介2. Drools Rete 算法与flink-cep的区别?2.1 Rete 算法概述2.2 Flink CEP 概述四、代码实现4.1 导入依赖4.2 从kafka消费数据4.3 核心类,触发匹配操作并将匹配数据写入mysql4.4 Drools 管理4.5 相关的…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;几乎维系着整个安卓程序运行的生命周期&#xff0c;但是这么重要的一个东西&#xff0c;我们真的了解它吗&#xff1f;下面跟随着我的脚步&#xff0c;慢慢揭开Hanler的神秘面纱吧&#xff01; 本文将介绍Handler 的运…

读书笔记 -- MySQL架构

1、MySQL逻辑架构 最上层的服务并不是 MySQL所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。 第二层架构是 MySQL 比较有意思的部分。大多数 MySQL 的核心服务功能都在这一层包括查询解析、分析、…

linux 4.14内核jffs2文件系统不自动释放空间的bug

前段时间在做spi-nor flash项目的时候&#xff0c;使用jffs2文件系统&#xff0c;发现在4.14内核下存在无法释放空间的bug&#xff0c;后来进行了修复&#xff0c;修复后功能正常&#xff0c;现将修复patch公开&#xff0c;供后来者学习&#xff1a; diff --git a/fs/jffs2/ac…

vue3+vite 实现.env全局配置

首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖&#xff1a; pnpm install dotenv --save-dev 引入完成后&#xff0c;在vite.config.js配置文件内加入以下内容&#xff1a; const env dotenv.config({ path: ./.env }).parsed define: { // 将…

Oracle 19c部署之手工建库(四)

#Oracle #19c #手工建库 手工创建Oracle数据库&#xff08;也称为手工建库&#xff09;是指在已经安装了Oracle数据库软件的基础上&#xff0c;通过手动执行一系列命令和步骤来创建一个新的数据库实例。这种方法与使用Database Configuration Assistant (DBCA)等工具自动创建数…

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷军一度登顶中国首富&#xff0c;太厉害了&#xff08;2025年03月02日&#xff09; 早盘&#xff0c;小米港股一路高歌猛进&#xff0c;暴涨4%&#xff0c;股价直接飙到52港元的历史新高。这一波猛如虎的操作&#xff0c;直接把雷军的身家拉到了2980亿元&#xff0c…

【Python爬虫基础篇】--1.基础概念

目录 1.爬虫--定义 2.爬虫--组成 3.爬虫--URL 1.爬虫--定义 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展&#xff0c;万维网成为大量信息的载体…

C语言超详细结构体知识

1.自定义类型&#xff1a;结构体的介绍 在之前的博客中&#xff0c;我们简单介绍过了关于结构体的基本知识&#xff0c;这里我们稍微复习一下。 结构体(struct)是C语言中一种重要的复合数据类型&#xff0c;它允许将不同类型的数据组合成一个整体。 1.1结构体的定义 结构体使…

C++学习:六个月从基础到就业——内存管理:new/delete操作符

C学习&#xff1a;六个月从基础到就业——内存管理&#xff1a;new/delete操作符 本文是我C学习之旅系列的第十七篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第二篇&#xff0c;主要介绍C中动态内存管理的核心操作符——new和delete。查看完整系列目录了解更多…

15~30K,3年以上golang开发经验

继续分享最新的面经&#xff0c;前面发的两篇大家也可以看看&#xff1a; 「坐标上海&#xff0c;20K的面试强度」「北京七猫&#xff0c;薪资25~35K&#xff0c;瞧瞧面试强度」 今天分享的是golang开发岗面经&#xff0c;要求是3年以上golang开发经验&#xff0c;薪资为15~3…

Python爬虫实战:获取优志愿专业数据

一、引言 在信息爆炸的当下,数据成为推动各领域发展的关键因素。优志愿网站汇聚了丰富的专业数据,对于教育研究、职业规划等领域具有重要价值。然而,为保护自身数据和资源,许多网站设置了各类反爬机制。因此,如何高效、稳定地从优志愿网站获取计算机专业数据成为一个具有…

ArcPy工具箱制作(下)

在上一篇博客中&#xff0c;我们已经初步了解了如何制作ArcPy工具箱&#xff0c;包括工具箱的基本概念、准备工作、脚本编写以及将脚本转换为工具箱的步骤。今天&#xff0c;我们将继续深入探讨ArcPy工具箱的制作&#xff0c;重点介绍一些进阶技巧和优化方法. 一、优化工具箱的…

不一样的flag 1(迷宫题)

题目 做法 下载压缩包&#xff0c;解压&#xff0c;把解压后的文件拖进Exeinfo PE进行分析 32位&#xff0c;无壳 扔进IDA&#xff08;32位&#xff09;&#xff0c;找到main&#xff0c;F5反编译 没啥关键词&#xff0c;ShiftF12也找不到什么有用的点 从上往下分析吧 puts(…

工程化实践:Flutter项目结构与规范

工程化实践&#xff1a;Flutter项目结构与规范 在Flutter项目开发中&#xff0c;良好的工程化实践对于提高开发效率、保证代码质量和团队协作至关重要。本文将从项目结构、代码规范、CI/CD流程搭建以及包管理等方面&#xff0c;详细介绍Flutter项目的工程化最佳实践。 项目结…

[Java · 初窥门径] Java 语言初识

&#x1f31f; 想系统化学习 Java 编程&#xff1f;看看这个&#xff1a;[编程基础] Java 学习手册 0x01&#xff1a;Java 编程语言简介 Java 是一种高级计算机编程语言&#xff0c;它是由 Sun Microsystems 公司&#xff08;已被 Oracle 公司收购&#xff09;于 1995 年 5 …