MyBatis第四课动态SQL

目录

引言:

一、动态SQL书写方式

二、会帮我们处理多余的字符

方法2:使用where也可以进行消除and,但是出现的问题

三、标签 

四、foreach(循环操作)

​编辑

Mybatis传递List集合报错 Available parameters are [collection, list]


引言:

在我们生活中,常常会需要填写一些注册的信息,比如性别,年龄,学历啥的,假如我们不想去填写,那我们只写一个SQL的增加语句是不是就不对了呢。这时候我们就需要根据用户的输入情况,进行插入,下面为这种情况的例子

这时候我们需要根据需求,动态的拼接SQL:动态SQL

insert into userInfo(username, password,age,gender,phone) values(?,?,?,?,?);insert into userInfo( password,age,gender,phone) values(?,?,?,?);
insert into userInfo(age,gender,phone) values(?,?,?);

一、动态SQL书写方式

注解

1.把全部的sql放到script标签下面

2.使用if标签

判断条件

里面写的是java对象的属性

@Mapper
public interface UserInfo2Mapper {//动态SQL练习//假如此时性别是否为空//Insert into userinfo(username,password,age,gender,phone) values(#{username},#{password},#{age],#{gender},#{phone})
//gender对应的是java的属性,而不是数据库的@Insert("<script>" +"Insert into userinfo(username,password,age," +"<if test='gender!=null'>gender,</if>" +"phone)" +"values(#{username},#{password},#{age}," +
//下面这个也是java的属性"<if test='gender!=null'>#{gender},</if>" +"#{phone})" +"</script>")Integer insert(UserInfo userInfo);

使用xml的方式实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.myBatis.mapper.UserInfoXMLMapper">
<insert id="insertByXML">insert  into userInfo(username,password,age,<if test="gender!=null" >gender</if>,phone)values(#{username},#{password},#{age},<if test='gender!=null'>#{gender},</if>#{phone})
</insert>
</mapper>

如何选择:

1.先看公司/团队,是否有要求

2.看同事咋写

二、<trim>会帮我们处理多余的字符

当我们不去写性别的时候,会发现问题

原因就是书写这里的时候,如果把性别注释掉,就会多一个and,所以,我们选择使用trim标签。

方法2:使用where也可以进行消除and,但是出现的问题

由自己的实现得出;假如这样where能够对and进行去除(不写username的情况下)

select*from <where>      <if test="username!=null">username=#{username}</if>                           <if test="age!=null">and age=#{age}</if><if test="gender!=null">and   gender=#{gender}
<where>

但是假如是这种情况(不写gender的情况)

trim的缺点:假如所有条件都为空的情况下,SQL语句变成

select*from userinfo where 后面就没有了

当然也有解决方法

select *from  userInfo where 1=1  
<trim>省略</trim>

(如果查询条件为空,where标签会自动去除where关键字,各有好坏,依据情况定)

select*from <where> <if test="username!=null">username=#{username} and</if>                           <if test="age!=null">age=#{age}     and</if><if test="gender!=null">and   gender=#{gender}
<where>

三、<Set>标签 

set标签也可以与where一样,起到一定的去除作用。

<update id="updateByCondition">update userInfo<set>
<!--        <trim suffixOverrides=",">--><if test="username!=null">username=#{username},</if><if test="age!=null">age=#{age},</if><if test=" gender!=null">gender=#{gender}</if>
<!--        </trim>--></set>where id=9</update>

四、foreach(循环操作)

Mybatis传递List集合报错 Available parameters are [collection, list]

发现了一个奇怪的问题,当我传递List的时候,不知道为什么一直报这个错,开始在想是不是哪里打错了,后来再去搜索发现是下面这个原理

前任栽树:

当我们传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map。 

换句话说当我们传递集合的时候,假如不加上这个@Param这个,编译器是无法根据你的名字来去识别你的xml文件中sql选择的id,那么对应xml里面的SQL语句就无法实现))
————————————————
版权声明:本文为CSDN博主「發V發」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_28978689/article/details/79406832

