当前位置: 首页 > news >正文

Springboot Mybatis 动态SQL

        动态SQL

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wzb.SqlImprove20240925.SQLImproveMapper"><!-- 将条件查询改成动态SQL形式 --><!-- XML中,是对SQL语句进行拼接的,将若干SQL语句的条件,拼接成一条完整的SQL语句 --><!-- <if>标签用于判断条件是否成立,用test属性进行条件判断,若条件为true,那么就拼接SQL,若为false,则不操作 --><!--    <select id="sqlImprove" resultType="com.wzb.Pojo20240925.Emp">--><!--        select * from emp--><!--        where--><!--        <if test="name != null">--><!--            name like concat('%', #{name}, '%')--><!--        </if>--><!--        <if test="gender != -1">--><!--            and gender = #{gender}--><!--        </if>--><!--        <if test="begin != null and end != null">--><!--            and entrydate between #{begin} and #{end}--><!--        </if>--><!--        order by update_time desc--><!--    </select>--><!-- 上述代码看似完成了条件查询,但其实仍然有不足之处:1.若所有参数都是null,那么仍然会在SQL语句中拼接where,这是不符合SQL语法的2.若前面的是null,但是后面的参数不是null,那么会多拼接一个null,比如上面的代码:name是null;但是gender不是null那么就会拼接成“...... where and gender = #{gender}”,这是错误的SQL语句--><!-- 解决方法:<where>标签:<where>标签只会在子元素(参数)有内容的情况下,才会插入where子句,并且能够自动去除子句开头的and或者or --><!-- 优化代码 --><!-- 当参数没有传递(为null时),就不会将语句拼接成SQL语句,并且用了<where>标签,能够自动处理开头的and、or --><select id="sqlImprove" resultType="com.wzb.Pojo20240925.Emp">select * from emp<where><if test="name != null">and name like concat('%', #{name}, '%')</if><if test="gender != -1">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between begin and end</if></where>order by update_time desc</select><!-- 测试成功,成功实现动态SQL --><!-- 实现动态更新员工信息 -->
<!--    <update id="updateImprove">-->
<!--        update emp-->
<!--        set-->
<!--        <if test="username != null">-->
<!--            username=#{username},-->
<!--        </if>-->
<!--        <if test="name != null">-->
<!--            name=#{name},-->
<!--        </if>-->
<!--        <if test="gender != -1">-->
<!--            gender=#{gender},-->
<!--        </if>-->
<!--        <if test="image != null">-->
<!--            image=#{image},-->
<!--        </if>-->
<!--        <if test="job != null">-->
<!--            job=#{job},-->
<!--        </if>-->
<!--        <if test="entrydate != null">-->
<!--            entrydate=#{entrydate},-->
<!--        </if>-->
<!--        <if test="deptId != null">-->
<!--            dept_id=#{deptId},-->
<!--        </if>-->
<!--        <if test="updateTime != null">-->
<!--            update_time=#{updateTime}-->
<!--        </if>-->
<!--        where id = #{id}-->
<!--    </update>--><!-- 这个代码会出现问题,若只传递前面的参数,不传递最后一个参数,那么将会多出一个“,”(因为每一个拼接语句的末尾都有个逗号,只有最后一1个拼接语句没有),所以说只要不传递最后一个参数,就会发生SQL语句语法错误 --><!-- 解决方法:使用标签<set>在update语句中使用<set>标签,会删除掉额外的逗号,避免SQL语法错误 --><update id="updateImprove">update emp<set><if test="username != null">username=#{username},</if><if test="name != null">name=#{name},</if><if test="gender != -1">gender=#{gender},</if><if test="image != null">image=#{image},</if><if test="job != null">job=#{job},</if><if test="entrydate != null">entrydate=#{entrydate},</if><if test="deptId != null">dept_id=#{deptId},</if><if test="updateTime != null">update_time=#{updateTime}</if></set>where id = #{id}</update><!-- 这样可以解决update语句后多","的问题 --><!-- 小结:<if>标签可以用于判断条件是否成立,若条件为true,那么拼接对应的SQL语句<where>标签代替where,只会在子元素不为null的时候才插入where子句,并且能够自动去除子句开头的多余的and和or<set>标签代替set在update语句中使用,可以动态的插入update子句,并且能删除额外的“,” --><!-- 使用<foreach>标签达到删除多条语句的效果 --><!-- <foreach collection="集合名称" item="集合遍历出来的元素", separator="每一次遍历使用的分隔符"open="遍历开始之前拼接的片段" close="遍历结束后拼接的片段"> --><delete id="deleteImprove">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete><!-- 成功使用<foreach>完成批量删除 --><!-- 在XML映射文件中配置SQL,有时会出现很多重复的片段,那么就会导致很多冗余的代码 --></mapper>

        SQLImproveMapper

