spring和Mybatis的动态sql

文章目录

    • 九、动态sql
      • 9.1、if
      • 9.2、where
      • 9.3 trim
      • 9.4、choose、when、otherwise
      • 9.5、foreach
      • 9.6、sql片段

九、动态sql

MyBatis框架的动态sql技术,是一种根据特定条件动态拼装sql语句的功能,它存在的意义是为了解决拼接sql语句字符串的痛点问题

9.1、if

if标签可以通过test属性的表达式进行判断,如果表达的结果为true,则标签内的内容会执行;反之不会被执行

/*** 根据条件查询员工信息* @param emp* @return*/
List<Emp> getEmpByCondition(Emp emp);
<!--List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="emp">select * from emp where 1=1<if test="empName != null and empName !=''">and emp_name = #{empName}</if><if test="age != null and age !=''">and age = #{age}</if><if test="sex != null and sex !=''">and sex = #{sex}</if>
</select>
@Test
public void testGetEmpByCondition(){Emp emp = new Emp(null,null,22,null);List<Emp> emps = empMapper.getEmpByCondition(emp);emps.forEach(System.out::println);
}

9.2、where

where和if一般是结合使用

  1. 如果where标签中的if条件满足,则where标签会自动添加where关键字
  2. 会自动将条件最前方多余的and去掉,注意:where标签不能去掉条件最后多余的and
  3. 如果where标签中的if条件都不满足,则where标签没有任何功能,则不添加where关键字
<!-- List<Emp> getEmpByCondition(Emp emp);-->
<select id="getEmpByCondition" resultType="emp">select * from emp<where><if test="empName != null and empName !=''">emp_name = #{empName} </if><if test="age != null and age !=''">and age = #{age} and</if><if test="sex != null and sex !=''">and sex = #{sex}</if></where>
</select>

9.3 trim

trim用于去掉或者添加标签中的内容

<!-- List<Emp> getEmpByCondition(Emp emp);-->
<!--prefix:在trim标签中的内容的前面添加某些内容prefixOverrides:在trim标签中的内容的前面去掉某些内容suffix:在trim标签中的内容的后面添加某些内容suffixOverrides:在trim标签中的内容的后面去掉某些内容
-->
<select id="getEmpByCondition" resultType="emp">select * from emp<trim prefix="where"  prefixOverrides="and"><if test="empName != null and empName !=''">emp_name = #{empName}</if><if test="age != null and age !=''">and age = #{age}</if><if test="sex != null and sex !=''">and   sex = #{sex}</if></trim>
</select>

9.4、choose、when、otherwise

choose、when、otherwise相当于if …else if…else

<!-- List<Emp> getEmpByChoose(Emp emp);-->
<select id="getEmpByChoose" resultType="emp">select * from emp<where><choose><when test="empName != null and empName !=''">emp_name = #{empName}</when><when test="age != null and age !=''">and age = #{age}</when><when test="sex != null and sex !=''">and sex = #{sex}</when></choose></where>
</select>

9.5、foreach

循环:批量,有规律

⑴批量的添加

/*** 批量添加员工信息* @param emps*/
void insertMoreEmp(@Param("emps") List<Emp> emps);
<!--collection:设置要循环的数组或者集合separator:设置每次循环的数据之间的分隔符index:用一个字符串表示数组或者集合中的每一个下标item:用一个字符串表示数组或者集合中的每一个数据open:循环的所有内容以什么开始close:循环的所有内容以什么结束
-->
<!--void insertMoreEmp(@Param("emps") List<Emp> emps);-->
<insert id="insertMoreEmp">insert into emp values<foreach collection="emps" item="emp" separator="," >(null,#{emp.empName},#{emp.age},#{emp.sex})</foreach>
</insert>
@Test
public void testInsertMoreEmp(){Emp emp1 = new Emp(null,"小明",22,"男");Emp emp2 = new Emp(null,"小红",22,"男");Emp emp3 = new Emp(null,"小马",22,"男");List<Emp> emps = Arrays.asList(emp1,emp2,emp3);empMapper.insertMoreEmp(emps);
}

⑵批量删除

第一种

/*** 批量删除员工信息* @param empIds* @return*/
Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);
<!--Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">delete from emp where emp_id in(<foreach collection="empIds" item="empId" separator=",">#{empId}</foreach>)
</delete>
@Test
public void testDeletMoreEmp(){Integer[] empIds = new Integer[]{10,11,12};Integer integer = empMapper.deleteMoreEmp(empIds);if(integer>0){System.out.println("删除成功");}else {System.out.println("删除失败");}
}

第二种

<!--Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">delete from emp where emp_id in<foreach collection="empIds" item="empId" separator="," open="(" close=")">#{empId}</foreach>
</delete>

第三种

<!--Integer deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
<delete id="deleteMoreEmp">delete from emp where<foreach collection="empIds" item="empId" separator="or" >emp_id = #{empId}</foreach>
</delete>

9.6、sql片段

sql片段,可以记录一段公共的sql语句片段,在使用的地方通过include标签进行引入

<!--sql片段-->
<sql id="empColumns">emp_name,age,sex
</sql>

引用

<include refid="empColumns"></include>

{empId}

### 9.6、sql片段**sql片段,可以记录一段公共的sql语句片段,在使用的地方通过include标签进行引入**```xml
<!--sql片段-->
<sql id="empColumns">emp_name,age,sex
</sql>

引用

<include refid="empColumns"></include>

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

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

相关文章

LabVIEW开发实验室超导体电流特性测试系统

