目录
前置条件
动态SQL语句
动态删除数据
1.集合类型:数组
2.集合类型: List 型
SQL语句重用
说明
🧨前置条件
已经创建了实体类(这边举个例子)
表中的字段名 | User实体类的属性值 |
id (bigint auto increment) 长整型 自动增长 | private Long id |
username(varchar(50)) 可变字符50 | private String username |
password(varchar(50)) 可变字符50 | private String password |
nickname(varchar(50)) 可变字符50 | private String nickname |
created(timestamp= CURRENT_TIMESTAMP) 当前时间戳 | private Date created |
🎢动态SQL语句
动态SQL是指在程序运行时动态生成SQL语句的技术。
它允许开发人员在程序运行时根据不同的条件拼接SQL语句,从而灵活地构建各种查询。
动态删除数据
<foreach>标签的使用
<foreach collection="集合类型" item="随意变量名" separator="分割标志符号">
# {实体类属性}
</foreach>)
List | 一维度集合 |
Array | 数组 |
Map | 二维度集合,键值对 |
1.集合类型:数组
@Mapper映射的类接口方法
package cn.tedu.demoforcsdn.mappers;
import cn.tedu.demoforcsdn.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.ArrayList;
import java.util.List;
@Mapper
public interface UserMapper {
//插入数据
int deleteArrayById(Integer[] integers);
}
xml文件SQL语句编写
注意多条删除的时候
DELETE FROM 表名
WHERE 字段名 IN <foreach collection=""item="" seperator="">#{属性值名}</foreach>
<?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="cn.tedu.demoforcsdn.mappers.UserMapper">
<delete id="deleteArrayById">
DELETE FROM user WHERE id IN (
<foreach collection="array" item="id" separator=","> #{id}
</foreach>)
</delete>
</mapper>
测试
路径: src-test-java-项目名-测试文件
@Test
void deleteArrayByIdTest(){
Integer[] integers={109,110};
System.out.println(userMapper.deleteArrayById(integers));
}
运行结果
2.集合类型: List 型
@Mapper映射的类接口方法
int deleteListById(ArrayList<Integer> arrayList);
xml文件SQL语句编写
<delete id="deleteListById" >
DELETE FROM user WHERE id IN
(<foreach collection="list" item="id" separator=",">
#{id}
</foreach>)
</delete>
测试
@Test
void deleteListByIdTest(){
ArrayList<Integer> integers = new ArrayList<>();
integers.add(106);
integers.add(107);
System.out.println(userMapper.deleteListById(integers));
}
运行结果
动态数据更新
@Mapper映射的类接口方法
int updateUserByUsername(UserUpdateVO userUpdateVO);
这边我只需要返回 nickname,username,password
这边我定义了一个vo类用于接受数据库的返回值
数据库的字段名 | userUpdateVo类的属性值 |
---|---|
username | private String username |
password | private String password |
nickname | private String nickname |
xml文件SQL语句编写
<set> 标签
<set> 标签用于包裹 UPDATE 语句的 SET 部分,并自动处理字段间的逗号分隔。如果在动态生成的 SQL 语句中最后一个 <if> 条件不满足,那么 <set> 标签会自动移除最后一个多余的逗号,这可以避免 SQL 语法错误。
注意处理多字段必须以逗号分割,必须写WHERE
<if> 标签
<if> 标签用于条件判断。它根据 test 属性的值来决定是否包含其内部的 SQL 片段。如果 test 属性的值为 true,则包含该 SQL 片段;如果为 false,则忽略该片段。
<update id="updateUserByUsername">
UPDATE user
<set>
<if test="password!=null">password=#{password},</if>
<if test="nickname!=null">nickname=#{nickname}</if>
</set>
WHERE username =#{username};
</update>
测试
@Test
void updateUser(){
UserUpdateVO userUpdateVO = new UserUpdateVO();
userUpdateVO.setUsername("赵四");
userUpdateVO.setPassword("abcdf");
userUpdateVO.setNickname("扛把子");
System.out.println(userMapper.updateUserByUsername(userUpdateVO));
}
运行结果
数据库状态
🎡SQL语句重用
说明
SQL语句重用是指在数据库应用程序中,多次执行相同或类似的SQL语句时,通过重用这些语句来提高性能,减少系统消耗的资源。
使用 <sql></sql> 和 <include></include> 标签组合实现
举个例子
可以优化部分
DELETE FROM user WHERE id IN
<delete id="deleteListById" >
DELETE FROM user WHERE id IN
(<foreach collection="list" item="id" separator=",">
#{id}
</foreach>)
</delete>
<delete id="deleteMapById">
DELETE FROM user WHERE id IN
(<foreach collection="map" item="id" separator=",">
#{id}
</foreach>)
优化代码
<sql id="123">
DELETE FROM user WHERE id IN
</sql>
<delete id="deleteListById" >
<include refid="123"></include>
(<foreach collection="list" item="id" separator=",">
#{id}
</foreach>)
</delete>
<delete id="deleteMapById">
<include refid="123"></include>
(<foreach collection="map" item="id" separator=",">
#{id}
</foreach>)
</delete>