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

目录

前置条件

动态SQL语句

动态删除数据

1.集合类型:数组

2.集合类型: List 型

SQL语句重用

说明


🧨前置条件

已经创建了实体类(这边举个例子)

实体类User表
表中的字段名 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>)

collection类型
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>

相关推荐

  1. MyBatis动态SQL语句

    2024-04-30 09:44:04       70 阅读
  2. mybatis动态SQL常用语法总结

    2024-04-30 09:44:04       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 09:44:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 09:44:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 09:44:04       87 阅读
  4. Python语言-面向对象

    2024-04-30 09:44:04       96 阅读

热门阅读

  1. Verilog学习之时序控制、语句块(1)

    2024-04-30 09:44:04       33 阅读
  2. Caddy实践 | Docker环境下使用Caddy快速部署web服务器

    2024-04-30 09:44:04       29 阅读
  3. memcpy,memmove函数详解

    2024-04-30 09:44:04       34 阅读
  4. 云容器与云中间件

    2024-04-30 09:44:04       35 阅读
  5. onion洋葱模型

    2024-04-30 09:44:04       30 阅读
  6. 程序设计:C语言 UNIX/LINUX 环境变量替换

    2024-04-30 09:44:04       31 阅读
  7. CentOS 7 安装 Puppeteer & Google Chrome

    2024-04-30 09:44:04       30 阅读