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>
相关文章
|
3天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
27 9
|
10天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
43 11
|
1月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
38 8
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
152 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
41 6
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
59 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
2月前
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
52 3
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理