package com.wzb;import com.wzb.MybatisExercise20240925.EmpMapper;
import com.wzb.MybatisXmlExercise20240925.XmlMapper;
import com.wzb.Pojo20240925.Emp;
import com.wzb.SqlImprove20240925.SQLImproveMapper;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;@SpringBootTest
class SpringbootExercise20240925ApplicationTests {@Autowiredprivate EmpMapper empMapper;@Autowiredprivate XmlMapper xmlMapper;@Autowiredprivate SQLImproveMapper sqlImproveMapper;// 增
//    @Test
//    public void insertEmp() {
//        Emp emp = new Emp();
//        emp.setUsername("black");
//        emp.setName("布莱克");
//        emp.setGender((short)1);
//        emp.setImage("2.jpg");
//        emp.setJob((short)2);
//        emp.setEntrydate(LocalDate.of(2000, 1, 1));
//        emp.setCreateTime(LocalDateTime.now());
//        emp.setUpdateTime(LocalDateTime.now());
//
//        empMapper.insertEmp(emp);
//    }//    // 删
//    @Test
//    public void deleteEmp() {
//        empMapper.deleteEmp(20);
//    }
//
//    // 改
//    @Test
//    public void updateEmp() {
//        Emp emp = new Emp();
//        emp.setId(19);
//        emp.setUsername("gaiya");
//        emp.setName("盖亚");
//        emp.setGender((short)1);
//        emp.setImage("2.jpg");
//        emp.setJob((short)2);
//        emp.setEntrydate(LocalDate.of(2000, 1, 1));
//        emp.setCreateTime(LocalDateTime.now());
//        emp.setUpdateTime(LocalDateTime.now());
//
//        empMapper.updateEmp(emp);
//    }
//
//    // 查
//    @Test
//    public void selectEmp() {
//        Emp emp = empMapper.selectEmp(19);
//        System.out.println(emp);
//    }@Testpublic void XmlConditionSelect() {List<Emp> empList = xmlMapper.conditionSelect("张", (short) 1, null, null/*LocalDate.of(2000, 1, 1), LocalDate.of(2024,1,1)*/);for (Emp emp : empList) {System.out.println(emp);}}@Testpublic void SqlImprove() {List<Emp> empList = sqlImproveMapper.sqlImprove(null, (short) -1, null, null);for (Emp emp : empList) {System.out.println(emp);}}@Testpublic void updateEmp() {Emp emp = new Emp();emp.setUsername("tom2");sqlImproveMapper.updateImprove(emp);}@Testpublic void deleteEmp() {List<Integer> ids = new ArrayList<>();Collections.addAll(ids, 18,19,26,27);sqlImproveMapper.deleteImprove(ids);}
}

 

相关文章:

Springboot Mybatis 动态SQL

动态SQL <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.wzb.SqlImprove2024…...

ORM的了解

什么是ORM&#xff1f;为什么要用ORM&#xff1f;-CSDN博客 C高级编程&#xff08;99&#xff09;面向资源的设计思想&#xff08;ORM&#xff09;_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…...

关于大模型的10个思考

9月28日&#xff0c;第四届“青年科学家50论坛”在南方科技大学举行&#xff0c;美国国家工程院外籍院士沈向洋做了《通用人工智能时代&#xff0c;我们应该怎样思考大模型》的主题演讲&#xff0c;并给出了他对大模型的10个思考。 以下是他10个思考的具体内容&#xff1a; 1…...

CFR( Java 反编译器)---> lambda 表达式底层实现机制

一、安装教程 CFR&#xff08;Class File Reader&#xff09;是一个流行的Java反编译器&#xff0c;它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程&#xff1a; 下载CFR 访问CFR的官方网站或GitHub仓库&#xff1a;CFR的最新版本和所…...

《C++多态性:开启实际项目高效编程之门》

