当前位置: 首页 > news >正文

MyBatis 动态 SQL 使用指南

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

1. 什么是动态 SQL?

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

2. 示例表:用户表

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

//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。

<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 查询。

<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 片段。

<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 的功能。

<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 语句开头或结尾的特定字符。

<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 实现模糊查询的示例:

<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

相关文章:

  • react 常用hooks封装--useReactive
  • 【Y004】基于springboot+vue实现的图书管理系统
  • 利用 Page Visibility API 优化网页性能与用户体验
  • babylon.js-1:入门篇
  • 活体检测标签之2.4G有源RFID--SI24R2F+
  • 计算机毕业设计 基于Python的音乐平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • SQL学习1
  • 通过fdisk初始化Linux数据盘
  • Xcode16适配
  • 机器学习(1):机器学习的概念
  • android 系统默认apn数据库
  • Vue 3 魔法揭秘:CSS 解析与 scoped 背后的奇幻之旅
  • 长沙某公司.Net高级开发面试题
  • 实战C++手写线程池
  • 【自用软件】IDM下载器 Internet Download Manager v6.42 Build 10
  • [case10]使用RSQL实现端到端的动态查询
  • 【React系列】如何构建React应用程序
  • 【剑指offer】让抽象问题具体化
  • github指令
  • JS变量作用域
  • react 代码优化(一) ——事件处理
  • ubuntu 下nginx安装 并支持https协议
  • vue.js框架原理浅析
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 七牛云假注销小指南
  • 前端路由实现-history
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 双管齐下,VMware的容器新战略
  • 小程序测试方案初探
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 学习Vue.js的五个小例子
  • ‌Excel VBA进行间比法设计
  • # Java NIO(一)FileChannel
  • # 达梦数据库知识点
  • (1)Hilt的基本概念和使用
  • (1)svelte 教程:hello world
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三)c52学习之旅-点亮LED灯
  • (四)JPA - JQPL 实现增删改查
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)德国人的记事本
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .apk文件,IIS不支持下载解决
  • .bat批处理(六):替换字符串中匹配的子串
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net 验证控件和javaScript的冲突问题
  • .Net 执行Linux下多行shell命令方法
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。