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>
相关推荐
逸狼7 分钟前
【JavaEE进阶】Spring MVC(3)
spring·java-ee·mvc
天上掉下来个程小白14 分钟前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
哆木24 分钟前
排查生产sql查询缓慢
数据库·sql·mysql
程序员侠客行2 小时前
Spring事务原理 二
java·后端·spring
小天努力学java2 小时前
AI赋能传统系统:Spring AI Alibaba如何用大模型重构机票预订系统?
人工智能·spring
五月茶2 小时前
Spring MVC
java·spring·mvc
2501_903238653 小时前
Spring MVC配置与自定义的深度解析
java·spring·mvc·个人开发
计算机毕设指导63 小时前
基于Springboot学生宿舍水电信息管理系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
计算机-秋大田3 小时前
基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·spring·课程设计
羊小猪~~5 小时前
MYSQL学习笔记(九):MYSQL表的“增删改查”
数据库·笔记·后端·sql·学习·mysql·考研