当这个样子改完之后,问题就成功解决啦~。

<sql>和<include>

把一些重复的sql可以提取出来,使用<sql>标签来标识,使用的时候使用<include>标签

例:

​​​​​​​

​​​​​​​

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

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

相关文章

Apache Spark中的广播变量分发机制

Apache Spark中的广播变量提供了一种机制&#xff0c;允许用户在集群中共享只读变量&#xff0c;并且每个任务都可以访问这个变量&#xff0c;而不需要在每次任务之间重新发送该变量。这种机制特别适用于在所有节点上都需要访问同一份只读数据集的情况&#xff0c;因为它可以显…

Linux: make/Makefile 相关的知识

背景&#xff1a; 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c…

关于小程序吞噬margin-rightBug

关于小程序吞噬margin-right的Bug 今天在写小程序的时候发现我在flex布局的时候我的margin-right不生效 经过测试只能使用display:inline-block; 配合 white-space: nowrap;来实现flex布局同时也解决了不显示右边距的问题 复盘:在小程序中有一个横向滚动的 需求 滚动的屏幕的…

良心推荐!五个超好用的Vue3工具

vue3-dnd 是用来做drag and drop的&#xff0c;也就是拖放&#xff0c;很多人多 Vue 的拖放库已经断代了&#xff0c;其实 Vue3 也有拖放库的&#xff0c;那就是 vue3-dnd。 v-wave 这可库可以通过自定义指令的形式&#xff0c;让目标点击节点具备波纹的效果&#xff0c;如下…

React 18版本配置rem 和 vw

React 18版本配置rem 和 vw 经过无数次的实验最终发现兼容性比较好的方案是配置webpack.config.js 第一步: npm install lib-flexible postcss-pxtorem yarn add lib-flexible postcss-pxtorem第二步: 接下来直接解包-- yarn eject npm run eject第三步: 这一步也是最关键…

mysql的varchar长度到底能插多少字符?

在用navicat迁移表结构&#xff0c;从oracle到MySQL时&#xff0c;注意如下坑&#xff1a; 1、如果varchar2(256)以上&#xff0c;则在mysql会自动用text取代&#xff0c;需要考虑手工修改字段类型为varchar(256) ALTER TABLE DES_LOGIC_RESOURCE MODIFY REMARK VARCHAR(4000);…

MySQL两个表的亲密接触-连接查询的原理

MySQL对于被驱动表的关联字段没索引的关联查询&#xff0c;一般都会使用 BNL 算法。如果有索引一般选择 NLJ 算法&#xff0c;有 索引的情况下 NLJ 算法比 BNL算法性能更高。 关系型数据库还有一个重要的概念&#xff1a;Join&#xff08;连接&#xff09;。使用Join有好处&…

学会使用ubuntu——ubuntu22.04使用WebCatlog

Ubuntu22.04使用WebCatlog WebCatlog是适用于Gnu / Linux&#xff0c;Windows或Mac OS X系统的桌面程序。 引擎基于铬&#xff0c;它用于在我们的桌面上处理Web服务。简单点就是把网页单独一个窗口出来显示&#xff0c;当一个app用。本文就是利用WebCatlog安装后的notion编写的…

如何学习计算机视觉

学习计算机视觉可以通过以下步骤进行&#xff1a; 了解基本概念和原理&#xff1a;首先&#xff0c;你可以学习计算机视觉的基本概念和原理&#xff0c;包括图像处理、特征提取、目标检测、物体识别等。这些基础知识将帮助你理解计算机视觉的工作原理。 学习算法和技术&#x…

C语言-算法-快速幂

