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://xiahunao.cn/news/3269263.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…

C++初阶:string(字符串)

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 为什么要学习string类 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#…

贪心算法总结(2)

一、买卖股票的最佳时机 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxProfit(vector<int>& prices) {int miniINT_MAX;int ret0;for(int&price:prices){//遍历的时候&#xff0c;我们随时去更新最小的值&#xff0c;然后让每一位…

shell脚本学习以及案列练习

&#xff08;一&#xff09;用shell脚本自动化部署安装nginx 首先创建一个目录&#xff0c;用于存放该脚本 mkdir -p /root/shell 然后创建脚本文件 vim /root/shell/install_nginx.sh 再给脚本文件加上执行权限 chmod x /root/shell/install_nginx.sh 然后执行&#xff0c…

新手必备:iPhone新机官网验机流程详解

目录 一、准备工作 二、外包装检查 三、序列号查询 四、开箱验机 五、开机验机 六、功能检测 七、售后服务验证 八、总结 一、准备工作 检查包裹&#xff1a;确保快递包裹完好无损。准备录像设备&#xff1a;使用另一台设备录制整个验机过程&#xff0c;以防日后发生纠…

【JAVA开发笔记】Reids下载、安装、配置-Windows篇(超详细,含Redis可视化管理工具!!!)

目录 1. Redis 简介 2. 下载 Redis 安装包 3. 开启 Redis 服务 4. 配置环境变量 5. Redis 服务注册为系统服务 6. Redis 服务测试和简单使用 7. 下载安装 Redis 管理工具 8. 管理工具连接 Redis 服务器 1. Redis 简介 Redis&#xff08;Remote Dictionary Server&…

基于GitHub page和Hexo主题搭建个人博客(win)

1.安装git git官网下载地址&#xff1a;Git - Downloads (git-scm.com) (1)下载&#xff1a;进入官网&#xff0c;选择对应版本下载&#xff0c;得到.exe文件 (2)安装&#xff1a;打开.exe文件&#xff0c;进行如下操作 (3)安装好后&#xff0c;右击鼠标&#xff0c;点击显示…

运维团队如何借助分布式部署提升监控效率与可靠性

随着企业IT基础设施的日益复杂和分布式架构的广泛应用&#xff0c;传统的监控解决方案已经难以满足现代运维团队的需求。在这样的背景下&#xff0c;分布式部署作为一种新型的监控架构&#xff0c;以其灵活性、可扩展性和高可用性&#xff0c;成为了运维团队提升监控效率与可靠…

JDK21下载+安装+环境配置教程(Windows11系统)

下载地址&#xff1a; Java Downloads | Oracle 中国 下载完这样 双击 然后下一步就完事了&#xff08;如果想换路径就换一下&#xff09; 配置JDK的环境变量&#xff0c;鼠标右键此电脑--属性--高级系统设置 1.点击新建系统变量名为"JAVA_HOME"&#xff0c;变量值为…

推荐系统三十六式学习笔记:工程篇.常见架构25|Netflix个性化推荐架构

目录 架构的重要性经典架构1.数据流2.在线层3.离线层4.近线层 简化架构总结 你是否曾经觉得算法就是推荐系统的全部&#xff0c;即便不是全部&#xff0c;至少也是嫡长子&#xff0c;然而实际上&#xff0c;工程实现才是推荐系统的骨架。如果没有好的软件实现&#xff0c;算法不…

vue3里将table表格中的数据导出为excel

想要实现前端对表格中的数据进行导出&#xff0c;这里推荐使用xlsx这个依赖库实现。 1、安装 pnpm install xlsx 2、使用 import * as XLSX from "xlsx"; 直接在组件里导入XLSX库&#xff0c;然后给表格table通过ref创建响应式数据拿到table实例&#xff0c;将实…

大数据平台之HBase

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;是Apache Hadoop生态系统的重要组成部分。它特别适合大规模结构化和半结构化数据的存储和检索&#xff0c;能够处理实时读写和批处理工作负载。以下是对HBase的详细介绍。 1. 核心概念 1.1 表&#x…

自定义prometheus监控获取nginx_upstream指标

1、前言 上篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查&#xff0c;这篇介绍一下如何自定义prometheus监控获取nginx的upstream指标来实时监控nginx。 2、nginx_upstream_status状态 支持以下三种方式查看nginx_upstream的状态 /status?formatht…

【sklearn实战】sklearn 数据集之 Toy datasets

scikit-learn 内置的一些小型标准数据集&#xff0c;不需要从某个外部网站下载任何文件。 一 鸾尾花数据集&#xff08;Iris Dataset&#xff09; 1.1 简介 该数据集包含了 150 个鸢尾花的数据&#xff0c;其中每个数据点都有 4 个变量&#xff08;萼片长度、萼片宽度、花瓣长…

张量Tensor

借助 PyTorch 实现深度神经网络 - 张量和数据集 - 第 1 周 | Coursera 张量概述 张量运算的本质是向量和矩阵运算。神经网络的输入、输出、参数都将采用张量进行。Pytorch中的张量可以和Python中的numpy相互转换&#xff0c;这使得Pytorch在GPU上应用成为可能。神经网络中的参…

等级保护测评解决方案

什么是等级保护测评&#xff1f; 网络安全等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护&#xff0c;对信息系统中使用的信息安全产品实行按等级管理&#xff0c;对信息系统中发生的信息安全…

多机构发布智能锁2024半年报:德施曼上半年线上全渠道销额稳居第一

近日&#xff0c;权威机构奥维云网、洛图科技先后发布智能门锁2024半年报&#xff0c;报告均指出上半年中国智能门锁线上渠道持续增长。奥维云网数据显示&#xff0c;2024上半年线上渠道销量同比增长22.7%&#xff0c;成行业增长最快的部分&#xff1b;洛图科技强调&#xff0c…

Baseline_bm25实现文本检索

大一还沉迷NLP时写的第一篇笔记&#xff0c;才发现在草稿箱躺了这么久oO 题目来源&#xff1a;飞桨AI Studio - 人工智能学习与实训社区 (baidu.com) 1.解压数据集 !unzip /home/aistudio/data/data205651/wenshu_ms_dataset.zip -d dataset 如果已经解压过了出现&#xff0…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

Photos框架 - 自定义媒体选择器(UI预览)

引言 在前面的博客中我们已经介绍了使用媒体资源数据的获取&#xff0c;以及自定义的媒体资源选择列表页。在一个功能完整的媒体选择器中&#xff0c;预览自然是必不可少的&#xff0c;本篇博客我们就来实现一个资源的预览功能&#xff0c;并且实现列表和预览的数据联动效果。…