在 C的广阔编程世界中&#xff0c;多态性是一个强大而富有魅力的特性。它为程序员提供了极大的灵活性和可扩展性&#xff0c;使得代码能够更加优雅地应对复杂的业务需求。在实际项目中&#xff0c;理解和正确应用 C的多态性至关重要&#xff0c;它可以显著提高代码的质量、可维…...

UDS_5_输入输出控制功能单元

目录 一. 0x2F服务 一. 0x2F服务 InputOutputControlByIdentifier(0x2F)服务 用于替换服务器输入信号的值或内部功能控制电子系统的某个输出(执行器) •请求报文 A_Data Byte Parameter Name Cvt Byte Value #1 InputOutputControlByIdentifier Request SID M 0x2F dataI…...

CAD快捷键

CAD快捷键 功能快捷键描述直线L点PO多段线PL多用于描边构造线XL无限长直线射线RAY样条曲线SPL绘制光滑曲线–––圆弧A圆C矩形REC正多边形POL–––填充H圆角F倒角CHA–––打断BR分解X合并J–––创建块B插入块I 功能快捷键描述移动M复制CO擦除E修剪TR延伸EX拉伸S镜像MI偏移…...

Spring6梳理12——依赖注入之注入Map集合类型属性

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 12 依赖注入之注入Map集合类型属性 12.1 创建Student类和Teacher类 Student类中创建了run…...

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义&#xff0c;在国内外的研究现状和发展趋势&#xff0c;尚待研究的问题 作用&#xff1a;本课题的目的是使失物招领信息管理清晰化&#xff0c;透明化&#xff0c;便于操作&#xff0c;易于管理。通过功能模…...

推荐4款2024年热门的PDF转ppt工具

有时候&#xff0c;我们为了方便&#xff0c;需要将PDF里面的内容直接转换的PPT的格式&#xff0c;既方便自己演示和讲解&#xff0c;也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话&#xff0c;我可以为大家推荐几个比窘方便实用的PDF转换工具…...

[深度学习]卷积神经网络CNN

1 图像基础知识 import numpy as np import matplotlib.pyplot as plt # 图像数据 #imgnp.zeros((200,200,3)) imgnp.full((200,200,3),255) # 可视化 plt.imshow(img) plt.show() # 图像读取 imgplt.imread(img.jpg) plt.imshow(img) plt.show() 2 CNN概述 卷积层convrelu池…...

从零开始,Docker进阶之路(三):Docker镜像与命令

一、Docker核心名词 镜像文件、容器、仓库 镜像&#xff1a;简单理解为就是一个安装包&#xff0c;里面包含容器所需要运行的基础文件和配置信息&#xff0c;比如&#xff1a;redis镜像、mysql镜像等。 镜像的来源方式&#xff1a; 1.自己做镜像&#xff0c;比如自己开发微服…...

【计算机网络】网络层详解

文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…...

后端开发刷题 | 最小的K个数(优先队列)

描述 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&#xff0c;数组中每个数的大小0≤val≤1000 要…...

【JavaEE】——阻塞队列,生产消费者模型(较难)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;阻塞队列 1&#xff1a;概念 2&#xff1a;阻塞队列与普通队列比较 二&#xff1a;“生…...

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…...

STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器

目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…...

Go语言匿名字段使用与注意事项

1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段&#xff0c;称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式&#xff0c;所以也可以称作嵌套字段。 这种方式可以实现组合复用&#xff0c;即通过匿名字段&#xff0c;结构体…...

2024最新!!Java后端面试题(2)看这一篇就够了

hello uu们 感谢收看&#xff01;&#xff01;&#xff01;&#xff01;我最近听了一首歌《21》&#xff0c;真的很感慨&#xff0c;马上步入20的我也感觉时间真的飞快...望大家都能过上理想的生活&#xff0c;不负内心的所托...现在口语化更新答案&#xff0c;让大家更加模拟的…...

超好用的10款视频剪辑软件,从入门到精通

视频剪辑软件哪款比较好呢&#xff1f;无论是专业制作团队、自媒体创作者&#xff0c;还是家庭用户&#xff0c;一款好用的视频剪辑软件都能极大地提升创作效率和作品质量。以下是十款备受推崇的视频剪辑软件&#xff0c;分别从适用人群、易用程度和功能特点进行介绍。 1.影忆…...

运维实战:Z-Image-Turbo_Sugar脸部Lora模型在Linux生产环境的持续部署与监控

