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

news2024/12/23 1:20:50

目录

前置条件

动态SQL语句

动态删除数据

1.集合类型:数组

2.集合类型: List 型

SQL语句重用

说明


🧨前置条件

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

实体类User表
表中的字段名User实体类的属性值
id (bigint auto increment) 长整型 自动增长private Long id
username(varchar(50)) 可变字符50private String username
password(varchar(50)) 可变字符50private String password
nickname(varchar(50)) 可变字符50private 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类的属性值
usernameprivate String username
passwordprivate  String password
nicknameprivate 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

消失的数字

一、题目 原题链接. - 力扣&#xff08;LeetCode&#xff09; 二、解题 int missingNumber(int* nums, int numsSize){ //a^0a; //a^a0; //先求出0^1^2......^n的数&#xff0c;再将其与数组每个元素异或即可得到要寻找的数字 int ret0; for(int i0;i<numsSize;i) {ret^i;…

transformer原理-Attention Is All You Need

文章目录 前言动机NLP任务特点循环神经网络循环神经网络流行原因循环神经网络缺点 transformer架构整体架构&#xff08;编码器-解码器&#xff09;自注意力&#xff08;self-attention&#xff09;传统NLP解决方案改进思路 多头注意力&#xff08;Multi-Head Attention&#x…

《Fundamentals of Power Electronics》——反激变换器

反激转换器基于升降压转换器&#xff0c;接下去介绍它的演变过程。下图中的a描述了基本升降压型转换器电路&#xff0c;用一个MOSFET和二极管实现开关。 在图b中&#xff0c;电感绕组由两根导线构成&#xff0c;匝数比为1:1。电感的基础作用未改变&#xff0c;并联绕组可以等效…

在 Windows 系统上安装 TeamViewer 13

在 Windows 系统上安装 TeamViewer 13 References 默认安装到所有用户 同意协议 安装目录 勾选内容 打开文件位置 打开 rClientID.exe Extras -> Options -> Advanced Show advanced options -> Display language 重新启动TeamViewer 语言可修改为中文简体 …

Web 渗透测试神器:HackBar 保姆级教程

一、介绍 HackBar 是一个用于浏览器的扩展插件&#xff0c;主要用于进行网络渗透测试和安全评估。它提供了一系列方便的工具和功能&#xff0c;可以帮助用户执行各种网络攻击和测试&#xff0c;包括 XSS、SQL 注入、CSRF、路径穿越等。以下是 HackBar 插件的一些主要特点和功能…

Transformer - Layer Normalization

Transformer - Layer Normalization flyfish y x − E [ x ] V a r [ x ] ϵ ∗ γ β y \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] \epsilon}} * \gamma \beta yVar[x]ϵ ​x−E[x]​∗γβ 论文 Layer Normalization import numpy as np import torch import…

【Jenkins】持续集成与交付 (一):深入理解什么是持续集成?

🟣【Jenkins】持续集成与交付 (一):深入理解什么是持续集成? 1、软件开发生命周期与持续集成2、 持续集成的流程3、持续集成的好处4、Jenkins的应用实践5、结语💖The Begin💖点点关注,收藏不迷路💖 1、软件开发生命周期与持续集成 软件开发生命周期(SDLC)是指软…

Redis缓存介绍以及常见缓存问题:穿透、雪崩和击穿

概念 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 作用&#xff1a; 降低后端负载 提高读写效率&#xff0c;降低相应时间 成本&#xff1a; 数据一致性成本 代码维护成本 运维成本 缓存更…

使用pyqt编写的页面导航框架

使用pyqt编写的页面导航框架 效果 介绍代码 效果 介绍 使用pyqt多种控件编写的导航框架&#xff0c;左边是菜单栏&#xff0c;点击不同的菜单选项可以切换到不同的页面。 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QP…

微服务之分布式理论zookeeper概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem)&#xff0c;⼜被称作布鲁尔定理(Eric Brewer)&#xff0c;1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …

Leetcode—1329. 将矩阵按对角线排序【中等】(unordered_map、priority_queue)

2024每日刷题&#xff08;121&#xff09; Leetcode—1329. 将矩阵按对角线排序 实现代码 class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {const int m mat.size();const int n mat[0].size();unorder…

(51单片机)第十三章-STC系列51单片机功能介绍

13.1 单片机空闲与掉电模式的应用 1. 空闲模式 当单片机进入空闲模式时&#xff0c;除CPU处于休眠状态外&#xff0c;其余硬件全部处于活动状态&#xff0c;芯片中程序未涉及的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值。假若定时器正在运行&#xff0c;…

【tcl脚本实践Demo 1】文本生成、匹配、修改、读写

引言 在芯片设计的流程中,各种EDA工具在设计、综合、布局布线、验证、时序分析等等环节都会产出大量的文件信息。这些信息是海量的,如果单纯靠程序员自己查看信息效率很低并且很容易纰漏。所以脚本语言可以很好的解决这个问题,可以利用脚本语言匹配到敏感的信息,完成对信息…

C++ 如何实现原子性

1.操作系统如何实现原子性 在单处理器,单核,运行多线程的情况下,我们不使用线程同步工具, 我们会出现,线程之间会互相抢夺,临界区的资源,造成数据不符合我们预期的结果, 后面再说解决办法,那么我们怎么帮助实现原子性 1 屏蔽中断,不让线程之间切换,让它完成再切换 2 底层硬…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

基于ssm+vue开放式教学评价管理系统【ppt·代码·文档报告】

项目演示视频 项目名称&#xff1a;开放式教学评价管理系统 系统介绍&#xff1a;本系统是通过java的SSM框架来实现的&#xff0c;前端采用vue框架进行实现 管理员通过登录进入到系统操作界面&#xff0c;结合需求可以对个人信息进行在线修改维护&#xff0c;也可结合需求进行…

深入剖析Redis哨兵模式的原理和应用

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好,我是小米!今天我们来聊一聊Redis中一个非常重要的话题——哨兵模式。相信大家在使用Redis时一定遇到过一些分布式系统的问题,而哨兵模式正是解决这些问题的关键之一。让我们一起来深入了解一下哨兵模式的原…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion&#xff0c;一款强大的多功能工具&#xff0c;可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号&#xff0c;来到首页&#xff0c;点击设置&#xff0c;左边…

13.Blender 界面介绍(下) 雕刻、纹理绘制及属性

界面介绍 1. 布局 物体的移动旋转和缩放等操作 2. 建模 里面就是有一些建模常用的功能 里面的功能对于做MMD来说不是必备的操作 3. 雕刻 使用里面的工具可以对物体本身进行修改 4. UV编辑 如果想要编辑UV贴图 将编辑模式改为纹理绘制 再点击右边的工具 如果进行编…

WordPress缓存插件有哪些?好用的缓存插件分享

目前WordPress缓存插件有&#xff1a;WP Rocket、WP Super Cache、W3 Total Cache、Sucuri、NitroPack、SiteGround Optimizer、LiteSpeed Cache、WP-Optimize、Hummingbird、Cache Enabler、Comet Cache。 在当今的数字世界中&#xff0c;拥有一个高效的网站对于吸引和留住用…