MyBatis 动态 SQL 使用指南

embedded/2024/10/10 19:38:15/

MyBatis 是一个流行的持久层框架,它通过 XML 或注解将接口方法与 SQL 映射在一起。动态 SQL 是 MyBatis 的一大特性,它使得构建灵活的查询变得简单。本文将通过一个 User 表的示例,介绍 MyBatis 中常用的动态 SQL 方法。

1. 什么是动态 SQL?

动态 SQL 是指在运行时构建 SQL 语句,可以根据条件生成不同的 SQL 语句。这种方法在处理复杂查询时尤为重要,可以有效避免 SQL 注入和冗余代码。

2. 示例表:用户表

我们以 User 表为例,表结构如下:

java">//Lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {private Long id;            // 用户idprivate String username;    // 用户名private String password;    // 密码private String phone;       // 注册手机号private String info;        // 详细信息private Integer status;     // 使用状态(1正常 2冻结)private Integer balance;     // 账户余额private Date createTime;    // 创建时间private Date updateTime;    // 更新时间
}

3. 常用动态 SQL 方法

3.1 where

使用 where 标签可以自动处理 SQL 条件前的 AND 和 OR。

java"><select id="findByConditions" resultType="com.lps.domain.User">SELECT * FROM user<where><if test="username != null and username != ''">AND USERNAME LIKE CONCAT('%', #{username}, '%')</if><if test="phone != null and phone != ''">AND PHONE LIKE CONCAT('%', #{phone}, '%')</if></where>
</select>

3.2 foreach

foreach 标签用于处理集合,可以生成 IN 查询。

java"><select id="findByIds" resultType="com.lps.domain.User">SELECT * FROM user WHERE id IN<foreach item="id" collection="idList" open="(" separator="," close=")">#{id}</foreach>
</select>

3.3 if

if 标签用于动态决定是否包含某个 SQL 片段。

java"><update id="updateUser">UPDATE user<set><if test="username != null">username = #{username},</if><if test="phone != null">phone = #{phone},</if></set>WHERE id = #{id}
</update>

3.4 choose, when, otherwise

这些标签实现了类似 Java 中 switch 的功能。

java"><select id="findByStatus" resultType="com.lps.domain.User">SELECT * FROM user<where><choose><when test="status == 1">AND status = 1</when><when test="status == 2">AND status = 2</when><otherwise>AND status IS NULL</otherwise></choose></where>
</select>

3.5 trim

trim 标签可以去掉 SQL 语句开头或结尾的特定字符。

java"><select id="findUsersWithTrim" resultType="com.lps.domain.User">SELECT * FROM user<trim prefix="WHERE" prefixOverrides="AND |OR "><if test="username != null">AND username = #{username}</if><if test="phone != null">AND phone = #{phone}</if><if test="status != null">AND status = #{status}</if></trim>
</select>

3.6 bind

bind 标签用于在 SQL 查询中动态绑定变量,通常用于处理 LIKE 查询时拼接通配符。下面是一个通过 bind 实现模糊查询的示例:

java"><select id="selectUserByLike" resultType="com.lps.domain.User"><bind name="username" value="'%' + username + '%'" />SELECT * FROM userWHERE username LIKE #{username}
</select>

在这个示例中,bind 标签将输入的 username 动态地拼接上 % 通配符,以支持模糊查询。在查询时,MyBatis 会自动将参数 username 转换为带通配符的值并替换到 SQL 中,从而实现类似于 SQL 中 LIKE '%xxx%' 的效果(类似于3.1WHERE中用到的的CONCAT方法)

4. 总结

MyBatis 的动态 SQL 特性为开发者提供了强大的灵活性,使得构建复杂查询变得简单。通过合理使用动态 SQL,可以提高代码的可读性和维护性。本文介绍了常见的动态 SQL 标签和用法,包括 whereforeachifchoosetrimbind。 

mybatis官网关于动态sql讲解链接如下:动态 SQL


http://www.ppmy.cn/embedded/119249.html

相关文章

LLM之基于llama-index部署本地embedding与GLM-4模型对rag系统进行测评

前言 有时间在写吧 评估指标 llama-Index 内置了有评估工具&#xff0c;今天教大家如何使用 llama-Index 有以下评估指标&#xff1a; Answer Relevcancy Context Relevancy Relevancy Faithfulness Correctness 感兴趣可以去 llama_index.core.evaluation 文件查看 …

PTA L1-062 幸运彩票

L1-062 幸运彩票&#xff08;15分&#xff09; 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 位上的数之和&#xff0c;则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。 输入格式&#xff1a; 输入在第一行中给出一个正整数 N&a…

【JavaSE系列】IO流

目录 前言 一、IO流概述 二、IO流体系结构 三、File相关的流 1. FileInputStream 2. FileOutputStream 3. FileReader 4. FileWriter 四、缓冲流 五、转换流 1. InputStreamReader 2. OutputStreamWriter 六、数据流 七、对象流 八、打印流 九、标准输入输出流…

NetworkPolicy访问控制

NetworkPolicy是Kubernetes中一种用于控制Pod之间以及Pod与外部网络之间流量的资源对象。它可以帮助你在 IP 地址或端口层面&#xff08;OSI 第 3 层或第 4 层&#xff09;控制网络流量。NetworkPolicy 资源使用标签选择 Pod&#xff0c;并定义选定 Pod 所允许的通信规则。它可…

详细分析Mybatis中的动态Sql(附Demo)

目录 前言1. 基本知识2. 注意事项3. 拓展 前言 以往的Java基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09;Mybatis从入门到精通&#xf…

学生宿舍管理:Spring Boot技术驱动

第2章 开发环境与技术 学生宿舍管理系统的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对学生宿舍管理系统用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xff0c;没…

Linux驱动开发(速记版)--驱动基础

第一章 初识内核源码 Linux系统源码提供了操作系统的核心功能&#xff0c;如进程管理、内存管理、文件系统等。 BusyBox这类的文件系统构建工具&#xff0c;则提供了在这些核心功能之上运行的一系列实用工具和命令&#xff0c;使得用户能够执行常见的文件操作、文本处理、网络配…

TryFastGPT大模型介绍

目录 一、TryFastGPT大模型介绍 1. 开发团队 2. 发展史 3. 基本概念 4. 架构 5. 使用案例 6. 安装步骤 二、TryFastGPT与其他大模型的对比 三、总结 一、TryFastGPT大模型介绍 1. 开发团队 TryFastGPT由TryAI团队开发&#xff0c;该团队由多位在人工智能和自然语言处…