MyBatis 之 动态 SQL(下)

简介: MyBatis 之 动态 SQL(下)

4. set 标签



主要作用


set 标签一般与 if 标签搭配使用,它可以直接代替 SQL语句中的 set 关键字,在 set 标签中,我们可以控制修改字段的数量,从而达到不同的 update 修改要求。


代码实现


UserInfo 类:


@Data
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String photo;
    private String createtime;
    private String updatetime;
    private int state;
}


" UserMapper " 接口:


@Mapper
public interface UserMapper {
    // 修改用户使用 set 标签
    public int update2(UserInfo userInfo);
}


xml 文件


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <!-- 修改用户使用 set 标签 -->
    <!--  update userinfo set username = #{username} where id = #{id} -->
    <update id="update2">
        update userinfo
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
            <if test="photo != null">
                photo = #{photo}
            </if>
        </set>
        where id = #{id}
    </update>
</mapper>


测试类1:


@SpringBootTest
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 修改用户使用 set 标签
    @Test
    void update2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("王五");
        userInfo.setPassword("777");
        userInfo.setPhoto("777.png");
        userInfo.setId(7);
        int result = userMapper.update2(userInfo);
        System.out.println("测试结果: " + result);
    }
}


启动测试方法,查看 MyBatis 日志打印:


97b070c022004ad5b713462253636ba4.png


观察数据库:


8dd7e752ce0e410a86f71df9aea10fd7.png


测试类2:


@SpringBootTest
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 修改用户使用 set 标签
    @Test
    void update2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("王五");
        userInfo.setPassword("777");
        userInfo.setPhoto("777.png");
        userInfo.setId(7);
        int result = userMapper.update2(userInfo);
        System.out.println("测试结果: " + result);
    }
}


启动测试方法,查看 MyBatis 日志打印:


bf1cd2e1888e4861af4ca3ac6611d3aa.png


观察数据库:


f4ca48f2638347a592b24db4ae7ddf8a.png


总结 set 标签语法


一般来说,set 用于 update 修改操作中,所以,既然要修改了,那么在 set 标签中,必然是需要至少一个值,否则就会报错。


此外,set 标签也等价于下面的写法,实际上它能省略语句中的后缀 " 逗号 ",但是它省略不了语句中的前缀 " 逗号 " .


<trim prefix="set" suffixOverrides=",">
</trim>


此外,它也很智能,它能够自动检测 SQL 语句块的末尾是否真的有 " 逗号 ",对于末尾没有逗号的情况,它不会执行删除操作,同时也不会报错。


5. foreach 标签



主要作用


foreach 标签一般与 SQL 中的 in() 关键字搭配,可以做到批量化操作。

下面的代码就是展示了批量删除的操作。


代码实现


UserInfo 类:


@Data
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String photo;
    private String createtime;
    private String updatetime;
    private int state;
}


" UserMapper " 接口:


@Mapper
public interface UserMapper {
    // 批量删除使用 foreach 标签
    public int deleteByIds(List<Integer> ids);
}


xml 文件


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <!-- 批量删除使用 foreach 标签 -->
    <!-- delete from userinfo where id in ( , , ,); -->
    <delete id="deleteByIds">
        delete from userinfo where id in
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>
</mapper>


测试类1:


@SpringBootTest
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 批量删除使用 foreach 标签
    @Test
    void deleteByIds() {
        List<Integer> ids = new ArrayList<>();
        // 添加需要删除的用户 id
        ids.add(8);
        ids.add(9);
        ids.add(10);
        int result = userMapper.deleteByIds(ids);
        System.out.println("测试结果: " + result);
    }
}


启动测试方法,查看 MyBatis 日志打印:


e2678b2859cb4f94ace722b8f789c472.png


观察数据库:


f7bd5ae621364710957aa3f30ba5e90e.png


总结 foreach 标签语法


foreach 标签的语法可以类比于 Java 中 for each 遍历数组的用法。

foreach 标签常用的有五个属性,它们可以达到往 SQL 语句块中拼接或删除字符(串)的作用,从而控制 SQL 的写法。


① collection:一组相同的数据的集合,类似于数组,

这里需要注意,collection 中的值需要与前端传来的参数匹配。


② item:集合中的一项数据,类似于数组中的某一个元素

③ open:需要拼接的前缀字符(串)

④ close:需要拼接的后缀字符(串)

⑤ separator:一组数据的分隔符


总结动态 SQL



动态 SQL 就和它的名字一样,赋予了 SQL 一个动态的语法,我们可以根据前端需要的参数,来控制一整条 SQL 语句。本质上,关于动态 SQL 的标签,就是用来拼接或删除 SQL 的,没有其他的作用。


在使用动态 SQL 之前,我们应该先把心中设想好的完完整整的 SQL 写出来,之后再对此 SQL 进行变换,这样一来,便不会出错。


目录
相关文章
|
3月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
272 18
|
8月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
7月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
990 0
|
3月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
81 0
|
6月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
565 5
|
8月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
8月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
9月前
|
SQL XML Java
九、MyBatis动态SQL
九、MyBatis动态SQL
156 2
|
10月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
1087 6
|
8月前
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
239 0