MyBatis动态SQL(Dynamic SQL)

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
实际开发中可以通过以下几种标签进行动态SQL拼接。

1 if标签

根据test属性所对应的表达式计算结果决定标签中的内容是否拼接到sql中。

@Test
public void dynamicSqlMapperTest(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();DynamicSqlMapper dynamicSqlMapper = sqlSession.getMapper(DynamicSqlMapper.class);List<Emp> empList = dynamicSqlMapper.queryEmpList(new Emp(null, "张三", "", "男", null));System.out.println(empList);
}
List<Emp> queryEmpList(Emp emp);
<select id="queryEmpList" resultType="Emp">select * from t_empwhere 1=1<if test="userName != null and userName != ''">and user_name = #{userName}</if><if test="passWord != null and passWord != ''">and pass_word = #{passWord}</if><if test="sex != null and sex != ''">and sex = #{sex}</if>
</select>

2 where标签

  • 当where标签中有内容时,会自动生成where关键字,并将内容前多余的and或or去掉;
  • 当where标签中没有内容时,不会生成where关键字,也即不会拼接条件语句;
  • 注意:where标签不能去掉内容后多余的and或or
List<Emp> queryEmpListUsingWhereTag(Emp emp);
<select id="queryEmpListUsingWhereTag" resultType="Emp">select * from t_emp<where><if test="userName != null and userName != ''">and user_name = #{userName}</if><if test="passWord != null and passWord != ''">and pass_word = #{passWord}</if><if test="sex != null and sex != ''">and sex = #{sex}</if></where>
</select>

3 trim标签

<trim prefix="where" suffix="" prefixOverrides="" suffixOverrides="and|or"> </trim>
  • 若标签中有内容,则
    •  prefix|suffix用于设定在trim标签中的内容前面或后面添加指定的内容
      
    •  prefixOverrides|suffixOverrides: 用于设定将trim标签中的内容前面或后面去掉指定的内容
      
  • 若标签中没有内容,则trim标签没有任何效果
List<Emp> empList = dynamicSqlMapper.queryEmpList(new Emp(null, "张三丰", "", "男", null));
List<Emp> queryEmpListUsingTrimTag(Emp emp);
<select id="queryEmpListUsingTrimTag" resultType="Emp">select * from t_emp<trim prefix="where" suffixOverrides="and|or"><if test="userName != null and userName != ''">user_name = #{userName} and</if><if test="passWord != null and passWord != ''">pass_word = #{passWord} and</if><if test="sex != null and sex != ''">sex = #{sex} and</if></trim>
</select>

4 choose-when-otherwise标签

相当于if-else if-else,when至少有一个,otherwise最多有一个成立。

List<Emp> empList = dynamicSqlMapper.queryEmpListUsingChooseWhenTag(new Emp(null, "张三丰", "", "男", null));
List<Emp> queryEmpListUsingChooseWhenTag(Emp emp);
<select id="queryEmpListUsingChooseWhenTag" resultType="Emp">select * from t_emp<where><choose><when test="userName != null and userName != ''">user_name = #{userName}</when><when test="passWord != null and passWord != ''">pass_word = #{passWord}</when><when test="sex != null and sex != ''">sex = #{sex}</when><otherwise>dept_id = 1</otherwise></choose></where>
</select>

5 foreach标签

     collection: 设置需要循环的数组或集合item:表示数组或集合中的每一个数据separator: 循环体之间的分隔符open: foreach循环的所有内容的开始字符close: foreach循环的所有内容的结束字符
  • 批量新增
