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 进行变换,这样一来,便不会出错。


目录
相关文章
|
4月前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
3天前
|
SQL XML Java
mybatis实现动态sql
MyBatis的动态SQL功能为开发人员提供了强大的工具来应对复杂的查询需求。通过使用 `<if>`、`<choose>`、`<foreach>`等标签,可以根据不同的条件动态生成SQL语句,从而提高代码的灵活性和可维护性。本文详细介绍了动态SQL的基本用法和实际应用示例,希望对您在实际项目中使用MyBatis有所帮助。
23 11
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
24天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
51 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标签的用法
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
67 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
下一篇
DataWorks