MyBatis:动态SQL

文章目录

  • 动态SQL
    • if标签
    • trim标签
    • where标签
    • set标签
    • foreach标签
    • include标签和sql标签

Mybatis动态SQL的官方文档: https://mybatis.net.cn/dynamic-sql.html

动态SQL

动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

if标签

使用场景:在我们数据库表中字段分为必填字段和非必填字段,对与非必填字段数据库会自动帮我们赋值,那如果在添加用户的时候有不确定的字段传入,程序应该如何实现呢?
这个时候就需要使用动态标签来判断了,比如添加的时候性别gender为非必填字段

 <insert id="insertUserByCondition">INSERT INTO user_info (username,age,<if test="gender != null">gender,</if>password)VALUES (#{username},#{age},<if test="gender != null">#{gender},</if>#{password})
</insert>

可不可以不进行判断,直接把字段设置为null呢?
不可以,这种情况下,如果gender字段有默认值,就会设置为默认值
在这里插入图片描述
在这里插入图片描述
测试代码

    @Testvoid insertUserByCondition() {UserInfo userInfo=new UserInfo();userInfo.setUsername("username5");userInfo.setPassword("password5");userInfo.setGender(5);userInfo.setAge(5);userInfoMapperXML.insertUserByCondition(userInfo);}

在这里插入图片描述
不设置gender的参数,也可以进行插入

在这里插入图片描述

在这里插入图片描述
注意:

  1. if标签test中的属性是传入对象中的属性,不是数据库字段
  2. 插入语句中,values中赋值也要有if标签,要一一对应,gender字段中有if标签,values中也要的gender属性也要有if标签

trim标签

标签中有如下属性:
• prefix:表示整个语句块,以prefix的值作为前缀
• suffix:表示整个语句块,以suffix的值作为后缀
• prefixOverrides:表示整个语句块要去除掉的前缀
• suffixOverrides:表示整个语句块要去除掉的后缀

trim标签的使用
sql语句

insert into user_info ( username, password, age, gender ) values("username5","password5",5,5)
     insert into user_info<trim suffixOverrides="," prefix="(" suffix=")"><if test="username!=null">username,</if><if test="password!=null">password,</if><if test="age!=null">age,</if><if test="gender!=null">gender</if></trim>values (<trim  suffixOverrides="," prefix="(" suffix=")"><if test="username!=null">#{username},</if><if test="password!=null">#{password},</if><if test="age!=null">#{age},</if><if test="gender!=null">#{gender}</if></trim>)</insert>

测试代码

  @Testvoid insertUserByCondition() {UserInfo userInfo=new UserInfo();userInfo.setUsername("username5");userInfo.setPassword("password5");userInfo.setGender(5);userInfo.setAge(5);userInfoMapperXML.insertUserByCondition(userInfo);}

在这里插入图片描述

where标签

看下⾯这个场景,系统会根据我们的筛选条件,动态组装where条件

在这里插入图片描述
这个是怎么实现的呢?通过where标签

举个例子
sql语句:

select* from user_info where age=1 and gender =2
  <select id="selectByCondition" resultType="com.example.demo.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time,update_timefrom user_info where<if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if></select>

当if标签有一个或两个不符合条件的时候,会报错,这时候where标签就派上用场了

<select id="selectByCondition" resultType="com.example.demo.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time,update_timefrom user_info where<where><if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if></where></select>

测试代码

    @Testvoid selectByCondition() {UserInfo userInfo=new UserInfo();userInfo.setAge(16);userInfoMapperXML.selectByCondition(userInfo);}

在这里插入图片描述
where标签只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR

set标签

sql

update user_info set password="123" ,gender= 4 where id=34
<update id="updateUser2">update user_info set<if test="username!=null">username=#{username}</if><if test="password!=null">,password=#{password}</if><if test="gender!=null">,gender=#{gender}</if>where  id=#{id}</update>

如果我们写出这样的xml文件,当我们的username为null时,sql语法错误,多了一个逗号

下面是报错信息
在这里插入图片描述
set标签会删除额外的逗号,并把set插入sql语句中

 <update id="updateUser2">update user_info<set><if test="username!=null">username=#{username}</if><if test="password!=null">,password=#{password}</if><if test="gender!=null">,gender=#{gender}</if></set>where  id=#{id}</update>

测试代码

@Testvoid updateUser2() {UserInfo userInfo=new UserInfo();userInfo.setPassword("123");userInfo.setGender(4);```javauserInfo.setId(34);userInfoMapperXML.updateUser2(userInfo);}

在这里插入图片描述

foreach标签

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集在这里插入代码片合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符!

foreach 标签有如下属性:

collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
item:遍历时的每⼀个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
举个例子:批量查询id为12,13,14的数据

sql:

 select * from user_info where id in ( 12 , 13 ,14)
<select id="selectUserByIds" resultType="com.example.demo.model.UserInfo">select * from user_info where id in<foreach collection="ids" item="id"  separator="," open="(" close=")">#{id}</foreach></select>

测试代码

    @Testvoid selectUserByIds() {List<Integer> ids=new ArrayList<>();ids.add(12);ids.add(13);ids.add(14);userInfoMapperXML.selectUserByIds(ids);}

在这里插入图片描述
需求:批量删除id为12,13,14的数据

<delete id="deleteByIds">delete from user_info where id in<foreach collection="ids" item="id" separator="," open="(" close=")" >#{id}</foreach></delete>

测试代码

 @Testvoid deleteByIds() {List<Integer> ids=List.of(12,13,14);userInfoMapperXML.deleteByIds(ids);}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

include标签和sql标签

在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码
在这里插入图片描述

sql 标签: 定义可重用的SQL片段
include 标签:通过属性refid,指定包含的SQL片段

   <sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time</sql><select id="selectAll" resultType="com.example.demo.model.UserInfo">SELECT<include refid="allColumn"></include>FROM `user_info`</select>

测试代码

  @Testvoid selectAll() {userInfoMapperXML.selectAll().stream().forEach(x-> System.out.println(x));}

在这里插入图片描述

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

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

相关文章

Java - Junit框架

单元测试&#xff1a;针对最小的功能单元(方法)&#xff0c;编写测试代码对该功能进行正确性测试。 Junit&#xff1a;Java语言实现的单元测试框架&#xff0c;很多开发工具已经集成了Junit框架&#xff0c;如IDEA。 优点 编写的测试代码很灵活&#xff0c;可以指某个测试方法…

学生成绩管理系统Java实战(Spring Boot+MyBatis Plus)

文章目录 一、系统需求分析&#xff08;避坑指南&#xff09;二、技术选型&#xff08;2024新版&#xff09;三、数据库设计&#xff08;三大核心表&#xff09;1. 学生表&#xff08;student&#xff09;2. 课程表&#xff08;course&#xff09;3. 成绩表&#xff08;score&a…

MySQL安装实战指南:Mac、Windows与Docker全平台详解

MySQL作为世界上最流行的开源关系型数据库&#xff0c;是每位开发者必须掌握的基础技能。本指南将手把手带你完成三大平台的MySQL安装&#xff0c;从下载到配置&#xff0c;每个步骤都配有详细说明和截图&#xff0c;特别适合新手学习。 一、Mac系统安装MySQL 1.1 通过Homebre…

多模态大语言模型arxiv论文略读(七十九)

AIM: Let Any Multi-modal Large Language Models Embrace Efficient In-Context Learning ➡️ 论文标题&#xff1a;AIM: Let Any Multi-modal Large Language Models Embrace Efficient In-Context Learning ➡️ 论文作者&#xff1a;Jun Gao, Qian Qiao, Ziqiang Cao, Zi…

[Harmony]封装一个可视化的数据持久化工具

1.添加权限 在module.json5文件中添加权限 // 声明应用需要请求的权限列表 "requestPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC", // 权限名称&#xff1a;分布式数据同步权限"reason": "$string:distrib…

利用html制作简历网页和求职信息网页

前言 大家好&#xff0c;我是maybe。今天下午初步学习了html的基础知识。做了两个小网页&#xff0c;一个网页是简历网页&#xff0c;一个网页是求职信息填写网页。跟大家分享一波~ 说明:我不打算上传图片。所以如果有朋友按照我的代码运行网页&#xff0c;会出现一个没有图片…

Vue 3 实现后端 Excel 文件流导出功能(Blob 下载详解)

&#x1f4a1; 本文以告警信息导出为例&#xff0c;介绍 Vue 3 中如何通过 Axios 调用后端接口并处理文件流&#xff0c;实现 Excel 自动下载功能。 &#x1f4d1; 目录 一、前言 二、后端接口说明 三、前端实现思路 四、导出功能完整代码 五、常见问题处理 六、效果展示 …

HarmonyOS AVPlayer 音频播放器

鸿蒙文档中心&#xff1a;使用AVPlayer播放视频(ArkTS)文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback 这张图描述的是 HarmonyOS AVPlayer 音频播放器的状态流转过程&#xff0c;展示了 AVPlayer 在不同状态之间的切换条件和关键操作…

Java面试场景:从音视频到AI应用的技术探讨

面试场景&#xff1a;音视频与AI应用技术的碰撞 在某互联网大厂的面试中&#xff0c;面试官王先生与求职者明哥展开了一场关于音视频技术与AI应用的对话。 第一轮提问&#xff1a;音视频场景 面试官&#xff1a;明哥&#xff0c;你能谈谈在音视频场景中&#xff0c;Spring B…

【深度学习】残差网络(ResNet)

如果按照李沐老师书上来&#xff0c;学完 VGG 后还有 NiN 和 GoogLeNet 要学&#xff0c;但是这两个我之前听都没听过&#xff0c;而且我看到我导师有发过 ResNet 相关的论文&#xff0c;就想跳过它们直接看后面的内容。 现在看来这不算是不踏实&#xff0c;因为李沐老师说如果…

Vue3学习(组合式API——父、子组件间通信详解)

目录 一、组合式API下的父组件传子组件。(自定义属性) &#xff08;1&#xff09;基本思想。 &#xff08;2&#xff09;核心注意点。(defineProps) &#xff08;3&#xff09;传递简单类型数据。 &#xff08;4&#xff09;传递对象类型数据。(v-bind"对象类型数据"…

W5500使用ioLibrary库创建TCP客户端

1、WIZnet全硬件TCP/IP协议栈 WIZnet全硬件TCP/IP协议栈,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE协议。 以太网&#xff1a;支持BSD和WIZCHIP&#xff08;W5500/W5300/W5200/W5100/W5100S&#xff09;的SOCKET APIs驱动程序。 互联网&#xff1a; DHCP客户端 DNS客户端 FTP客…

管理Oracle Data Guard的最佳实践

Oracle Data Guard的中文名字叫数据卫士&#xff0c;顾名思义&#xff0c;它是生产库的一道保障。所以管理Data Guard是DBA的一项重要工作之一&#xff0c;管理Data Guard时主要有以下几个注意点需要引起重视。 备份库的归档日志积压 一般情况下&#xff0c;生产库的归档日志是…

BootCDN介绍(Bootstrap主导的前端开源项目免费CDN加速服务)

文章目录 BootCDN前端开源项目CDN加速服务全解析什么是BootCDN技术原理与架构CDN技术基础BootCDN架构特点1. 全球分布式节点网络2. 智能DNS解析系统3. 高效缓存管理机制4. 自动同步更新机制5. HTTPS和HTTP/2协议支持 BootCDN的核心优势速度与稳定性开源免费资源丰富度技术规范遵…

2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用

一、controller调用 /*** 登录** author jiaketao* since 2024-04-10*/ RestController RequestMapping("/login") public class LoginController {/*** 【小程序】登录获取session_key和openid** param code 前端传code* return*/GetMapping("/getWXSessionKe…

软件架构风格系列(3):管道 - 过滤器架构

文章目录 前言一、从生活场景到架构原理&#xff0c;看懂管道 - 过滤器的核心逻辑&#xff08;一&#xff09;什么是管道 - 过滤器架构&#xff1f;&#xff08;二&#xff09;核心组件拆解 二、架构设计图&#xff1a;一图看懂管道 - 过滤器架构全貌三、Java 示例代码&#xf…

【VIM】vim 常用命令

文章目录 插入模式光标移动拷贝/粘贴/删除/撤销块操作分屏代码缩进命令组合使用其他PowerVim 前言&#xff1a;本文内容大部分摘抄自酷壳和博客园   –   CoolShell – 陈皓   博客园 – 易先讯 插入模式 a → 在光标后插入o → 在当前行后插入一个新行O → 在当前行前插…

polarctf-web-[简单rce]

考点&#xff1a; (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源&#xff1a;Polarctf-web-[简单rce] 解题&#xff1a; 代码审计 <?php/*​PolarD&N CTF​*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs开发之———使用HTTP访问网络资源

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———Video组件的使用:HarmonyOs开发之———Video组件的使用_华为 video标签查看-CSDN博客 HarmonyOS 网络开发入门&#xff1a;使用 HTTP 访问网络资源 HarmonyOS 作为新一代智能终端…

Vue 图片预览功能(含缩略图)

众所周知&#xff0c;常见的组件库如Element、Ant Design&#xff0c;自带的图片预览功能都没有缩略图&#xff0c;所以 需要单独封装一个图片预览的服务。 第三方库&#xff1a;v-viewer 安装&#xff1a; npm install v-viewer viewerjs 若使用报错&#xff0c;可安装指定…