Emp emp1 = new Emp(null, "张三1", "123", "男", null);
Emp emp2 = new Emp(null, "张三2", "123", "男", null);
Emp emp3 = new Emp(null, "张三3", "123", "男", null);
Emp emp4 = new Emp(null, "张三4", "123", "男", null);
Emp emp5 = new Emp(null, "张三5", "123", "男", null);
Emp emp6 = new Emp(null, "张三6", "123", "男", null);
List<Emp> empList = Arrays.asList(emp1, emp2, emp3, emp4, emp5, emp6);
int i = dynamicSqlMapper.batchInsertEmpUsingForeach(empList);
int batchInsertEmpUsingForeach(@Param("empList") List<Emp> empList);
<insert id="batchInsertEmpUsingForeach">insert into t_emp values<foreach collection="empList" item="emp" separator=",">(null, #{emp.userName}, #{emp.passWord}, #{emp.sex}, null)</foreach>
</insert>
  • 批量删除
@Test
public void batchDeleteEmpUsingForeachTest(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();DynamicSqlMapper dynamicSqlMapper = sqlSession.getMapper(DynamicSqlMapper.class);int i = dynamicSqlMapper.batchDeleteEmpUsingForeach(Arrays.asList("6","7","8"));System.out.println(i);
}
int batchDeleteEmpUsingForeach(@Param("empIdList") List<String> empIdList);
<delete id="batchDeleteEmpUsingForeach">delete from t_emp where id in<foreach collection="empIdList" item="empId" separator="," open="(" close=")">#{empId}</foreach>
</delete>

6 sql标签

6.1 使用方式一

定义一:

<sql id="commonColumnId">id, user_name, pass_word, sex, dept_id</sql>

使用方式一:

<include refid="commonColumnId"></include>
@Test
public void sqlSegmentTest(){SqlSession sqlSession = SqlSessionUtil.getSqlSession();DynamicSqlMapper dynamicSqlMapper = sqlSession.getMapper(DynamicSqlMapper.class);List<Emp> empList = dynamicSqlMapper.queryAllEmpInfo();System.out.println(empList);
}
List<Emp> queryAllEmpInfo();
<sql id="commonColumnId">id, user_name, pass_word, sex, dept_id</sql>
<select id="queryAllEmpInfo" resultType="Emp">select<include refid="commonColumnId"></include>fromt_emp
</select>
6.2 使用方式二

定义二:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

使用方式二:

<include refid="userColumns"><property name="alias" value="t1"/></include>

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

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

相关文章

基于SpringBoot+JSP+Mysql宠物领养网站+协同过滤算法推荐宠物(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

《C++新经典设计模式》之第15章 适配器模式

《C新经典设计模式》之第15章 适配器模式 适配器模式.cpp 适配器模式.cpp #include <iostream> #include <vector> #include <string> #include <fstream> #include <memory> using namespace std;// 解决两个类之间的兼容性问题 // 转换接口调…

ffmpeg6.0之ffprobe.c源码分析二-核心功能源码分析

本篇我们继续分析: 1、ffprobe -show_packets 参数的处理流程;2、ffprobe -show_frames 参数的处理流程;3、ffprobe -show_streams 参数的处理流程;4、ffprobe -show_format 参数的处理流程; 因为前面的文章已经回顾了这些命令的使用,以及作用。本文就不在赘述,以免篇幅…

《妙趣横生的算法》(C语言实现)- 第5章 数学趣题(一)

《妙趣横生的算法》&#xff08;C语言实现&#xff09;-第5章 数学趣题&#xff08;一&#xff09; 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文…

“新华三杯”第十届成都信息工程大学ACM程序设计竞赛(同步赛)L. 怎么走啊(最短路+二分 分段函数)

题目 登录—专业IT笔试面试备考平台_牛客网 思路来源 衡阳师范学院ac代码、pj学弟 题解 大致可以证明&#xff0c;在w从1e5减小到1的过程中&#xff0c; 之前某条反向边没有用到&#xff0c;现在需要用到反向边&#xff0c;也就是正向边用到的变少了 这样的变化有sqrt个&a…

分层网络模型(OSI、TCP/IP)及对应的网络协议

OSI七层网络模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连参考模型&#xff0c; 一般都叫OSI参考模型&#xff0c;是ISO组织于1985年研究的网络互连模型。OSI是分层的体系结构&#xff0c;每一层是一个模块&#xff0c;用于完成某种功…

服务器GPU占用,kill -9 PID 用不了,解决办法

PID&#xff08;progress ID 进程ID&#xff09; 上图为占用情况&#xff0c;使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法&#xff0c;一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…

【Hexo】自动在中英文之间添加空格

本文首发于 ❄️慕雪的寒舍 如题&#xff0c;中英文添加空格是比较规范的写法&#xff0c; 但是我个人实在是懒&#xff0c;每次都要这么弄太累了。想找找hexo有没有对应的插件&#xff0c;还是有的 npm install hexo-filter-auto-spacing --save安装了之后&#xff0c;在hexo的…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

iOS使用CoreText完成txt阅读器

CoreText是一个高效处理字符和字形转换和进行文字排版的框架&#xff0c;API基于C语言。 常见的CoreText类介绍 &#xff08;1&#xff09;、CFAttributedStringRef 属性字符串&#xff0c;用于存储需要绘制的文字字符和字符属性 &#xff08;2&#xff09;、CTFramesetterR…

【原创】录剪视频的折腾之路

制作视频的起因 本人为IT男&#xff0c;IT发展快&#xff0c;需要学习的东西又多。往往为了一个技术小问题&#xff0c;花好几天时间学习&#xff0c;接下来十来分钟把事情做完。下次遇到这个同样的问题的时候&#xff0c;可能是几个月后&#xff0c;甚至是几年以后了。这些技…

微信小程序页面跳转方法

文章目录 前言方式一&#xff1a;wx.navigateTo方式二&#xff1a;wx.redirectTo方式三&#xff1a;wx.reLaunch方式四&#xff1a;wx.switchTab方式五&#xff1a;wxml中navigator标签跳转页面回退 前言 微信小程序页面跳转的各种方法总结&#xff0c;备查。 方式一&#xff…

汽车连接器

汽车连接器 电子元器件百科 文章目录 汽车连接器前言一、汽车连接器是什么二、汽车连接器的类别三、汽车连接器的应用实例四、汽车连接器的作用原理总结前言 汽车连接器通常需要具备防水、防尘、耐高温等特性,以适应汽车恶劣的工作环境。它们的设计和连接方式也各不相同,以适…

JVM 内存分析工具 Memory Analyzer Tool(MAT)的深度讲解

目录 一. 前言 二. MAT 使用场景及主要解决问题 三. MAT 基础概念 3.1. Heap Dump 3.2. Shallow Heap 3.3. Retained Set 3.4. Retained Heap 3.5. Dominator Tree 3.6. OQL 3.7. references 四. MAT 功能概述 4.1. 内存分布 4.2. 对象间依赖 4.3. 对象状态 4.4…

鸿蒙前端开发-构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Serv…

docker-compose安装教程

1.确认docker-compose是否安装 docker-compose -v如上图所示表示未安装&#xff0c;需要安装。 如上图所示表示已经安装&#xff0c;不需要再安装&#xff0c;如果觉得版本低想升级&#xff0c;也可以继续安装。 2.离线安装 下载docker-compose安装包&#xff0c;上传到服务…

uniapp小程序分享为灰色

引用&#xff1a;https://www.cnblogs.com/panwudi/p/17074172.html uniapp开发的微信小程序&#xff0c;没有转发&#xff0c;分享&#xff1a; 创建一个mixin:common/share.js export default {onShareAppMessage(res) { //发送给朋友return {}},onShareTimeline(res) {//…

人工智能原理复习--机器学习

文章目录 上一篇机器学习概述归纳(示例)学习ID3决策树算法K近邻算法下一篇 上一篇 人工智能原理复习–搜索策略&#xff08;二&#xff09; 机器学习概述 学习系统的基本结构&#xff1a; #mermaid-svg-JMjIZHjVOirLolvu {font-family:"trebuchet ms",verdana,ari…

辨析旅行商问题(TSP)与车辆路径问题(VRP)

目录 前言旅行商问题 (TSP)问题介绍数学模型符号定义问题输入约束条件目标函数问题输出 解的空间解空间大小计算解释 车辆路径问题 (VRP)问题介绍TSP到VRP的过渡数学模型符号定义问题输入约束条件优化目标问题输出 解空间特殊情况一般情况 TSP 与 VRP 对比 前言 计划是通过本文…

基于JavaWeb+SSM+Vue助农扶贫微信小程序系统的设计和实现

基于JavaWebSSMVue助农扶贫微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图 源码获取入口 Lun文目录 目 录 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环境与技术 3 2.1 JSP技术 3 2.2 MySQL数据库 3 2.3 Java…