Mybatis动态sql标签
动态SQL标签简介:
MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。
Mybatis中实现动态sql的标签有: <if> <where> <trim> <set> <choose> <foreach>
示例对象(Student):
package com.ffyc.mybatis.model;public class Student {private Integer id;private Integer num;//建议不使用基本类型,使用包装类型,包装类型默认值都是null,后期判断会方便private String name;private String gender;private Major major;//类与类之间的关联关系 has-a关系 什么有什么,将专业信息封装到专业对象中,减少冗余public Major getMajor() {return major;}public void setMajor(Major major) {this.major = major;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Student{" +"id=" + id +", num=" + num +", name='" + name + '\'' +", gender='" + gender + '\'' +", major=" + major +'}';}
}
<if>标签
判断标签,用于添加判断条件:
当我们查询学生列表时,若是不查询特定名字,则打印所有学生信息,若是要查询特定名字,则我们只需要选择对应名字的学生,示例如下:
Dao:
List<Student> findStudents(Student student);
<select id="findStudents" resultType="Student">select * from student<if test="name!=null">where name = #{name}</if>
</select>-->
<where>标签
判断内部if标签如果有一个返回true,会自动添加一个where关键字,还会自动去除where后多余关键字.
在进行多条件查询时,例如:姓名,编号,性别。若性别为null则只需要查询姓名与编号相同的行,意思就是,几个元素不为null,就加几个判断条件。这时候就可以使用where进行多个条件的判断:
Dao:
List<Student> findStudents(Student student);
<select id="findStudents" resultType="Student">select * from student where<if test="name!=null">name = #{name}</if><if test="num!=0">and num = #{num}</if><if test="gender!=null">and gender = #{gender}</if></select>
很明显,当我们写出来后会发现一个很糟糕的问题,要是传入的name值为null,查询语句:
select * from student where and num=? and gender=?
where后面出现了一个多余的关键字‘and’.
这该怎么解决?
有一种简单而暴力的方法:
<select id="findStudents" resultType="Student">select * from student where 1=1<if test="name!=null">and name = #{name}</if><if test="num!=0">and num = #{num}</if><if test="gender!=null">and gender = #{gender}</if></select>
这样一来,就不会出现where后面出现多余关键字的现象,这也是在<where>标签出现之前程序猿面对这种问题采取的措施。
有人就觉得了:有没有优雅一点的写法?
这时候就到我们<where>标签出场了:
<select id="findStudents" resultType="Student">select * from student<where><if test="name!=null">and name = #{name}</if><if test="num!=0">and num = #{num}</if><if test="gender!=null">and gender = #{gender}</if></where></select>
雅!太雅了!<where>标签会自动添加一个where关键字,还会自动去除where后多余关键字。
<choose>标签
<choose>标签与<when>标签和<otherwise>标签配用用于判定多重条件的语句
应用场景:若传值有名字则查找名字,若没有则查找编号若还是没有则查找名为'kk'的人
Dao:
List<Student> findStudents(Student student);
<select id="findStudents" resultType="Student">select * from student where<choose><when test="name!=null">name=#{name}</when><when test="num!=null">num=#{num}</when><otherwise>name='kk'</otherwise></choose></select>
当传值为:name=“张三” num=1
当传值为: name=null num=1
当传值为: name=null num=null
<trim>标签
当我们需要修改某些数据时,我们可以用到<trim>来删去多余的符号(或关键字)或是添加我们需要的符号(或关键字)
应用场景:修改指定id的某几列
Dao:
void updatestudent(Student student);
<update id="updatestudent" parameterType="student">update student<trim prefix="set" suffixOverrides=","><if test="name!=null">name=#{name},</if><if test="num!=null">num=#{num},</if><if test="gender!=null">gender=#{gender}</if></trim>where id=#{id}</update>
在student后添加“set”,删去最后的“,”.
当传值为:name=op num=1005 id=1
<set>标签
在标签前添加set,将最后的多余的逗号删除
应用场景:与上面的<trim>标签相同,修改指定id的某几列
Dao:
void updatestudent(Student student);
<update id="updatestudent" parameterType="student">update student<set><if test="name!=null">name=#{name},</if><if test="num!=null">num=#{num},</if><if test="gender!=null">gender=#{gender}</if></set>where id=#{id}</update>
<foreach>标签
主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。
item: 定义一个变量,接收每次循环中获得的元素
collection: 循环的集合类型 list-集合 array-数量
open: 循环开始的一个符号
close: 循环结束的一个符号
separator: 每次循环后的一个分隔符号
index: 循环时生成的索引
应用场景:当需要使用到一串相同类型变量时,可以与List或Integer[]搭配使用
(1)当需要删除一组数据时我们可以接收这组数据的id,再用<foreeach>标签循环检索
Dao:
void deleteStudent(List<Integer> list);
或
void deleteStudent(Integer[] array);
<delete id="deleteStudent">delete from student where id in<foreach item="a" collection="list" open="(" close=")" separator=",">#{a}</foreach></delete>
当传值为:[7,8]
(2)查找所有学生的指定信息
Dao:
List<Student> findstudentbycolumn(List<String> list);
<select id="findstudentbycolumn" resultType="student">select<foreach item="a" collection="list" separator=",">${a}</foreach>from student</select>
当传值为:name,num
最后补充一点:
为什么整数类型不用基本类型而是用包装类?
其实基本类型是可以使用的,但是基本类型被定义后默认值为0,而包装类型默认值为null,若是基本类型每次判断需要把!=null换成!=0,这样我们需要判断该变量的初始值是0还是null,而使用包装类就不需要思考,因为和其它变量一样都是null,因此一般使用包装类进行交互。
相关文章:

