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?为什么要用ORM?-CSDN博客 C高级编程(99)面向资源的设计思想(ORM)_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…...
关于大模型的10个思考
9月28日,第四届“青年科学家50论坛”在南方科技大学举行,美国国家工程院外籍院士沈向洋做了《通用人工智能时代,我们应该怎样思考大模型》的主题演讲,并给出了他对大模型的10个思考。 以下是他10个思考的具体内容: 1…...
CFR( Java 反编译器)---> lambda 表达式底层实现机制
一、安装教程 CFR(Class File Reader)是一个流行的Java反编译器,它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程: 下载CFR 访问CFR的官方网站或GitHub仓库:CFR的最新版本和所…...
《C++多态性:开启实际项目高效编程之门》
在 C的广阔编程世界中,多态性是一个强大而富有魅力的特性。它为程序员提供了极大的灵活性和可扩展性,使得代码能够更加优雅地应对复杂的业务需求。在实际项目中,理解和正确应用 C的多态性至关重要,它可以显著提高代码的质量、可维…...
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集合类型属性
以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 12 依赖注入之注入Map集合类型属性 12.1 创建Student类和Teacher类 Student类中创建了run…...
基于SpringBoot校园失物招领系统设计与实现
文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义,在国内外的研究现状和发展趋势,尚待研究的问题 作用:本课题的目的是使失物招领信息管理清晰化,透明化,便于操作,易于管理。通过功能模…...
推荐4款2024年热门的PDF转ppt工具
有时候,我们为了方便,需要将PDF里面的内容直接转换的PPT的格式,既方便自己演示和讲解,也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话,我可以为大家推荐几个比窘方便实用的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核心名词 镜像文件、容器、仓库 镜像:简单理解为就是一个安装包,里面包含容器所需要运行的基础文件和配置信息,比如:redis镜像、mysql镜像等。 镜像的来源方式: 1.自己做镜像,比如自己开发微服…...
【计算机网络】网络层详解
文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…...
后端开发刷题 | 最小的K个数(优先队列)
描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围:0≤k,n≤10000,数组中每个数的大小0≤val≤1000 要…...
【JavaEE】——阻塞队列,生产消费者模型(较难)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 一:阻塞队列 1:概念 2:阻塞队列与普通队列比较 二:“生…...
makefile和CMakeLists/C++包管理器
make 大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢? 我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模…...
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语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段,称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段。 这种方式可以实现组合复用,即通过匿名字段,结构体…...
2024最新!!Java后端面试题(2)看这一篇就够了
hello uu们 感谢收看!!!!我最近听了一首歌《21》,真的很感慨,马上步入20的我也感觉时间真的飞快...望大家都能过上理想的生活,不负内心的所托...现在口语化更新答案,让大家更加模拟的…...
超好用的10款视频剪辑软件,从入门到精通
视频剪辑软件哪款比较好呢?无论是专业制作团队、自媒体创作者,还是家庭用户,一款好用的视频剪辑软件都能极大地提升创作效率和作品质量。以下是十款备受推崇的视频剪辑软件,分别从适用人群、易用程度和功能特点进行介绍。 1.影忆…...
python股票因子,交易所服务器宕机,量化交易程序怎么应对
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法
本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…...
使用nest+typeorm框架写数据库导致mysql的binlog暴增记录
这 两天用nesttypeorm写了一个商城,上线后mysql日志binlog两天就达到了10几个G,排查结果如下: 有个功能是定时遍历所有未签收的订单,看看是否到了自动签收时间,如果到了,就把订单状态设置成已签收。 代码…...
组合逻辑元件与时序逻辑元件
组合逻辑元件和时序逻辑元件都是数字电路中的基本构建块,但它们在功能和结构上存在显著差异。 1. 组合逻辑元件: 内容: 组合逻辑元件的输出仅取决于当前的输入,而与之前的输入无关。 它们没有记忆功能。 常见的组合逻辑元件包括: 与门 (AND…...
天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端
今天给大家带来一款单机游戏的架设:天龙八部怀旧单机微改人面桃花。 另外:本人承接各种游戏架设(单机联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的…...
docker管理
拉取容器镜像 docker pull 镜像名:镜像版本查看镜像 docker images查看容器列表 # 查看正在运行的容器 docker ps # 查看全部的容器(包括停止的容器) docker ps -a进入容器 docker exec -it 容器id /bin/bash停止容器 docker stop 容器id运行容器 docker start 容器id删除…...
electron教程(三)窗口设置
在main.js文件中,创建窗口时会设置窗口的大小,其实还有很多其他属性,可以根据实际需求选择设置,但部分属性存在局限性,官网也有明确告知:自定义窗口 | Electron (electronjs.org) 项目文件目录如下&#x…...
图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)
1. 论文基本信息 论文标题:Deep Retinex Decomposition for Low-Light Enhancement 作者:Chen Wei等 发表时间和期刊:2018;BMVC 论文链接:https://arxiv.org/abs/1808.04560 2. 研究背景和动机 低光照条件下拍摄的…...
2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU
1.配置时间2024/9/25 2.Anaconda-python版本3.7,yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…...
vue-i18n在使用$t时提示类型错误
1. 问题描述 Vue3项目中,使用vue-i18n,在模版中使用$t时,页面可以正常渲染,但是类型报错。 相关依赖版本如下: "dependencies": {"vue": "^3.4.29","vue-i18n": "^9.1…...
装修案例分享的文案/西安seo管理
协程的演变其实早在 Python3.4 的时候就有协程,当时的协程是通过 asyncio.coroutine 和 yeild from 实现的。在一些很老教程中你可能看到的是下面这种形式:import asyncioasyncio.coroutinedef print_hello():print("Hello world!")r yield from asyncio.sleep(1)pr…...
国外购物网站有哪些/优化大师app
1.运用列表生成式,可以写出非常简洁的代码例如:squares []for x in range(10):squares.append(x**2)print squares# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]可以写成如下形式:squares [x**2 for x in range(10)]for循环后面还可以加上if语句…...
哪个网站做网店好/微信朋友圈广告在哪里做
开发的网站中,一些文章列表或新闻列表,需要在标题前放置一个小new.gif小图,标记为是最新的新闻或是文章。今天Insus.NET的练习,就是在asp.net mvc的应用程序中实现这样功能。计划使用三种不同的方法来实现。 先从数据库开始&#…...
织梦网站上传的文章只显示摘要不显示内容如何修改/网站性能优化的方法有哪些
Python提供了众多的PDF支持库,本文是在Python3环境下,试用了两个库来完成PDF的生成的功能。PyPDF对于读取PDF支持较好,但是没找到生成多层PDF的方法。Reportlab看起来更成熟,能够利用Canvas很方便的生成多层PDF,这样就…...
wordpress广告调用/百度浏览官网
目前原生是不能修改的,但是可以通过插件来完美解决。 进入自带插件商店搜索infinity新标签页: 装好后在扩展界面打开,就可以自定义首页背景图了,还能放上常用网站,很完美。 个人博客:https://www.ysboke…...
做的烂的大网站/优化网站广告优化
在多线程中,1.5版本之前,我们都使用同步代码块或者同步方法来解决线程安全问题 比如: 同步代码块 synchronized(锁对象){</p> <pre><code>功能代码; } 同步方法 public synchronized void test(){ 功能…...