MyBatis的动态SQL

news/2024/10/17 14:29:09/

目录

一、什么是动态SQL?

二、MyBatis标签

1、if标签

2、where标签

3、set标签

4、trim标签

5、foreach标签

6、sql标签

7、bind标签

8、choose标签

9、include标签


一、什么是动态SQL?

动态SQL是一种在运行时动态生成和执行SQL查询语句的技术。它允许根据不同条件、变量或情景来构建SQL查询,以达到SQL复用、简化编程的效果。。也就是根据具体的参数条件,来对SQL语句进行动态拼接。

二、MyBatis标签

1、if标签

在 MyBatis 中,<if> 标签是用于动态生成 SQL 查询条件的元素之一。它允许根据条件来包含或排除 SQL 片段。这个标签通常嵌套在其他 MyBatis SQL 标签内部(例如 <select>, <update>, <delete>, <insert> 等),用于根据特定条件动态添加 SQL 查询语句。

<!-- 示例 --><select id="findByUser" resultType="User">select * from user where 1=1<if test="username!=null and username != ''">and username=#{username}</if><if test="birthday!=null">and birthday=#{birthday}</if><if test="sex!=null and sex != ''">and sex=#{sex}</if><if test="address!=null and address != ''">and address=#{address}</if></select><!--
当满足某个test条件时,才会将那个<if>标签内的SQL语句拼接上去。
都不满足时,查询语句为  select * from user 
-->
2、where标签

在 MyBatis 中,并没有直接的 <where> 标签。然而,可以使用 <where> 元素作为一个 SQL 片段的容器,以便在动态生成 SQL 语句时更灵活地处理 WHERE 子句的条件。

使用 <where> 元素,可以避免在动态 SQL 构建过程中处理多余的 ANDOR 关键字,因为它会自动处理条件之间的逻辑连接。

  <select id="selectUser" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">SELECT * FROM user<!--where标签一定要包括if标签,作用:去掉第一个and--><where><if test="id != null">AND id=#{id}</if><if test="username!=null and username!=''">AND username=#{username}</if><if test="birthday!=null">and birthday=#{birthday}</if><if test="sex!=null and sex != ''">and sex=#{sex}</if><if test="address!=null and address != ''">and address=#{address}</if></where>
3、set标签

在 MyBatis 中,<set> 标签通常用于动态生成 UPDATE 语句中的 SET 子句。它类似于 <where> 标签,用于在动态 SQL 构建过程中处理 SET 子句中的字段更新。

set标签将if标签代码块包起来,并去掉最后一个“,”

<update id="updateUserById" parameterType="com.by.pojo.User">UPDATE user<!--set标签一定要包括if标签,作用:去掉最后一个“,”--><set><if test="username!=null and username!=''">username=#{username},</if><if test="birthday!=null">birthday=#{birthday},</if><if test="sex!=null and sex != ''">sex=#{sex},</if><if test="address!=null and address != ''">address=#{address},</if></set>WHERE id=#{id}</update>
4、trim标签

<trim> 标签是 MyBatis 中用于处理动态 SQL 的标签之一,它可以帮助在 SQL 语句中处理不同部分的前缀、后缀或者其他文本,通常用于处理逗号、AND、OR等连接词。

<trim> 标签可以用于去除不必要的文本,并自动处理文本之间的逻辑连接,比如在动态生成的 SQL 中去除多余的逗号或者添加合适的连接词。

 <insert id="addUser" parameterType="com.by.pojo.User">INSERT INTO user<!--set标签一定要包括if标签,作用:prefix:加上前缀,“(”suffix:加上后缀,“)”prefixOverrides:去除多余的前缀内容suffixOverrides:去除多余的后缀内容,“,”--><trim prefix="(" suffix=")" suffixOverrides=","><if test="username!=null and username!=''">username,</if><if test="birthday!=null">birthday,</if><if test="sex!=null and username != '' ">sex,</if><if test="address!=null and username != '' ">address,</if></trim>
5、foreach标签

<foreach> 标签是 MyBatis 中用于在 SQL 查询中进行遍历操作的标签,通常用于构建 IN 子句或者批量插入/更新等操作。

它允许你遍历集合并将集合中的元素应用到 SQL 查询语句中的特定部分。

 <delete id="deleteUserByIds" parameterType="list">DELETE FROM user WHERE id in<!--collection:取值list、array、@Param("keyName")item="id":循环每次取出的具体对象open="(" :加上前缀close=")" :加上后缀separator=",":分隔符--><foreach collection="idArr" item="id" open="(" close=")" separator=",">#{id}</foreach></delete>
 6、sql标签