【模板】快速幂 题目描述 给你三个整数 a , b , p a,b,p a,b,p&#xff0c;求 a b m o d p a^b \bmod p abmodp。 输入格式 输入只有一行三个整数&#xff0c;分别代表 a , b , p a,b,p a,b,p。 输出格式 输出一行一个字符串 a^b mod ps&#xff0c;其中 a , b , p a…

第九篇 华为云Iot SDK的简单应用

第九篇 华为云Iot SDK的简单应用 一、华为云Iot SDK API的简单使用 1.初始化SDK 2.绑定连接配置信息 3.连接服务器 4.上报属性 5.接收命令 二、实现智能家居灯光状态上报 &#x1f516;以下是上报数据到华为云Iot的代码片段&#xff0c;配合串口控制灯光&#xff0c;改变灯…

Qt —— 自定义飞机仪表控件(附源码)

示例效果 部署环境 本人亲测版本Vs2017+Qt5.12.4,其他版本应该也可使用。 源码1 qfi_ADI::qfi_ADI( QWidget *parent ) :QGraphicsView ( parent ),m_scene ( nullptr )

C++ STL之list的使用及模拟实现

文章目录 1. 介绍2. list类的使用2.1 list类对象的构造函数2.2 list类对象的容量操作2.3 list类对象的修改操作2.4 list类对象的访问及遍历操作 3. list类的模拟实现 1. 介绍 英文解释&#xff1a; 也就是说&#xff1a; list是可以在常数范围内在任意位置进行插入和删除的序列…

yolov8 opencv dnn部署自己的模型

源码地址 本人使用的opencv c github代码,代码作者非本人 使用github源码结合自己导出的onnx模型推理自己的视频 推理条件 windows 10 Visual Studio 2019 Nvidia GeForce GTX 1070 opencv4.7.0 (opencv4.5.5在别的地方看到不支持yolov8的推理&#xff0c;所以只使用opencv…

【机组】计算机组成原理实验指导书.

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 第一章 性能特点 1.1 系…

使用js判断list中是否含有某个字符串,存在则删除,

显示上图中使用了两种方式&#xff0c; 左边的是filter将不等于userCode的元素筛选出来组成一个新的list&#xff0c; userCodeList.filter(item> item!userCode)&#xff1b;但是上面这个方法在IE浏览器中不支持&#xff0c; 所以改成了右边的方法&#xff0c;使用splice…

《WebKit 技术内幕》学习之十一(1):多媒体

第11章 多媒体 说到浏览器对多媒体的支持&#xff0c;不得不提的就是Flash插件和HTML5之争。Flash对Web的发展起了非常重要的作用&#xff0c;它能够支持视频、音频、动画等多媒体功能&#xff0c;虽然现在大家都在讨论Web前端领域是否应该丢弃Flash插件转而支持HTML5。在本章…

web系统架构基于springCloud的各技术栈

博主目前开发的web系统架构是基于springCloud的一套微服务架构。 使用的技术栈&#xff1a;springbootmysqlclickhousepostgresqlredisrocketMqosseurekabase-gatewayapollodockernginxvue的一套web架构。 一、springboot3.0 特性&#xff1a;Spring Boot 3.0提供了许多新特性…

第十七章 : Spring Cloud中分布式锁理论与实践(一)

第十七章 : Spring Cloud中分布式锁理论与实践(一) 本章知识点:分布式锁诞生的背景、设计思路以及单机JVM锁在集群的情况存在的缺陷以及讲解了MySQL分布式锁设计方案以及落地思路。 Springboot 2.3.12.RELEASE,spring cloud Hoxton.SR12,spring cloud alibaba 2.2.9.RELE…

网络安全---防御保护--子接口小实验

子接口小实验&#xff1a; 环境准备&#xff1a; 防火墙区域配置为trust&#xff1a; PC设置其ip为同一个网段&#xff1a; 此时尝试ping无法ping通的原因是没有打开防火墙允许ping&#xff0c;我们在图形化界面允许ping即可 最终结果&#xff1a; .com域名服务器&#xff1a; …