MyBatis操作数据库 -- 动态SQL


在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|Spring

🫵 与天斗其乐无穷

文章目录

    • 1. 动态SQL
      • <if>标签
      • <trim>标签
      • <where> 标签
      • <set> 标签
      • <foreach> 标签
      • <include>标签
      • 注解方式


1. 动态SQL

动态sql能够实现不同条件下的sql拼接

标签

我们在新增数据的时候,有时候要指定列赋值

INSERT INTO userinfo (username,`password`) VALUES (?,?)INSERT INTO userinfo (username,`password`) VALUES (?,?,?)

大多数情况需要我们根据参数的个数完善sql语句
这时候就要使用动态标签来判断了:

<insert id="insertUser">insert into userinfo (username,`password`,age,<if test="gender != null">gender,</if><if test="phone != null">phone</if>)values (#{username},#{password},#{age},<if test="gender != null">#{gender},</if><if test="phone != null">#{phone}</if>)
</insert>

测试用例:
测试当gender为空:

@Test
void insertUser() {UserInfo userInfo = new UserInfo();userInfo.setUsername("wangba");userInfo.setPassword("123456");userInfo.setAge(18);userInfo.setPhone("123456789");System.out.println(userInfoMapper.insertUser(userInfo));
}

image.png
但是实际上,单纯这样写会出现问题:
当我们的phone为空时:
image.png
发现会多一个逗号,导致sql语句出错
此时就要使用标签

标签

<trim>标签主要有4个属性:

  • prefix:表示被<trim>括起来的整个语句,以prefix值作为前缀
  • suffix:表示被<trim>括起来的整个语句,以suffix值作为后缀
  • prefixOverrides:表示被<trim>括起来的整个语句,去除prefixOverrides前缀
  • suffixOverrides:表示被<trim>括起来的整个语句,去除suffixOverrides前缀

此时就能就解决上面的问题:

<insert id="insertUser">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=",">username,`password`,age,<if test="gender != null">gender,</if><if test="phone != null">phone</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=",">#{username},#{password},#{age},<if test="gender != null">#{gender},</if><if test="phone != null">#{phone}</if></trim>
</insert>

image.png

标签

<where>只会在子元素有内容的情况下才会插入where字句,并且会自动去除字句开头的and或or

    <select id="selectUserList" resultMap="XMLBaseMap">select * from userinfo<where><if test="age != null">and age = #{age}</if><if test="gender != null">and gender = #{gender}</if><if test="phone != null">and phone = #{phone}</if></where></sel

image.png

标签

<set> 标签会动态的在sql语句里面插入set关键字,并且会删除额外的逗号

<update id="updateUser" keyProperty="id" useGeneratedKeys="true">update userinfo<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="age != null">age = #{age},</if><if test="phone != null">phone = #{phone},</if><if test="gender != null">gender = #{gender},</if></set>where id = #{id}
</update>

image.png

标签

对集合进行遍历时可以使用foreach 标签.有以下属性:

  • collection:绑定方法参数中的集合
  • item:遍历的每一个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

应用:根据多个userid,删除用户数据

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

image.png

标签

在xml映射文件中配置的sql,可能会存在很多重复的片段,此时就会存在很多冗余的代码
image.png
可以对重复的代码片段进行抽取,将其通过<sql> 标签封装到一个sql片段.再通过<include>标签进行引用

  • sql 定义可重复的sql片段
  • <include> 通过属性refid,指定包含的sql片段
<sql id="allColumn">select * from userinfo
</sql><select id="queryAllUser" resultMap="XMLBaseMap"><include refid="allColumn"></include>
</select>

image.png

注解方式

注解方式动态sql比较麻烦,可读性不太好,不推荐使用

@Insert("<script>" +
"INSERT INTO userinfo " +
"<trim prefix='(' suffix=')' suffixOverrides=','>" +
"<if test='username!=null'>username,</if>" +
"<if test='password!=null'>password,</if>" +
"<if test='age!=null'>age,</if>" +
"<if test='gender!=null'>gender,</if>" +
"<if test='phone!=null'>phone,</if>" +
"</trim>" +
"VALUES " +
"<trim prefix='(' suffix=')' suffixOverrides=','>" +
"<if test='username!=null'>#{username},</if>" +
"<if test='password!=null'>#{password},</if>" +
"<if test='age!=null'>#{age},</if>" +
"<if test='gender!=null'>#{gender},</if>" +
"<if test='phone!=null'>#{phone}</if>" +
"</trim>"+
"</script>")
Integer insertUserByCondition(UserInfo userInfo);

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

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

相关文章

jquery+bootstrap实现DOM转图片并下载

&#x1f34a;jquery实现DOM结构转图片并下载 版本介绍&#xff1a; Bootstrap v3.3.7jQuery v3.5.1domToImage.js 根据Bootstrap实现dialog上一步下一步多个弹窗交互进行大肆修改&#xff0c;完善了第二步生成图片的功能与更强的交互 1.、功能说明 重新设置bootstrap主题色 …

python的Scapy库的基础知识点汇总

Scapy 是一个强大的 Python 库&#xff0c;用于网络数据包的操作&#xff0c;包括数据包的生成、解析、嗅探和注入。以下是 Scapy 库的全部知识点汇总&#xff1a; 1. 安装与配置 安装 Scapy 使用 pip 安装&#xff1a; pip install scapy验证安装&#xff1a; from scapy…

DNS应用以及扩展知识

&#xff08;一&#xff09;DNS正向代理 1.首先在DNS服务器上安装bind包&#xff0c;安装环境 此部分参考上一个笔记 2.修改配置文件 vim /etc/named.conf 在配置文件中加上"any;" 3.然后配置/etc/named.rfc1912.zonesw文件 添加选中部分 选中部分有一个file文…

instanceof介绍及手写instanceof

instanceof 是 JavaScript 中的一个操作符&#xff0c;用于检测一个对象是否在其原型链上有构造函数 prototype 属性。换句话说&#xff0c;instanceof 用来判断一个变量是否是一个特定构造函数的实例。 当你使用 instanceof 操作符时&#xff0c;它会检查左边操作数的原型链中…

c++中的斐波那契数列(Fibonacci Sequence)和背包问题(Knapsack Problem)

前言 hello&#xff0c;大家好啊&#xff0c;我是文宇&#xff0c;不是文字&#xff0c;是文宇哦。 斐波那契数列&#xff08;Fibonacci Sequence&#xff09; 斐波那契数列&#xff08;Fibonacci Sequence&#xff09;是一个经典的数学问题&#xff0c;其中每个数都是前两个…

24年第三届钉钉杯大学生大数据挑战赛浅析

需要完整资料&#xff0c;请关注WX&#xff1a;“小何数模”&#xff01; 本次钉钉杯大数据挑战赛的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&#xf…

气膜足球馆:经济高效的室内足球场馆解决方案—轻空间

如果你有一片足球场&#xff0c;想要建一个室内的足球馆&#xff0c;为什么不考虑一下气膜建筑呢&#xff1f;气膜建筑以其独特的优势和高性价比&#xff0c;成为现代体育场馆建设中的一匹黑马。它不仅具有传统建筑无法比拟的经济效益和快速施工优势&#xff0c;还在智能控制、…

vue实现电子签名、图片合成、及预览功能

业务功能&#xff1a;电子签名、图片合成、及预览功能 业务背景&#xff1a;需求说想要实现一个电子签名&#xff0c;然后需要提供一个预览的功能&#xff0c;可以查看签完名之后的完整效果。 需求探讨&#xff1a;后端大佬跟我说&#xff0c;文档我返回给你一个PDF的oss链接…

7.27扣...

知识点补充&#xff1a; 1.StringBuilder StringBuilder 类在 Java 中是一个可变字符序列。与 String 类不同&#xff0c;StringBuilder 可以在创建之后被修改。这意味着你可以向 StringBuilder 对象追加、插入或删除字符&#xff0c;而不需要创建新的对象&#xff08;辅助数…

企业公户验证API如何使用JAVA、Python、PHP语言进行应用

在纷繁复杂的金融与商业领域&#xff0c;确保每笔交易的安全与合规是至关重要的。而企业公户验证API&#xff0c;正是这样一位默默守护的数字卫士&#xff0c;它通过智能化的手段&#xff0c;简化了企业对公账户验证流程&#xff0c;让繁琐的审核变得快捷且可靠。 什么是企业公…

chrome浏览器驱动(所有版本)

chrome浏览器驱动 114之前版本 https://chromedriver.storage.googleapis.com/index.html 125以后 125以后版本下载链接在此&#xff0c;只有后面status是绿色对勾的才可以下载&#xff0c;驱动大版本一致就可以使用&#xff0c;不需版本号一模一样&#xff1b;下载所需版本只…

语言转文字

因为工作原因需要将语音转化为文字&#xff0c;经常搜索终于找到一个免费的好用工具&#xff0c;记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

在appium中,如何通过匹配图片来进行断言?

在Appium中进行图片匹配断言&#xff0c;可以使用OpenCV来实现。以下是使用Appium和OpenCV进行图片匹配断言的示例代码。 首先&#xff0c;需要确保安装了必要的库&#xff1a; pip install opencv-python-headless pip install opencv-python pip install numpy然后&#xf…

【区块链+绿色低碳】绿色电力分布式身份管理系统 | FISCO BCOS应用案例

目前&#xff0c;绿色电力场景在身份管理方面存在一些痛点&#xff0c;如&#xff1a;绿色电力交易场景中&#xff0c;主体地理位置分散&#xff0c;主体类型&#xff08;人、机、 物&#xff09;差异较大&#xff0c;主体身份认证和管理方式要求差异较大&#xff1b;在着力发展…

高性能 Java 本地缓存 Caffeine 框架介绍及在 SpringBoot 中的使用

在现代应用程序中&#xff0c;缓存是一种重要的性能优化技术&#xff0c;它可以显著减少数据访问延迟&#xff0c;降低服务器负载&#xff0c;提高系统的响应速度。特别是在高并发的场景下&#xff0c;合理地使用缓存能够有效提升系统的稳定性和效率。 Caffeine 是一个高性能的…

《程序猿入职必会(4) · Vue 完成 CURD 案例 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

Eclipse的一些使用

出错的原因: eclipse中&#xff0c;当声明了变量&#xff0c;没有进行初始化&#xff0c;然后在方法中引用该变量的时候&#xff0c;就会报出如下错误&#xff1a; The local variable XXX may not have been initialized意思是该变量没有进行初始化&#xff0c;解决这个错误就…

【C++刷题】优选算法——队列+宽搜

N 叉树的层序遍历 vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if (root nullptr) return ret;queue<Node*> q;q.push(root);ret.push_back({root->val});int size 1;while (!q.empty()) {vector<int> v…

【机器学习】Jupyter Notebook如何使用之基本步骤和进阶操作

引言 Jupyter Notebook 是一个交互式计算环境&#xff0c;它允许创建包含代码、文本和可视化内容的文档 文章目录 引言一、基本步骤1.1 启动 Jupyter Notebook1.2 使用 Jupyter Notebook 仪表板1.3 在笔记本中工作1.4 常用快捷键1.5 导出和分享笔记本 二、进阶用法2.1 组织笔…

CSS性能优化:从加载速度到渲染效率的全方位提升

在快节奏的互联网环境中&#xff0c;网页的加载速度和渲染效率直接关系到用户体验和搜索引擎排名。CSS作为网页样式的主要描述语言&#xff0c;其性能优化同样不容忽视。本文将介绍一系列CSS性能优化的策略&#xff0c;帮助开发者从加载速度到渲染效率实现全方位的提升。 1. 压…