MyBatis实现动态SQL的方法

 更新时间:2024年06月20日 10:31:45   作者:花落随风轻飘舞  
动态SQL是MyBatis强大特性之一,极大的简化我们拼装SQL的操作,本文主要介绍了MyBatis实现动态SQL的方法,具有一定的参考价值,感兴趣的可以了解一下

1 动态 SQL 介绍

动态 SQL 是 MyBatis 强大特性之一,极大的简化我们拼装 SQL 的操作。MyBatis 的动态 SQL 是基于 OGNL 的( Object Graph Navigation Language ,对象图导航语言),它是一种强大的表达式语言,通过它可以非常方便的来操作对象属性, 类似于 EL,SpEL 等的表达式。动态 SQL 主要有以下几类:

  • if 标签用于条件判断,根据条件是否满足来决定是否包含某个元素。
  • where 标签用于生成 WHERE 子句,并会自动去掉(忽略)第一个条件的 and 或 or 关键字,避免语法错误
  • set 标签:用于生成 SET 子句,进行更新操作,可以自动处理最后一个条件结尾的逗号
  • trim 标签用于去除或添加前缀和后缀
  • choose、when、otherwise 标签类似于 Java 中的 switch、case、default 语句,根据不同的条件选择执行不同的 SQL 片段
  • foreach 标签用于遍历集合,常用于 IN 语句中的参数列表生成
  • bind 标签用于在 OGNL 表达式之外创建一个变量,并将其绑定到当前的上下文中,以便在后续的表达式中使用

2 if 标签

if 标签,根据条件是否满足来决定是否包含某个元素,判断条件写在 if 标签的 test 属性中

<resultMap id="employeeMap" type="com.dao.Employee">
    <id property="empId" column="employee_id"/>
    <result property="empName" column="employee_name"/>
    <result property="empAge" column="employee_age"/>
    <result property="empSex" column="employee_sex"/>
    <result property="empEmail" column="employee_email"/>
    <result property="empAddress" column="employee_address"/>
</resultMap>

<select id="getEmpIf" parameterType="com.dao.Employee" resultMap="employeeMap">
    select * from employee where
    <if test="empName != null and empName != ''">
        employee_name=#{empName}
    </if>
</select>

上述代码如果 if 标签的条件不符合,则查询语句为 select * from employee where,会报错

3 where 标签

where 标签,用于生成 WHERE 子句,并会自动去掉(忽略)第一个条件的 and 或 or 关键字,避免语法错误。

<select id="getEmpWhereIf" parameterType="com.dao.Employee" resultMap="employeeMap">
    select * from employee
    <where>
        <if test="empName != null and empName !=''">
            and employee_name=#{empName}
        </if>
    </where>
</select>

通过 where 标签查询,不会出现 SQL 语句多余 where 的情况

4 set 标签

set 标签,用于生成 SET 子句,进行更新操作,可以自动处理最后一个条件结尾的逗号

<update id="UpdateEmployee" parameterType="com.dao.Employee">
    update employee
    <set>
        <if test="empName != null and empName !=''">
            employee_name=#{empName},
        </if>
    </set>
    where employee_id=#{empId}
</update>

测试代码需要提交事务,sqlSession.commit(); 否则不会更新数据库

5 trim 标签

trim 标签,用于去除或添加前缀和后缀,以下是 trim 标签的属性:

  • prefix:表示在 trim 标签内的 sql 语句加上前缀
  • suffix:表示在 trim 标签内的 sql 语句加上后缀
  • prefixOverrides:表示去除第一个前缀
  • suffixOverrides:表示去除最后一个后缀
<select id="getEmpWhereIf" parameterType="com.dao.Employee" resultMap="employeeMap">
    select * from employee
    <!-- 添加前缀 where,移除 and 或 or -->
    <trim prefix="where" prefixOverrides="and | or">
        <if test="empName != null">
            and employee_name=#{empName}
        </if>
    </trim>
</select>

6 choose、when、otherwise 标签

choose、when、otherwise 标签,类似于 Java 中的 switch 语句,根据不同的条件选择执行不同的 SQL 片段

<select id="selectEmployeeByChoose" resultType="com.dao.Employee" parameterMap="employeeMap">
    select * from employee
    <where>
        <choose>
            <when test="empName!= null and empName!=''">
                employee_name=#{empName}
            </when>
            <when test="empAddress!= null and empAddress!=''">
                and employee_address=#{empAddress}
            </when>
            <otherwise>
                and employee_age=#{empAge}
            </otherwise>
        </choose>
    </where>
</select>

7 foreach 标签

