【Mybatis】动态SQL详解

devtools/2024/11/27 21:52:19/

文章目录

    • 动态SQL
      • if+set
      • if+where
      • if+trim
      • foreach
      • choose
      • sql

动态SQL

<if> 用于条件判断,决定是否包含某个SQL片段。

if+set

<set> 用于动态生成 SET 子句,自动处理多余的逗号。

<!-- 更新用户信息 -->
<update id="edit" >UPDATE smbms_user<set><if test="userCode != null">userCode = #{userCode},</if><if test="userName != null">userName = #{userName},</if><if test="gender != null">gender = #{gender},</if><if test="birthday != null">birthday = #{birthday},</if><if test="address != null">address = #{address}</if></set>WHERE id = #{id}
</update>

if+where

<where> 用于动态生成 WHERE 子句,自动处理多余的ANDOR关键字。

<!-- 多条件分页查询 -->
<select id="findAll" resultType="User">select id,userCode,userName,gender,birthday,address,creationDatefrom smbms_user<where><if test="userName != null and userName != ''">and userName like concat('%', #{userName}, '%')</if><if test="address != null and address != ''">and address like concat('%', #{address}, '%')</if><if test="beginDate != null and beginDate != ''">and creationDate &gt;= #{beginDate}</if><if test="endDate != null and endDate != ''">and creationDate &lt;= #{endDate}</if></where>order by creationDate desclimit #{offset}, #{pageSize}
</select>

if+trim

<trim> 用于控制 SQL 片段的前缀和后缀,以及移除多余的字符。

  • prefix:前缀,添加到生成的SQL片段前面的字符串。
  • suffix:后缀,添加到生成的SQL片段后面的字符串。
  • prefixOverrides:对 trim 包含内部的首部进行指定内容的忽略
  • suffixOverrides:对 trim 包含内部的尾部进行指定内容的忽略
<trim prefix="where" prefixOverrides="and|or"></trim>

动态生成WHERE子句,确保生成的SQL语句中WHERE关键字后面没有多余的ANDOR关键字。

<trim prefix="set" suffixOverrides="," suffix="where id=#{id}"><if test="uname != null">uname=#{uname},</if><if test="upwd != null">upwd=#{upwd},</if>
</trim>

动态生成SET子句,并确保生成的SQL语句中SET关键字后面没有多余的逗号,并且在最后加上WHERE子句。

<!-- 添加用户 -->
<insert id="save">INSERT INTO smbms_user (userCode,userName,<trim suffixOverrides=","><if test="gender != null">gender,</if><if test="birthday != null">birthday,</if><if test="address != null">address,</if></trim>)VALUES (#{userCode},#{userName},<trim suffixOverrides=","><if test="gender != null">#{gender},</if><if test="birthday != null">#{birthday},</if><if test="address != null">#{address}</if></trim>)
</insert>

或者

INSERT INTO smbms_user
<trim prefix="(" suffix=")" suffixOverrides=","><if test="userCode != null">userCode,</if><if test="userName != null">userName,</if><if test="gender != null">gender,</if><if test="birthday != null">birthday,</if><if test="address != null">address,</if>
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=","><if test="userCode != null">#{userCode},</if><if test="userName != null">#{userName},</if><if test="gender != null">#{gender},</if><if test="birthday != null">#{birthday},</if><if test="address != null">#{address}</if>
</trim>

第一段代码适用于某些字段(如 userCodeuserName)总是必须提供的情况,固定字段和动态字段分开处理。

第一段代码适用于所有字段都可以为空的情况,所有字段都动态处理。

foreach

循环遍历集合参数

  • collection:接收的集合参数
  • open/close:以何打开/关闭
  • separator:间隔符号
  • item:单个变量名
/*** 批量删除* @param ids id列表* @return 受影响行数*/
int deleteByList(List<Integer> ids);
<!-- 删除多个用户 -->
<delete id="deleteByList" >DELETE FROM smbms_user WHERE id in<foreach collection="list"  open="("  separator=","  close=")"  item="id">#{id}</foreach>
</delete>

collection 除了传递 list 还可以传递 array、map

/*** 多查询 根据用户ID查询地址* @param ids id列表* @return 地址列表*/
List<Address> findAddressArray(Integer[] uids);List<Address> findAddressMap(Map<String,Object> map);
<select id="findAddressArray" resultType="Address">SELECT id,contact,addressDesc,postCode FROM smbms_address WHERE userId in<foreach collection="array"  open="("  separator=","  close=")"  item="uid">#{uid}</foreach>
</select>
<select id="findAddressMap" resultType="Address">SELECT id,contact,addressDesc,postCode FROM smbms_address WHERE userId in<foreach collection="uids"  open="("  separator=","  close=")"  item="uid">#{uid}</foreach>and addressDesc like concat('%', #{addressDesc}, '%')
</select>
public void findAddressArray(){addressDao.findAddressArray(new Integer[]{1,2});
}
public void findAddressMap(){Map<String,Object> map = new Map<String,Object>();map.put("addrDesc","西城区");map.put("uids",Arrays.asList(1,2,3));addressDao.findAddressArray(map);
}

choose

<select id="findActiveBlogLike" resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose>
</select>

sql_227">sql

使用<sql>标签定义一个可重用的SQL片段。

<sql id="query_user_where"><where><if test="userName != null and userName != ''">and userName like concat('%', #{userName}, '%')</if><if test="address != null and address != ''">and address like concat('%', #{address}, '%')</if><if test="beginDate != null and beginDate != ''">and creationDate &gt;= #{beginDate}</if><if test="endDate != null and endDate != ''">and creationDate &lt;= #{endDate}</if></where>
</sql>

在查询中使用<include>标签引入定义的SQL片段。

<!-- 分页查询 -->
<select id="findAll" resultType="User">select id,userCode,userName,gender,birthday,address,creationDatefrom smbms_user<include refid="query_user_where"/>order by creationDate desclimit #{offset}, #{pageSize}
</select><!-- 查询列表总数 -->
<select id="findListCount" resultType="int">select count(1) as countfrom smbms_user<include refid="query_user_where"/>
</select>

http://www.ppmy.cn/devtools/137491.html

相关文章

自定义 RouterLink 组件 v-slot custom

高级自定义&#xff1a;通过 v-slot 使用插槽 API 如果你需要更复杂的自定义逻辑或更加灵活的渲染&#xff0c;可以结合 v-slot 来实现&#xff1a; <template><router-link :to"to" custom v-slot"{ navigate }"><div click"navigat…

【git】取消一个已提交的文件或路径的追踪

在 Git 中&#xff0c;如果想取消对一个已提交的文件或路径的追踪&#xff0c;有几种方法可以实现这一点&#xff0c;具体取决于实际场景。以下是几种常见的方法&#xff1a; 1. 从索引中移除文件&#xff08;暂存区&#xff09; 如果只是希望取消对某个文件的追踪&#xff0…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

VirtIO实现原理之数据结构与数据传输演示(2)

接前一篇文章:VirtIO实现原理之数据结构与数据传输演示(1) 本文内容参考: VirtIO实现原理——vring数据结构-CSDN博客 VirtIO实现原理——数据传输演示-CSDN博客 特此致谢! 一、数据结构总览 2. 相关数据结构 上一回读了《Virtual I/O Device (VIRTIO) Version 1.3》…

Cesium教程03_加载b3dm高度

使用 Vue3 和 Cesium 构建三维地球场景并实现高度调整功能 引言 在现代 Web GIS&#xff08;地理信息系统&#xff09;开发中&#xff0c;Cesium 是一款功能强大的三维地球可视化工具。本文展示了如何使用 Vue3 与 Cesium 集成&#xff0c;实现一个支持调整高度功能的三维地球…

OSPF路由状态数据库、type 类型、完整的LSA

【OSPF】 1.Lsdb&#xff1a;链路状态数据库【存放多条LSA——链路状态通告信息】 2..Dis ospf lsdb : 查看设备LSDB. 3.Ospf process__ with router ID __ &#xff1a; ospf的进程为___router_id为 ____. 4.Lsdb&#xff1a;链路状态数据库【存放多条…

R和Julia免疫细胞映射到组织切片

将免疫细胞映射到组织切片是一种整合多种技术的高精度方法&#xff0c;用于揭示细胞在组织微环境中的空间分布。通过使用如空间转录组学、免疫荧光染色或单细胞RNA测序等技术&#xff0c;科学家可以精确定位特定免疫细胞类型&#xff0c;并分析它们与组织结构或病理学变化的关联…

【MCU】微控制器的编程技术:ISP 与 IAP

在嵌入式领域中&#xff0c;将程序下载到内置 Flash 有两种技术 ISP (In-system programming) ISP 即在系统编程&#xff0c;是指一些可编程逻辑器件、微控制器、芯片组和其他嵌入式设备在安装到完整嵌入式系统后能够进行编程&#xff0c;而不需要在将芯片安装到系统中之前对…