java:MyBatis动态SQL

简介: 动态SQL是一种在运行时构建和执行SQL查询语句的技术。它允许开发者根据不同的条件和参数来动态地生成SQL语句,以满足不同的业务需求

1、if标签

if标签的格式

<if test="条件">
    SQL片段
</if>

if标签的作用

当条件为true的时候就拼接SQL片段

例如:根据用户名和性别查询用户,如果用户名称不为空,则用户名称作为查询条件,如果性别不为空,则性别作为查询条件

    <select id="selectByIf" resultType="User">
        select * from user
            where
            <if test="username != null and username != '' ">
                username like #{username}
            </if>
            <if test="sex != null and sex != '' ">
                and sex = #{sex};
            </if>
    </select>

但是这种写法,会发现如果不填写username的内容,这样的拼接机会报错,还有就是两个都不填的情况下,也会报错,因为还有个where在,这样的编写在实际应用情况是非常不符合的

2、where标签

where标签的作用

where需要在有条件的时候充当where关键字,没有查询条件的时候自动消失

  1. 自动补全where这个关键字
  2. 去掉多余的and和or关键字
    <select id="selectByIf" resultType="User">
        select * from user
            <where>
                <if test="username != null and username != '' ">
                    username like #{username}
                </if>
                <if test="sex != null and sex != '' ">
                    and sex = #{sex};
                </if>
            </where>
    </select>

3、set标签

在原本的修改SQL中,添加动态SQL

    <select id="updateByIf" resultType="User">
        update user set
        <if test="username != null and username !=''">
            username = #{username},
        </if>
        <if test="birthday != null and birthday !=''">
            birthday = #{birthday},
        </if>
        <if test="sex != null and sex !=''">
            sex = #{sex},
        </if>
        <if test="address != null and address !=''">
            address = #{address},
        </if>
            where id = #{id};
    </select>

会发现测试运行的时候SQL语句会多出来一个逗号

==>  Preparing: update user set username = ?, sex = ?, where id = ?;

所以我们会选择使用Set标签,可以去掉多余的逗号

    <select id="updateByIf" resultType="User">
        update user
        <set>
            <if test="username != null and username !=''">
                username = #{username},
            </if>
            <if test="birthday != null and birthday !=''">
                birthday = #{birthday},
            </if>
            <if test="sex != null and sex !=''">
                sex = #{sex},
            </if>
            <if test="address != null and address !=''">
                address = #{address},
            </if>
        </set>
            where id = #{id};
    </select>

4、foreach标签

foreach标签的属性 作用
collection 参数名
item 设置变量名,代表每个遍历的元素
separator 遍历一个元素添加的内容
#{变量名} 先使用?占位,后面给?赋值
open 在遍历前添加一次字符
close 在遍历后添加一次字符

批量删除用户

    <delete id="deleteByArray" >
        delete from user where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

注意:这边的ids是需要在接口那边进行注解的,不然他会使用默认名

    void deleteByArray(@Param("ids") int[] ids);

5、choose标签

相当于java中的switch

choose标签的属性 作用
when 匹配一个条件
otherwise 所有条件不匹配时执行

设置查询性别默认

    <select id="selectBySex" resultType="org.example.pojo.User">
        select * from user
        <where>
            <choose>
                <when test="sex == 1">
                    sex = '男'
                </when>
                <when test="sex == 0">
                    sex = '女'
                </when>
                 <otherwise>
                     sex = '女'
                 </otherwise>
            </choose>
        </where>
    </select>
相关文章
|
6天前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
18 0
|
1天前
|
SQL 分布式计算 Java
大数据软件基础(2)—— Java、SQL
大数据软件基础(2)—— Java、SQL
8 0
|
2天前
|
网络安全 流计算 Python
实时计算 Flink版操作报错合集之Flink sql-client 针对kafka的protobuf格式数据建表,报错:java.lang.ClassNotFoundException 如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
16 1
|
4天前
|
消息中间件 关系型数据库 网络安全
实时计算 Flink版操作报错合集之Flink sql-client 针对kafka的protobuf格式数据建表,报错:java.lang.ClassNotFoundException 如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
14 1
|
6天前
|
SQL Java 数据库连接
【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态SQL(下)
【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态
6 0
|
6天前
|
SQL Java 数据库连接
【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态SQL(上)
【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态SQL
5 0
|
6天前
|
XML Java 数据库连接
Java一分钟之MyBatis:持久层框架基础
【5月更文挑战第15天】MyBatis是Java的轻量级持久层框架,它分离SQL和Java代码,提供灵活的数据库操作。常见问题包括:XML配置文件未加载、忘记关闭SqlSession、接口方法与XML映射不一致、占位符使用错误、未配置ResultMap和事务管理不当。解决这些问题的关键在于正确配置映射文件、管理SqlSession、避免SQL注入、定义ResultMap以及确保事务边界。遵循最佳实践可优化MyBatis使用体验。
15 2
Java一分钟之MyBatis:持久层框架基础
|
6月前
|
SQL 安全 Java
MyBatis映射文件深入--动态sql
MyBatis映射文件深入--动态sql
51 0
|
6月前
|
SQL XML Java
mybatis的注解开发之三种动态sql
mybatis的注解开发之三种动态sql
|
6月前
|
SQL Java 数据库连接
MyBatis 动态 SQL
MyBatis 动态 SQL