Mybatis动态sql标签
动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。 Mybatis中实现动态sql的标签有&#x…...

Linux CentOS Suhosin禁用php5.6版本eval函数详细图文教程
方法一:PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错,懒得费时间处理,直接用第二种 方法二:suhosin禁用 服务器只装了一个PHP5.6版本,一…...
这5招底层逆袭玄学,一个人越来越厉害的秘诀
在这个充满机遇与挑战的时代,每个人都渴望能够逆袭成功,摆脱底层的束缚,成为人生赢家。 然而,现实往往是残酷的,许多人在追逐梦想的路上遭遇挫折,甚至迷失了方向。 那么,有没有一些"…...

MySQL自学教程:1. MySQL简介与安装
MySQL简介与安装 一、MySQL简介二、MySQL安装(一)Windows系统上的安装(二)Linux系统上的安装(以Ubuntu为例)(三)Mac OS系统上的安装三、安装后的基本配置四、总结一、MySQL简介 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于各种业务场景,从小型个…...
Jenkins多stage共享同一变量方式
在第一个stage中为这个变量赋值,在其它stage中使用这个变量 import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardCopyOption import groovy.json.JsonOutput import groovy.json.JsonSlurper// 共享的…...

Ant design Vue 表格中显示不同的状态(多条件显示)
比如:后端一个字段有多种状态: 那么后端接口会返回:0 或者 1 或者 2 其中一个,前端需要展示的是对应的文字,像简单的只有两个状态的可以直接在列里面操作: {title: 状态,dataIndex: usable,customRender: …...

如何借助物联网实现土壤监测与保护
如何借助物联网实现土壤监测与保护 高标准农田信息化是指利用现代信息技术,如物联网、大数据、云计算等,对农田进行数字化、智能化的管理,以提高农田的生产效率和可持续发展能力。其中,土壤监测与保护是农田信息化的重要内容之一…...

Linux之prometheus安装和使用简介(一)
一、prometheus简介 普罗米修斯Prometheus是一个开源系统监控和警报工具包,最初构建于SoundCloud。自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立…...
orcle数据表空间操作sql
orcle数据表空间操作sql 1.查询表空间路径: select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.ts#t2.ts#2.删除表空间和空间里的表: drop tablespace LTSYSDATA01 including contents and datafiles;1、表空间的路径、名称查询&…...

【Unity Android】Unity链接安卓手机调试
一、物理连接手机 1.USB数据线链接 2.打开开发者模式 大部分手机在手机设置->系统管理->关于手机->软件版本型号中,点击7次以上,来开启系统管理中的开发者模式选项。 3.打开USB调试 打开开发者模式后,开启USB调试 二、Unity中…...

数据结构与算法笔记:高级篇 - 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?
概述 上篇文章我们讲到,如何用位图、布隆过滤器,来过滤重复数据。本章,我们再讲一个跟过滤相关的问题,如果过滤垃圾短信? 垃圾短信和骚扰电话,我想每个人都收到过吧?买房、贷款、投资理财、开…...

vue3中通过vditor插件实现自定义上传图片、录入echarts、脑图、markdown语法的编辑器
1、下载Vditor插件 npm i vditor 我的vditor版本是3.10.2,大家可以自行选择下载最新版本 官网:Vditor 一款浏览器端的 Markdown 编辑器,支持所见即所得(富文本)、即时渲染(类似 Typora)和分屏 …...

揭示数据库内核的奥秘--手写数据库toadb开源项目
揭示数据库内核的奥秘–手写数据库toadb 数据为王的时代 在信息化时代,数据已成为企业和应用不可或缺的核心,而数据库不仅是数据的仓库,更是支撑业务决策、系统运行的基石。对于求职者而言,掌握数据库知识已成为求职市场上的必考…...
Grafana调整等待时间,避免Gateway timeout报错
使用Grafana的HTTP时,有些即时数据需要运算量与时间,而grafana的默认timeout是30秒,因此需要通过修改配置文件,避免grafana提前中断连接 修改原始配置文件: 删除;调整timeout30为timeout60 # This setting also applies to cor…...
MetaGPT全面指南:多代理协作框架的深入解析与应用
文章目录 理解MetaGPT1.1 MetaGPT的基础1.2 MetaGPT的独特之处1.3 MetaGPT在AI领域的应用 MetaGPT的工作原理2.1 训练2.2 微调2.3 推理2.4 多代理协作的概念2.5 如何分配角色给GPTs2.6 复杂任务的完成过程 实际应用3.1 客户支持3.2 内容创作3.3 教育3.4 医疗保健3.5 在企业中的…...
图的关键路径算法
关键路径算法(Critical Path Method, CPM)是一种用于项目管理和调度的技术,通过分析项目任务的最早开始时间、最晚完成时间和总时差,找出项目中关键的任务路径。这条关键路径决定了项目的最短完成时间,因为关键路径上的…...

模型情景制作-冰镇啤酒
夏日炎炎,当我们在真实世界中开一瓶冰镇啤酒的时候,我们也可以为模型世界中的人物添加一些冰镇啤酒。 下面介绍一种快速酒瓶制造方法,您只需要很少工具: 截取尽量直的流道(传说中的板件零件架),将其夹在您的…...
网页实现黑暗模式的几种方式
## 实现暗黑模式的最佳方式 在现代网页设计中,暗黑模式已成为提高用户体验的重要功能。实现暗黑模式不仅可以减少用户眼睛的疲劳,还能在某些情况下节省设备电量。本文将介绍实现暗黑模式的几种最佳方式。 ### 使用 CSS 变量 (CSS Custom Properties) …...

VMware Workstation环境下,邮件(E-Mail)服务的安装配置,并用Windows7来验证测试
需求说明: 某企业信息中心计划使用IP地址17216.11.0用于虚拟网络测试,注册域名为xyz.net.cn.并将172.16.11.2作为主域名的服务器(DNS服务器)的IP地址,将172.16.11.3分配给虚拟网络测试的DHCP服务器,将172.16.11.4分配给虚拟网络测试的web服务器,将172.16.11.5分配给FTP服务器…...
《信号与系统》复试建议
目录 第一章 绪论 第二章 连续时间系统的时域分析 第三章 傅立叶变换(重点) 第四章 拉普拉斯变换(重点) 第五章 傅立叶变换在通信系统中的应用 第六章 信号的矢量空间分析 第七章 离散时间系统的时域分析 第八章 Z变换与离…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...