MyBatis中动态SQL的使用指南

 更新时间:2024年09月26日 09:49:08   作者:不掉头发的阿水  
MyBatis 是一个流行的持久层框架,它通过 XML 或注解将接口方法与 SQL 映射在一起,动态 SQL 是 MyBatis 的一大特性,它使得构建灵活的查询变得简单,本文将通过一个 User 表的示例,介绍 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;            // 用户id
    private 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 user
    WHERE username LIKE #{username}
</select>

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

4. 总结

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

以上就是MyBatis中动态SQL的使用指南的详细内容,更多关于MyBatis动态SQL使用的资料请关注脚本之家其它相关文章!

相关文章

  • Java的线程阻塞、中断及优雅退出方法详解

    Java的线程阻塞、中断及优雅退出方法详解

    这篇文章主要介绍了Java的线程阻塞、中断及优雅退出方法详解,Java中的线程阻塞是指当一个线程无法继续执行时,它会进入阻塞状态,直到某个条件满足后才能继续执行,线程阻塞可以通过多种方式实现,需要的朋友可以参考下
    2023-10-10
  • Spring Data JPA 在 @Query 中使用投影的方法示例详解

    Spring Data JPA 在 @Query 中使用投影的方法示例详解

    这篇文章主要介绍了Spring Data JPA 在 @Query 中使用投影的方法,大家需要注意如果要在 @Query 中使用投影,必须要主动声明要查询的字段,并且主动写明字段的别名才行,本文通过sql代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-07-07
  • SpringBoot最简洁的国际化配置

    SpringBoot最简洁的国际化配置

    这篇文章主要介绍了SpringBoot最简洁的国际化配置,Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架,国际化是一个重要的功能,它允许应用程序根据用户的语言和地区显示不同的内容,在Spring Boot中,实现国际化非常简单,需要的朋友可以参考下
    2023-10-10
  • JAVA Comparator 和 Comparable接口使用方法

    JAVA Comparator 和 Comparable接口使用方法

    本文介绍了Java中Comparable和Comparator接口的使用,包括它们的定义、方法和应用场景,Comparable用于定义类的自然排序规则,而Comparator提供了一种灵活的方式来定义对象之间的排序规则,无需修改类本身,感兴趣的朋友一起看看吧
    2025-03-03
  • SpringMVC中@RequestMapping注解用法实例

    SpringMVC中@RequestMapping注解用法实例

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 关于Javaweb的转发和重定向详解

    关于Javaweb的转发和重定向详解

    这篇文章主要介绍了关于Javaweb的转发和重定向详解,请求的转发,是指服务器收到请求后,从一个服务器端资源跳转到同一个服务器端另外一个资源的操作,需要的朋友可以参考下
    2023-05-05
  • 详解MyBatis的Dao层实现和配置文件深入

    详解MyBatis的Dao层实现和配置文件深入

    这篇文章主要为大家详细介绍了MyBatis的Dao层实现和配置文件深入,文中的示例代码讲解详细,感兴趣的小伙伴快来跟随小编一起学习一下
    2022-07-07
  • Linux系统中检查Java版本的三种高效方法

    Linux系统中检查Java版本的三种高效方法

    本文介绍了在Linux系统中检查Java版本的三种高效方法,并探讨了Java版本的重要性及其检查原因,通过了解Java版本格式和不同方法,用户可以确保应用的兼容性、性能和安全性,需要的朋友可以参考下
    2025-12-12
  • MyBatis Plus复合主键问题的解决

    MyBatis Plus复合主键问题的解决

    在数据库设计中,有时候需要使用复合主键来唯一标识表中的一行数据,本文将为您详细介绍MyBatis Plus中复合主键的问题以及解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • JavaGUI事件监听机制超详细讲解

    JavaGUI事件监听机制超详细讲解

    Java事件监听器是由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类。JAVA中监听接口是继承java.util.EventListener的类,事件类继承java.util.EventObject的类
    2023-03-03

最新评论