<sql> 标签是 MyBatis 中用于定义可重用 SQL 片段的标签。它允许你在一个地方定义一个 SQL 片段,并在需要的地方引用它,以避免重复编写相同的 SQL 代码。

 <select id="getUser" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">SELECT * FROM user<where><!--refid="get_user_where":sql标签的id--><include refid="get_user_where"></include></where></select>
7、bind标签

<bind> 标签是 MyBatis 中用于将表达式结果赋给变量的标签。它可以在 SQL 语句中创建变量并将其赋值,这些变量可以在查询中被重复使用,提高了 SQL 查询语句的灵活性和可读性。

<select id="getUserByAgeRange" parameterType="map" resultType="User"><bind name="minAge" value="'18'" /><bind name="maxAge" value="'40'" />SELECT * FROM usersWHERE age BETWEEN #{minAge} AND #{maxAge}
</select>
8、choose标签

<choose> 标签在 MyBatis 中用于构建条件选择语句,类似于 Java 中的 switch 语句。它允许在多个条件中选择一个满足条件的分支,并执行该分支下的 SQL 查询。

通常情况下,<choose> 标签与 <when><otherwise> 标签一起使用。<when> 标签用于定义条件分支,而 <otherwise> 标签用于定义默认分支(类似于 switch 语句中的 default)。

<select id="getUserStatus" parameterType="map" resultType="User"><choose><when test="status == 'active'">SELECT * FROM users WHERE status = 'active'</when><when test="status == 'inactive'">SELECT * FROM users WHERE status = 'inactive'</when><otherwise>SELECT * FROM users</otherwise></choose>
</select>
9、include标签

<include> 标签在 MyBatis 中用于包含外部定义的 SQL 片段或动态 SQL 片段。它能够在 SQL 查询中引用已定义的 SQL 片段,实现 SQL 代码的重用和模块化。

假设有一个 SQL 片段定义如下:

<sql id="userColumns">id, username, email
</sql>

你可以在查询语句中使用 <include> 标签引用这个 SQL 片段:

<select id="getUsers" parameterType="map" resultType="User">SELECT<include refid="userColumns"/>FROM users
</select>


http://www.ppmy.cn/news/1283261.html

相关文章

力扣:135. 分发糖果(贪心)

题目&#xff1a; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计…

C语言中函数调用和嵌套

函数是C语言的基本组成元素 函数调用 根据函数在程序中出现的位置有下列三种函数调用方式&#xff1a; 将函数作为表达式调用 将函数作为表达式调用时&#xff0c;函数的返回值参与表达式的运算&#xff0c;此时要求函数必须有返回值 int retmax(100,150); 将函数作为语句…

2023安洵杯-秦岭防御军wp

reverse 感觉有点点简单## import base64 def ba64_decode(str1_1):mapp "4KBbSzwWClkZ2gsr1qAQu0FtxOm6/iVcJHPY9GNp7EaRoDf8UvIjnL5MydTX3eh"data_1 [0] * 4flag_1 [0] * 3for i in range(32, 127):for y in range(32, 127):for k in range(32, 127):flag_1[0]…

【数据结构】顺序表与单链表的增删查改

文章目录 前言顺序表增删查改顺序表的定义与初始化增删查改操作测试代码完整代码 单链表的增删查改数据结构定义动态申请节点单链表的尾插和头插单链表的尾删和头删单链表的查找单链表的插入和删除销毁链表测试代码完整代码 总结 前言 在计算机编程领域&#xff0c;数据结构是…

JVM钩子

JVM钩子 简介 在Java应用程序中&#xff0c;可以通过注册关闭钩子&#xff08;Shutdown Hook&#xff09;函数来实现在JVM关闭时执行特定的代码。关闭钩子是一种用于在JVM关闭时执行清理任务的机制&#xff0c;它允许开发者在JVM关闭之前执行一些必要的清理工作&#xff0c;如…

张江智荟毁约offer

毕业8年后&#xff0c;找工作被国企歧视学历&#xff01;已经收到了offer&#xff0c;在入职前一周被通知要撤回offer&#xff0c;拒绝录用&#xff0c;理由居然是他们只要本科211以上的人 这是我今天&#xff08;2023-12-26&#xff09;亲身经历的事&#xff0c;听说过面试前…

uniapp Vue3 面包屑导航 带动态样式

上干货 <template><view class"bei"><view class"container"><view class"indicator"></view><!-- 遍历路由列表 --><view v-for"(item, index) in routes" :key"index" :class&quo…

Kafka、RocketMQ、RabbitMQ消息丢失可能存在的地方,以及解决方案

这里主要对比&#xff1a;Kafka、RocketMQ、RabbitMQ 介绍一下消息生产、存储、消费三者的架构形式。 消息丢失可能存在的场景&#xff1a; 情况一&#xff1a; 生产者发送给MQ的过程消息丢失 在写消息的过程中因为网络的原因&#xff0c;还没到mq消息就丢失了&#xff1b;或…