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


目录
相关文章
|
29天前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
24天前
|
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/
|
13天前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
22 1
|
24天前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
24天前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
26天前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
2月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
54 3
|
2月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
60 7
|
3月前
|
SQL 缓存 Java
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
|
3月前
|
SQL Java 数据库连接
MyBatis动态SQL
MyBatis动态SQL
46 0