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变换与离…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...
