Spring-Mybatis-Xml管理(动态sql语句,sql语句复用)

目录

前置条件

动态SQL语句

动态删除数据

1.集合类型:数组

[2.集合类型: List 型](#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 |
[实体类User表]

🎢动态SQL语句

动态SQL是指在程序运行时动态生成SQL语句的技术。

它允许开发人员在程序运行时根据不同的条件拼接SQL语句,从而灵活地构建各种查询。

动态删除数据

<foreach>标签的使用

<foreach collection="集合类型" item="随意变量名" separator="分割标志符号">

{实体类属性}

</foreach>)

|-------|-----------|
| List | 一维度集合 |
| Array | 数组 |
| Map | 二维度集合,键值对 |
[collection类型]

1.集合类型:数组

@Mapper映射的类接口方法

java 复制代码
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 复制代码
<?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-项目名-测试文件

java 复制代码
@Test
    void deleteArrayByIdTest(){
        Integer[] integers={109,110};
        System.out.println(userMapper.deleteArrayById(integers));
    }

运行结果

2.集合类型: List 型

@Mapper映射的类接口方法

java 复制代码
  int deleteListById(ArrayList<Integer> arrayList);

xml文件SQL语句编写

XML 复制代码
   <delete id="deleteListById" >
DELETE  FROM user   WHERE id    IN
        (<foreach collection="list" item="id" separator=",">
        #{id}
    </foreach>)
    </delete>

测试

java 复制代码
  @Test
    void deleteListByIdTest(){
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(106);
        integers.add(107);


        System.out.println(userMapper.deleteListById(integers));
    }

运行结果

动态数据更新

@Mapper映射的类接口方法

java 复制代码
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,则忽略该片段。

XML 复制代码
<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>

测试

java 复制代码
@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

XML 复制代码
    <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>)

优化代码

XML 复制代码
<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>
相关推荐
枷锁—sha6 小时前
【PortSwigger Academy】SQL 注入绕过登录 (Login Bypass)
数据库·sql·学习·安全·网络安全
魔芋红茶6 小时前
Spring Security 学习笔记 2:架构
笔记·学习·spring
麦克马7 小时前
MyBatis中字符串比较的类型解析问题与解决方案
mybatis
逍遥德8 小时前
PostgreSQL 中唯一约束(UNIQUE CONSTRAINT) 和唯一索引(UNIQUE INDEX) 的核心区别
数据库·sql·postgresql·dba
工业甲酰苯胺8 小时前
字符串分割并展开成表格的SQL实现方法
数据库·sql
卓怡学长8 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
小句9 小时前
SQL中JOIN语法详解 GROUP BY语法详解
数据库·sql
昊昊该干饭了10 小时前
一个真实查询需求如何从表设计走到高效 SQL
数据库·sql
Elastic 中国社区官方博客11 小时前
使用瑞士风格哈希表实现更快的 ES|QL 统计
大数据·数据结构·sql·elasticsearch·搜索引擎·全文检索·散列表
进击的CJR12 小时前
redis cluster 部署
java·redis·mybatis