MyBatis 操作数据库(构造动态 SQL)

前言

        动态 SQL 是 Mybatis 的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。

<if> 标签

        我们在填写用户信息的时候经常会看到如下的界面,用户信息中包含必填信息和非必填信息,非必填信息是填和不填都可以的,那这样的话插入到数据库中的数据有多种情况,SQL 语句也有多种情况,比如地址管理,我可以选择填,也可以选择不填,那么 SQL 语句的插入语句就要对应插入或者不插入

        要想完成这个效果,我们就需要构造动态 SQL

接口定义:

//通过用户提供的数据,动态构造 SQL 语句进行插入
Integer insertUserByCondition(UserInfo userInfo);

Mapper.xml实现:

<insert id="insertUserByCondition">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></insert>

         <if> 标签的 test 属性表示判断的内容,如下的代码,判断参数 username 的值是否为 null,相当于判断用户是否输入 username,如果不为 null,说明用户输入了 username ,就需要插入数据到 username 字段,所以拼接 username, 到 SQL 语句中

<if test="username!=null">username,
</if>

        如果所有的参数都赋了值,构造的 SQL 语句就是:

insert into userinfo( username, password, age, gender, phone )
values(#{username},#{password},#{age},#{gender},#{phone});

        如果参数 gender 和 phone 都没赋值,就是:

insert into userinfo( username, password, age)
values(#{username},#{password},#{age});

        构造的 SQL 语句是根据用户的输入动态改变的

<trim> 标签

        在上面 Mapper.xml 实现的代码中,我们用到了 <trim>  标签

标签中有如下属性:

• prefix:表⽰整个语句块,以prefix的值作为前缀 

• suffix:表⽰整个语句块,以suffix的值作为后缀

• prefixOverrides:表⽰整个语句块要去除掉的前缀

• suffixOverrides:表⽰整个语句块要去除掉的后缀

       在上面 Mapper.xml 实现的代码中,我们使用了<trim> 标签进行了以下处理

• 基于 prefix 配置,开始部分加上 ( 

• 基于suffix 配置,结束部分加上 )

 • 多个组织的语句都以 ,  结尾,在最后拼接好的字符串还会以 ,  结尾,会基于 suffixOverrides 配置去掉最后⼀个 ,  

<where> 标签

        <where> 标签只会在⼦元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的 AND 或 OR

        看下⾯这个场景, 系统会根据我们的筛选条件, 动态组装 select 语句的 where 条件,来查询到我们指定的内容

        假设所有的参数都输入,我们得到的 SQL 语句如下:

SELECT id,username,password,age,gender,phone,delete_flag,create_time,update_time 
FROM userinfo 
WHERE id = #{id}
AND username = #{username} 
AND gender = #{gender};

        接口定义:

 //通过用户提供的数据,动态构造 SQL 语句进行查询
List<UserInfo> selectByCondition(UserInfo userInfo);

        Mapper.xml实现:

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

        假设用户一个参数都没有输入,得到的 SQL 语句就是:

select id,username,password,age,gender,phone,delete_flag,create_time,update_time
from userinfo;

        假设用户没有输入 id 参数,得到的 SQL 语句就是:

SELECT id,username,password,age,gender,phone,delete_flag,create_time,update_time 
FROM userinfo 
WHERE username = #{username} 
AND gender = #{gender};

<set>标签

         <set>标签动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号.(⽤于update语句中)

        根据用户传入的参数,动态构造 SQL 语句,插入相关内容

        接⼝定义:根据传⼊的用户 id 属性,修改其他传入参数的属性

//通过用户提供的数据,动态构造 SQL 语句进行修改
Integer updateByCondition(UserInfo userInfo);

        Mapper.xml实现:

    <update id="updateByCondition">update userinfo<set><if test="username!=null">username=#{username},</if><if test="age!=null">age=#{age},</if><if test="deleteFlag!=null">delete_flag=#{deleteFlag}</if></set>where id=#{id}</update>

<foreach> 标签

对集合进⾏遍历时可以使⽤该标签。

标签有如下属性:

• collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象

• item:遍历时的每⼀个对象 

• open:语句块开头的字符串 

• close:语句块结束的字符串 

• separator:每次遍历之间间隔的字符串

        有以下场景我们将要删除的用户 id 都集中放到一个 List<Integer> 列表当中,在删除的时候,将列表中的用户 id 所指向的信息都进行删除

        假设列表当中的数据为{1,2,3,4,5},我们要构造的 SQL 语句就应该为:

delete from userinfo where id in(1,2,3,4,5);

        接口定义:

//给定一个 id 集合,将集合中的所有 id 对应的用户数据都删除
Integer deleteByIds(List<Integer> ids);

        Mapper.xml实现:

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

       根据一开始提到的例子,我们通过 <foreach> 标签要构造出来的 SQL 结构应该为 (1,2,3,4,5),1,2,3,4,5 要通过遍历集合中的内容获得、

collection="ids" 表示绑定了参数中的集合 ids 

item="id" 表示遍历集合得到的数据放到 id 中,通过 id 来使用

separator=","  遍历集合得到的数据之间通过  , 进行分割

open="("  <foreach> 标签包含的语句块以 "(" 作为开头

close=")"  <foreach> 标签包含的语句块以 ")" 作为结尾

<sql> 和 <include> 标签

        在xml映射⽂件中配置的SQL,有时可能会存在很多重复的⽚段,此时就会存在很多冗余的代码

        我们可以通过 <sql> 标签提取重复的 SQL 片段进行封装,通过 <include> 标签引用封装好的 SQL 片段

        通过 <sql> 标签封装:

        通过 id 属性为封装的 SQL 片段命名,方便后续进行调用

<sql id="allColumn">id,username,password,age,gender,phone,delete_flag,create_time,update_time
</sql>

        通过 <include> 标签引用:

        通过 refid 属性设置要引入的 SQL 片段

    <select id="selectByCondition2" resultType="com.example.springbootdemo.dao.UserInfo">select <include refid="allColumn"></include>from userinfo</select>

         最终得到的 SQL 语句为:

select id,username,password,age,gender,phone,delete_flag,create_time,update_time
from userinfo;

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

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

相关文章

lectin

PSGL-1 ; selectin O-linked glycosylation | Detailed Pedia PSGL-1 has several O-glycans to extend the ligand away from the cell surface. An sLex epitope allows interactions with the receptor for leukocyte localisation. 分类 --Recognition by Animal Lectins…

C语言每日一题(33)随机链表的复制

力扣138 随机链表的复制 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都…

从关键新闻和最新技术看AI行业发展(2023.11.6-11.19第十期) |【WeThinkIn老实人报】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&…

FPGA语法相关知识合集

一.相关概念 1.四种结构说明语句 2.initial 与 always 的异同点 3.task 与 function 的3个不同点 4.task的语法结构(定义及调用) 5.function的语法结构(定义及调用) 6.function 的一个必须有和一个必须没有&#xff0c;使用规则 7.自动&#xff08;递归&#xff09;函数…

五、Linux目录结构

1.基本介绍 1.Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录"r/"&#xff0c;然后在此目录下再创建其他的目录。 2.深刻理解linux树状文件目录是非常重要的 3.记住一句经典的话&#xff1a;在Linux世界里&#xff0c;一切皆文件…

亚马逊Lightsail:云服务新篇章,轻松开启您的数字未来

文章目录 前言一、Lightsail是什么&#xff1f;Lightsail的优势使用场景 二、AWS lightsail创建VPS总结 前言 对于开发者而言&#xff0c;当你想构建系统架构时&#xff0c;你的面前就出现了两种选择&#xff0c;选择一是花时间去亲手挑选每个亚马逊云科技组件&#xff08;云服…

Ubuntu20.04 安装微信 【deepin-wine方式极简安装】推荐,两行命令就解决了。

参考git仓库地址: GitHub - zq1997/deepin-wine: 【deepin源移植】Debian/Ubuntu上最快的QQ/微信安装方式【deepin源移植】Debian/Ubuntu上最快的QQ/微信安装方式. Contribute to zq1997/deepin-wine development by creating an account on GitHub.https://github.com/zq199…

【网络】OSI模型 与 TCP/IP模型 对比

一、OSI模型 OSI模型包含7个层次&#xff0c;从下到上分别是&#xff1a; 1. 物理层&#xff08;Physical Layer&#xff09; - 功能&#xff1a;处理与电子设备物理接口相关的细节&#xff08;如电压、引脚布局、同步&#xff0c;等等&#xff09;。 - 协议&#xff1a;以…

Schrodinger Shape Screen 工具使用方法

schrodinger的shape screen方法是一种基于ligand的筛选方法。需要提供一个参考分子&#xff0c;和需要筛选的分子库。shape screen可以根据原子类型、药效团对分子的形状相似度进行打分。 shape screen面板 shape screen面板如下&#xff1a; 1. 参考分子来源&#xff0c;可以…

GMEL:基于地理上下文嵌入的OD流预测

1 文章信息 文章题为“Learning Geo-Contextual Embeddings for Commuting Flow Prediction”&#xff0c;是一篇发表于The Thirty-Seventh AAAI Conference on Artificial Intelligence (AAAI-20)的一篇论文。该论文主要针对交通中OD流预测任务&#xff0c;从地理上下文信息中…

解决向日葵远程控制linux命令行版本无法输入密码的问题

就是如下所示的框&#xff0c;官方说是按方向键↓选择用户名和密码的输入框输入&#xff0c;但是按方向键死活没用&#xff0c;研究了之后按tab键就行了。

如何将vscode和Linux远程链接:

如何将vscode和Linux远程链接&#xff1a; Remote - SSH - 远程登录Linux 安装Remote - SSH 我们下载完后&#xff0c;就会出现这些图标 这里点一下号 查看一下我们的主机名&#xff0c;并复制 输入ssh 用户名主机名 这里是要将ssh这个文件要放在主机下的哪个路径下&#xff…