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>
相关推荐
yuluo_YX21 分钟前
Spring AI Alibaba Graph 实践
java·人工智能·spring
武子康1 小时前
Java-46 深入浅出 Tomcat 核心架构 Catalina 容器全解析 启动流程 线程机制
java·开发语言·spring boot·后端·spring·架构·tomcat
Edingbrugh.南空1 小时前
Hive SQL 执行计划详解:从查看方法到优化应用
hive·hadoop·sql
bing_1582 小时前
Spring Data MongoDB 提供了哪些核心组件?
java·mongodb·spring
知秋丶2 小时前
Spring-rabbit重试消费源码分析
java·后端·spring
qq_334060214 小时前
springmvc
java·spring·mvc
Edingbrugh.南空5 小时前
Hive SQL:一小时快速入门指南
hive·hadoop·sql
迢迢星万里灬5 小时前
Java求职者面试题解析:Spring、Spring Boot、MyBatis框架与源码原理
java·spring boot·spring·mybatis·面试题
vace cc5 小时前
sql列中数据通过逗号分割的集合,对其中的值进行全表查重
数据库·sql
虾条_花吹雪6 小时前
5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇
数据库·人工智能·学习·spring·ai