运维实战&#xff1a;Z-Image-Turbo_Sugar脸部Lora模型在Linux生产环境的持续部署与监控 作为一名在AI和智能硬件领域摸爬滚打了十多年的工程师&#xff0c;我见过太多“模型跑得欢&#xff0c;运维跑断腿”的场景。一个模型在开发者的笔记本上可能表现完美&#xff0c;但一旦…...

Qwen3-0.6B-FP8部署与Git工作流结合:AI代码审查助手

Qwen3-0.6B-FP8部署与Git工作流结合&#xff1a;AI代码审查助手 你有没有遇到过这种情况&#xff1f;团队里新来的小伙伴提交了一段代码&#xff0c;语法上挑不出大毛病&#xff0c;但总觉得逻辑有点绕&#xff0c;或者命名风格不太统一。你作为资深开发&#xff0c;想提点建议…...

Switch玩家福音!用LDR6282芯片DIY便携屏,告别充电口盲插烦恼

Switch玩家福音&#xff01;用LDR6282芯片DIY便携屏&#xff0c;告别充电口盲插烦恼 作为一名资深Switch玩家&#xff0c;每次在咖啡厅或朋友家想玩大屏游戏时&#xff0c;最头疼的就是要随身携带底座和一堆线材。直到我发现用LDR6282芯片可以自制支持双C口盲插的便携显示屏&am…...

OpenClaw私有化部署详解:Qwen3-VL:30B+飞书机器人配置

OpenClaw私有化部署详解&#xff1a;Qwen3-VL:30B飞书机器人配置 1. 为什么选择私有化部署 去年我在尝试将AI助手引入团队工作流时&#xff0c;遇到了两个棘手问题&#xff1a;一是敏感数据不敢上传到公有云&#xff0c;二是现有解决方案的响应速度总是不尽如人意。直到发现O…...

力扣链表高频题:两两交换节点 + K个一组翻转链表(保姆级思路+满分代码)

链表翻转、节点交换是力扣的高频必考题型&#xff0c;也是面试手撕链表的常客。今天一次性攻克两道经典题&#xff1a;24. 两两交换链表中的节点和25. K 个一组翻转链表&#xff0c;从思路拆解到代码实现&#xff0c;一步步讲透&#xff0c;新手也能轻松拿捏。 这两道题一脉相承…...

低成本替代方案:OpenClaw+Qwen3-32B镜像实现ChatGPT插件功能

低成本替代方案&#xff1a;OpenClawQwen3-32B镜像实现ChatGPT插件功能 1. 为什么需要本地化插件替代方案 去年我在团队内部推广ChatGPT时&#xff0c;发现一个尴尬现象&#xff1a;每当演示网页摘要或代码解释功能时&#xff0c;总会有人问"这些数据会不会传到OpenAI服…...

检测的毕设领域创新的技术实现路径:从选题到系统落地

最近在辅导学弟学妹做毕设时&#xff0c;发现一个挺普遍的现象&#xff1a;很多同学对“检测”这个方向很感兴趣&#xff0c;想做点有创新的东西&#xff0c;比如智能安防、工业质检或者辅助驾驶。但真动手时&#xff0c;往往卡在几个地方&#xff1a;不知道选哪个模型好&#…...

ThreadX信号量五大使用误区盘点:你的RTOS同步机制真的安全吗?

ThreadX信号量五大使用误区盘点&#xff1a;你的RTOS同步机制真的安全吗&#xff1f; 在嵌入式实时系统开发中&#xff0c;信号量作为最基础的同步机制之一&#xff0c;其重要性不言而喻。ThreadX作为一款商业级RTOS&#xff0c;其信号量实现看似简单&#xff0c;却暗藏诸多陷阱…...

ncmdump智能解析引擎:构建全链路优化的加密文件处理系统

ncmdump智能解析引擎&#xff1a;构建全链路优化的加密文件处理系统 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字内容处理领域&#xff0c;加密文件的高效转换始终是提升工作流效率的关键环节。ncmdump作为一款轻量级开源工…...

Debug神器:C语言assert断言的5个高效用法

C语言assert断言的5个高效调试技巧 调试是每个程序员日常工作中不可避免的环节&#xff0c;而assert断言就像一位沉默的代码卫士&#xff0c;能在关键时刻帮你揪出那些隐藏的bug。不同于普通的打印调试&#xff0c;assert提供了一种更系统化的验证机制&#xff0c;尤其适合处理…...