本系统旨在为学校实验室提供一个基于LabVIEW的超导体电流特性测试平台&#xff0c;通过精确测量超导体在不同温度和电流条件下的电学特性&#xff0c;帮助学生和研究人员深入理解超导体的物理性质。本文将从背景、目标、工作原理、使用方法、操作流程和注意事项等方面详细介绍该…

汇编语言作业(六)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、实验总结 一、实验目的 掌握加减法运算指令对各状态标志位的影响及测试方法掌握汇编语言长整数的加法的操作方法 二、实验内容 对于以下几组数&#xff0c; 087H和034H 0C2H和5FH 0F3H和0F3H&am…

「网络原理」三次握手四次挥手

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 三次握手&四次挥手 &#x1f349;连接管理&#x1f34c;三次握手&#x1f34c;意义&#x1f34c;四次挥手&#x1f34c;TCP 状态转换…

【web本地存储】storage事件,StorageEvent对象介绍

storage事件 Web Storage API 内建了一套事件通知机制&#xff0c;当存储区域的内容发生改变&#xff08;包括增加、修改、删除数据&#xff09;时&#xff0c;就会自动触发storage事件&#xff0c;并把它发送给所有感兴趣的监听者&#xff0c;因此&#xff0c;如果需要跟踪存…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要&#xff1a;本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富&#xff0c;本文分享终篇状态报错与启停慢篇&#xff0c;主要分为以下四个部分&#xff1a; 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

creo学习一

设置好当前配置后&#xff0c;导出config配置文件&#xff0c;并覆盖掉此路径下的旧文件&#xff0c;使得新配置永久生效&#xff0c;这样每次打开软件都是新配置的设置&#xff1a; 系统颜色的导出&#xff1a; 打开版本的问题&#xff1a; 不能有弱尺寸&#xff1a; 注意&a…

分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言 日志在软件开发中扮演着非常重要的角色&#xff0c;通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息&#xff0c;帮助在调试和排查问题时更快速地定位和解决 Bug。 通过日志&#xff0c;我们可以做到&#xff1a; 故障排除和调试&#xff…

【经验总结】ECU休眠后通过一帧NM报文唤醒ECU后在要求时间内通过第二帧NM报文需要唤醒网络

目录 前言 环境 1.需求描述 2.测试方法 3.完成需求的方法 4.原理详解 4.1 CanTrcv 接收到第一帧NM报文 4.2 EcuM接收到唤醒事件 4.3 CanTcv接收到第二帧NM报文 4.4 EcuM完成唤醒源校验 5. 总结 前言 关于CAN收发器参与下的ECU休眠唤醒问题我们已经写过很多文章,&l…

【C#/C++】C++定义一个返回uchar*的函数,调用函数时接收的数据异常

C定义一个返回uchar*的函数&#xff0c;调用函数时接收的数据异常 1、场景2、错误代码3.正确写法 1、场景 我是想实现一个图像畸变矫正的函数&#xff0c;由于相机的硬件原因&#xff08;相机内外参数&#xff0c;视野&#xff09;会导致我们取到的图有一定程度的畸变&#xff…

Reinforcement Learning学习(三)

前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…

MySQL普通表转换为分区表实战指南

码到三十五 &#xff1a; 个人主页 引言 本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势&#xff0c;不仅能大幅提升查询速度&#xff0c;还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应…

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼&#xff1f;DjangoBlog性能优化大揭秘&#xff0c;让你的网站速度飞跃提升&#xff01;本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术&#xff0c;更有Gunicorn和Nginx的黄金搭档&#xff0c;让你的博客部署如虎添翼。无论你…

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口&#xff0c;这个端口关了&#xff0c;但是没有更详细信息了 我用nmap扫了一下我的这个端口&#xff0c;发现主机是活跃的&#xff0c;但是有防火墙&#xff0c;我们列出云服务器上面的这个防火墙list&#xff0c;发现确实没有5566端口 参考&a…

大数据解决方案案例:电商平台日志分析

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

AI作画工具介绍

目录 1.概述 2.Stable Diffusion 2.1.诞生背景 2.2.版本历史 2.3.优点 2.4.缺点 2.5.应用场景 2.6.未来展望 3.Midjourney 3.1.诞生背景 3.2.版本历史 3.3.优点 3.4.缺点 3.5.应用场景 3.6.未来展望 4.总结 1.概述 AI作画工具是一种运用人工智能技术&#xff…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

require.context()函数介绍

业务需求&#xff1a; 前端Vue项目怎样读取src/assets目录下所有jpg文件 require.context()方法来读取src/assets目录下的所有.jpg文件 <template><div><img v-for"image in images" :src"image" :key"image" /></div> …

代码随想录打卡第一天(补)

数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 704. 二分查找 最简单的二分思想的应用&#xff0c;主要锻炼写两种方法 两种方法的区别就是&#xff1a;右指针的每次变化&#xff0c;可能还有就是最后找到目标值后的一个下标到底是什么 二分思想&#xff1…

Python实现Stack

你好&#xff0c;我是悦创。 Python 中的栈结构是一种后进先出&#xff08;LIFO, Last In, First Out&#xff09;的数据结构&#xff0c;这意味着最后添加到栈中的元素将是第一个被移除的。栈通常用于解决涉及到反转、历史记录和撤销操作等问题。在 Python 中&#xff0c;你可…

九、C语言:隐式类型转换(整型提升与算数转换)

一、隐式类型转换 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 二、整型提升 //1.表达式的整型运算要在CPU的相应运算器件内执行&#xff…