foreach 标签,用于遍历集合,常用于 IN 语句中的参数列表生成。foreach 标签有以下几个属性:

  • collection:表示要遍历的集合元素,注意不要写 #{}。
  • item:表示每次遍历时生成的对象名(当传入 Map 对象或 Map.Entry 对象的集合时,index  是键,item 是值)
  • index:表示在迭代过程中,每次迭代到的位置
  • open:表示开始遍历时要拼接的字符串
  • close:表示结束遍历时要拼接的字符串
  • sperator:表示在每次遍历时,两个对象之间的连接字符串
在 Mapper.xml SQL 映射文件
<select id="selectEmployeeByListId" resultMap="employeeMap">
    select * from employee
    <where>
        <!-- where employee_id in (?,?,?,?)-->
<!--        <foreach collection="ids" item="id" open="employee_id in (" close=")" separator=",">-->
<!--            #{id}-->
<!--        </foreach>-->
        <!-- where employee_id=? or employee_id=?... -->
        <foreach collection="ids" item="id" separator="or">
            employee_id=#{id}
        </foreach>
    </where>
</select>

在 Mapper.java 接口
List<Employee> selectEmployeeByListId(@Param("ids") List<Integer> ids);

在 Test 测试类
@Test
public void testSelectByListid() {
    List<Integer> ids = new ArrayList<>();
    ids.add(1);
    ids.add(2);
    ids.add(4);
    ids.add(5);
    List<Employee> employees = mapper.selectEmployeeByListId(ids);
    for (Employee employee : employees) {
        System.out.println(employee);
    }
}

8 bind 标签

bind 标签,用于在 OGNL 表达式之外创建一个变量,并将其绑定到当前的上下文中,以便在后续的表达式中使用。

<!-- 查询姓马的员工 -->
<select id="selectEmployeeByName" parameterType="com.dao.Employee" resultMap="employeeMap">
    <bind name="pattern" value="'%' + empName + '%'"/>
    select * from employee where employee_name like #{pattern}
</select>

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

相关文章

  • MyBatis-Plus框架整合详细方法

    MyBatis-Plus框架整合详细方法

    MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生这篇文章主要介绍了MyBatis-Plus框架整合,需要的朋友可以参考下
    2022-04-04
  • MySQL主键约束和外键约束的实现

    MySQL主键约束和外键约束的实现

    在MySQL中,主键和外键约束是通过约束来实现的,本文主要介绍了MySQL主键约束和外键约束的实现, 具有一定的参考价值,感兴趣的可以了解下
    2023-11-11
  • 关于druid连接池的使用详解

    关于druid连接池的使用详解

    文章介绍了Druid连接池的两种使用方式:直接在代码中配置和通过配置文件配置,同时,文章详细讲解了如何在Web项目中启用Druid的监控功能,包括配置web.xml文件、设置过滤器等步骤,最后,文章还提到了Druid提供的加密解密工具,使数据库密码更安全
    2025-02-02
  • 详解Mybatis中的 ${} 和 #{}区别与用法

    详解Mybatis中的 ${} 和 #{}区别与用法

    这篇文章主要介绍了Mybatis中的 ${} 和 #{}区别与用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Arthas-java程序运行时debug工具使用

    Arthas-java程序运行时debug工具使用

    这篇文章主要介绍了Arthas-java程序运行时debug工具使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • JAVA心得分享---return语句的用法

    JAVA心得分享---return语句的用法

    return算是各大语言的常客,基本上都有return语句,那么在JAVA中,return有什么特殊的地方吗,下面我们来分析下
    2014-05-05
  • JPA之多对多查询死循环嵌套问题及解决方案

    JPA之多对多查询死循环嵌套问题及解决方案

    这篇文章主要介绍了JPA之多对多查询死循环嵌套问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化

    Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化

    Dwr对我来说最重要的功能点就是反向Ajax调用,通俗来将就是后端可以直接调用前端的JS方法(只要在所能访问的范围内),这也就是Dwr的真正来由,当然它也有最基本的前端直接调用后端的特性,省去了我们经常的一般Ajax调用
    2016-04-04
  • @Conditional注解的使用场景和源码解析

    @Conditional注解的使用场景和源码解析

    这篇文章主要介绍了@Conditional注解的使用场景和源码解析,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,如果满足条件,则将Bean注册进IOC中,如果不满足条件,则不进行注册,需要的朋友可以参考下
    2023-11-11
  • 详解java基于MyBatis使用示例

    详解java基于MyBatis使用示例

    这篇文章主要介绍了详解java基于MyBatis使用示例,对学习MyBatis有一定的帮助,有需要的可以了解一下。
    2016-11-11

最新评论