MyBatis的动态SQL

目录

一、什么是动态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.mzph.cn/news/241646.shtml

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

相关文章

服务器IBM x3650 m2 管理口访问故障处理

服务器的内存告警后&#xff0c;连接管理口查看信息&#xff0c;管理口状态灯显示正常&#xff0c;但是无法ping通和访问。 处理过程如下&#xff1a; 1、在centos 6.6中安装ipmitool&#xff0c;替换为阿里云的yum源&#xff0c;然后安装。 # wget -O /etc/yum.repos.d/Cen…

基于Kubernetes的jenkins上线

1、基于helm 部署jenkins 要求&#xff1a;当前集群配置了storageClass&#xff0c;并已指定默认的storageClass&#xff0c;一般情况下&#xff0c;创建的storageClass即为默认类 指定默认storageClass的方式 # 如果是新创建默认类&#xff1a; apiVersion: storage.k8s.io/v1…

用SQL语句创建数据库表的注意事项

1.所有的符号都要在英文状态下使用。 2.表的名称和字段尽量使用括起来。 3.AUTO_INCREMENT(自增) 4.字符串使用单引号 括起来 5.所有的语句后面加 , (英文的)&#xff0c;最后一个不用加。 6.PRIMARY KEY() 主键&#xff0c;一般一个表只有一个唯一 的主键&#xff01; …

Python遥感图像处理指南(6)-绘制散点图和输出PDF报告

今天我们来学习一些其他技能,在写论文时通常需要将结果图表进行整理,拼接图片很不方便,我们可以借助Pyhton将处理的图片和图标整合到PDF中输出,提高生产效率。 1、环境安装 安装PyPDF2 包 pip install PyPDF2 2、创建PDF 我们将改造之前写的load_landsat_image 方法,来…

Jenkins自动化部署之后端

准备工作参考本人另外几篇Jenkins相关的文章 新建任务 添加参数配置 字符串参数&#xff1a;分支名称 多选框&#xff1a;项目名称&#xff08;Extended Choice Parameter插件必备&#xff0c;插件安装参考我另外的文章&#xff09; 这个分割规则自定义。只要根据Jenkins…

【投稿】北海 - Rust与面向对象(二)

模板方法 Rust提供了trait&#xff0c;类似于面向对象的接口&#xff0c;不同的是&#xff0c;将传统面向对象的虚函数表从对象中分离出来&#xff0c;trait仍然是一个函数表&#xff0c;只不过是独立的&#xff0c;它的参数self指针可以指向任何实现了该trait的结构。 从对象中…

Go自定义PriorityQueue优先队列使用Heap堆

题目 分析 每次找最大的&#xff0c;pop出来 然后折半&#xff0c;再丢进去 go写法 go如果想用heap&#xff0c;要实现less\len\swap\push\pop 但可以偷懒&#xff0c;用sort.IntSlice,已经实现了less\len\swap 但由于目前是大根堆&#xff0c;要重写一下less 因此&#xff…

Maven依赖传递和依赖冲突

1 依赖传递 1.1 什么是依赖传递 现有Maven项目A、B、C&#xff0c;如果项目B依赖项目A&#xff0c;项目C依赖项目B&#xff0c;则可以认为项目C依赖项目A。这就是项目依赖的传递性。 此时项目C中会存在项目A和项目B中的所有依赖。 依赖传递的作用 简化依赖导入检测依赖版本…

懒加载图片案例

整体效果&#xff1a; HTML部分&#xff1a; <div class"lazy-box"><img class"lazy" data-original"img/1.jpg" alt"1.jpg" width"960" height"540"><img class"lazy" data-original…

用大白话举例子讲明白云计算

前几天王坚院士在2023云栖大会上发表了关于云计算的演讲&#xff0c;听得我是热血沸腾&#xff0c;王院士称AI和云计算的结合是“云计算的第三次浪潮”&#xff0c;对此我深表认同。但是身边的很多朋友还不知道云计算是什么意思&#xff0c;有些人还认为百度云和百度云盘是一个…

【RabbitMQ】RabbitMQ详解(二)

RabbitMQ详解 死信队列死信来源消息TTL过期队列达到最大长度消息被拒绝 RabbitMQ延迟队列TTL的两种设置队列设置TTL消息设置TTL 整合SrpingBoot队列TTL延时队列TTL优化Rabbtimq插件实现延迟队列 死信队列 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就…

测试:YAML OpenAPI(Swagger)

YAML YAML&#xff08;Yet Another Markup Language&#xff09;是一种数据序列化格式&#xff0c;通常被用来配置文件。它易于阅读&#xff0c;并且以数据结构为中心。YAML文件通常以.yaml或.yml为扩展名。 下面是一个YAML文件的简单示例&#xff1a;定义了一个人的基本信息…

Linux---基础操作命令

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

GO语言基础笔记(三):复合类型

深入学习Go语言中的复合类型&#xff1a;数组、切片、映射&#xff08;Map&#xff09;和结构体。这些类型是构建复杂数据结构和实现复杂逻辑的基础。 目录 1. 数组&#xff08;Array&#xff09; 遍历数组 多维数组 数组作为函数参数 2. 切片&#xff08;Slice&#xff…

单片机的RTC获取网络时间

理解网络同步校准RTC的原理需要考虑NTP、SNTP、RTC这三个关键组件的作用和交互。下面详细解释这个过程&#xff1a; 1. NTP&#xff08;Network Time Protocol&#xff09;&#xff1a; 协议目的&#xff1a;NTP是用于同步计算机和设备时钟的协议。它通过在网络上与时间服务器通…

Java中Collections详解

Java中Collections详解 在Java中&#xff0c;java.util.Collections 是一个实用类&#xff0c;提供了各种静态方法&#xff0c;用于对集合进行操作和控制。这个类包含了许多有用的方法&#xff0c;用于对集合进行排序、查找、替换等操作。以下是一些 Collections 类中常用方法…

JUC AQS ReentrantLock源码分析

AQS java.util.concurrent.locks.AbstractQueuedSynchronizer AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及…

前端性能优化十八:减少浏览器的回流和重绘

1. css: ①. 避免过多样式嵌套:a. 尽量让浏览器一次性找到样式.②. 避免使用css表达式:a. 在每次css绘制的过程中都是会执行.③. 使用绝对定位可以让动画元素脱离文档流:a. 给动画元素做单独定位④. 避免使用table布局:a. 会引起浏览器多次重绘⑤. 尽量不适用float布局:a. 可以…

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节…

Golang make vs new

文章目录 1.简介2.区别3.new 可以初始化 slice&#xff0c;map 和 channel 吗&#xff1f;4.make 可以初始化其他类型吗&#xff1f;5.小结参考文献 1.简介 在 Go 语言中&#xff0c;make 和 new 是两个用于创建对象的内建函数&#xff0c;但它们有着不同的用途和适用范围。 …