Java中MyBatis的动态语句详解

 更新时间:2023年08月02日 10:23:58   作者:码匠_CodeArtist  
这篇文章主要介绍了Java中MyBatis的动态语句详解,动态 SQL 是 MyBatis 的强大特性之一,通过不同参数生成不同的 SQL,可以动态地对数据持久层进行操作,而不需要每个数据访问操作都要进行手动地拼接 SQL 语句,需要的朋友可以参考下

一、 概述

动态 SQL 是 MyBatis 的强大特性之一,通过不同参数生成不同的 SQL,可以动态地对数据持久层进行操作,而不需要每个数据访问操作都要进行手动地拼接 SQL 语句。

二、动态语句

1. if

<if> 语句可以根据条件指定 SQL 部分,例如 where 条件。

查询数据接口如下:

public interface UserSqlMapper {
    List<User> selectByUsername(@Param("username") String username, @Param("status") Integer status);
}

对应映射语句如下:

<select id="selectByUsername" resultType="User">
    SELECT * FROM t_user WHERE 1 = 1
    <if test="status != null">
        AND status = #{status}
    </if>
    <if test="username != null and username != ''">
        AND username = #{username}
    </if>
</select>

上面语句当 status 不为 null 时,以及 username 不为空字符串时,对应的查询条件才会生效。

2. choose、when、otherwise

<choose> 语句类似于 Java 的 switch 语句,可以从多个条件中选择一个使用。

<select id="selectByUsername" resultType="User">
    SELECT * FROM t_user WHERE 1 = 1
    <choose>
        <when test="status != null">
            AND status = #{status}
        </when>
        <otherwise>
            AND username = #{username}
        </otherwise>
    </choose>
</select>

上面语句根据 status 是否为 null 而执行不同的查询条件,每次查询只存在一个查询条件。

3. trim、where、set

在前面的例子中,where 后面都会加上 1=1 这个条件,为了解决当所有条件都没生效时,where 条件为空而产生异常的问题。

在更新语句 set 后面也会出现同样的问题,可以使用 <trim> 语句通过指定前缀和后缀的方式来解决。

MyBatis 也提供更简单的 <where> 语句和 <set> 语句来解决这个问题。

例如下面两个接口:

public interface UserSqlMapper {
    List<User> selectByUsername(@Param("username") String username, @Param("status") Integer status);
    void updateById(User user);
}

对应的 <trim> 映射 where 语句如下:

<select id="selectByUsername" resultType="User">
    SELECT * FROM t_user
    <trim prefix="WHERE" prefixOverrides="AND|OR">
        <if test="status != null">
            AND status = #{status}
        </if>
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
    </trim>
</select>

对应的 <where> 映射语句如下:

<select id="selectByUsername" resultType="User">
    SELECT * FROM t_user
    <where>
        <if test="status != null">
            AND status = #{status}
        </if>
        <if test="username != null and username != ''">
            AND username = #{username}
        </if>
    </where>
</select>

对应的 <trim> 映射 update 语句如下:

<update id="updateById">
    UPDATE t_user
    <trim prefix="SET" suffixOverrides=",">
        <if test="status != null">
            status = #{status},
        </if>
        <if test="username != null and username != ''">
            username = #{username},
        </if>
    </trim>
</update>

对应的 <set> 映射语句如下:

<update id="updateById">
    UPDATE t_user
    <set>
        <if test="status != null">
            status = #{status},
        </if>
        <if test="username != null and username != ''">
            username = #{username},
        </if>
    </set>
</update>

4. foreach

<foreach> 可以对集合进行遍历,例如使用 IN 条件语句的时候。

查询数据接口如下:

public interface UserSqlMapper {
    List<User> selectInIdList(@Param("idList") List<Long> idList);
}

对应映射语句如下:

<select id="selectInIdList" resultType="User">
    SELECT * FROM t_user
    <where>
        <foreach item="item" index="index" collection="idList" open="id IN (" separator="," close=")" nullable="true">
            #{item}
        </foreach>
    </where>
</select>

item 指定元素,index 指定索引。

5. script

<script> 可以在接口上的注解中使用动态SQL。

例如查询数据接口如下:

public interface UserSqlMapper {
    @Select("<script>" +
            "SELECT * FROM t_user" +
            "<where>" +
            "   <if test='status != null'>AND status = #{status}</if>" +
            "   <if test='username != null'>AND username = #{username}</if>" +
            "</where>" +
            "</script>")
    List<User> selectByUser(User user);
}

<script> 标签里面的内容和在 XML 文件中的动态 SQL 语法一致。

到此这篇关于Java中MyBatis的动态语句详解的文章就介绍到这了,更多相关MyBatis的动态语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解java内存分配和回收策略

    深入了解java内存分配和回收策略

    下面小编就为大家带来一篇深入了解java内存分配和回收策略。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring中@RabbitHandler和@RabbitListener的区别详析

    Spring中@RabbitHandler和@RabbitListener的区别详析

    @RabbitHandler是用于处理消息的方法注解,它与@RabbitListener注解一起使用,这篇文章主要给大家介绍了关于Spring中@RabbitHandler和@RabbitListener区别的相关资料,需要的朋友可以参考下
    2024-02-02
  • Maven高级的聚合和继承的实现

    Maven高级的聚合和继承的实现

    在软件开发中,随着项目规模的扩大,单个模块的开发方式逐渐转变为多模块开发,这种方式带来了项目管理上的挑战,其中最常见的问题是模块间的依赖管理和版本控制问题,本文就来介绍一下
    2024-10-10
  • InputStream数据结构示例解析

    InputStream数据结构示例解析

    这篇文章主要为大家介绍了InputStream数据结构示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • springboot 启动如何修改application.properties的参数

    springboot 启动如何修改application.properties的参数

    这篇文章主要介绍了springboot 启动如何修改application.properties的参数方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 浅谈HttpClient、okhttp和RestTemplate的区别

    浅谈HttpClient、okhttp和RestTemplate的区别

    这篇文章主要介绍了HttpClient、okhttp和RestTemplate的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法

    SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法

    本文主要介绍了SpringBoot项目改为SpringCloud项目使用nacos作为注册中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java中字符数组、String类、StringBuffer三者之间相互转换

    Java中字符数组、String类、StringBuffer三者之间相互转换

    这篇文章主要介绍了Java中字符数组、String类、StringBuffer三者之间相互转换,需要的朋友可以参考下
    2018-05-05
  • Java实现输出数字三角形实例代码

    Java实现输出数字三角形实例代码

    大家好,本篇文章主要讲的是Java实现输出三角形实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • SpringBoot项目离线环境手动构建的过程

    SpringBoot项目离线环境手动构建的过程

    文章介绍了如何在IntelliJ IDEA中手动创建一个Spring Boot项目,并详细讲解了pom.xml文件的配置和基本项目结构的设置,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论