Mybatis入门,day2,动态SQL

news/2024/5/5 23:16:28

Mybatis入门,day2,动态SQL


文章目录

  • Mybatis入门,day2,动态SQL
  • 前言
  • 一、为什么要实现动态SQL
  • 二、使用步骤
    • 1.where和if
    • 2.set和if
    • 3.foreach方法


前言

动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。


一、为什么要实现动态SQL

动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。

二、使用步骤

1.where和if

与之前一样,在接口中添加新的方法,加入新的方法findUserByCondition方法,参数是user对象,返回值为user列表。

public List<User> findUserByCondition(User user);

mapping映射文件中补充相应的方法。

如下图所示的mapping映射文件中添加了以下标签

where标签,当where标签中的条件出现成立时,where标签会在变成SQL语句时自动变为SQL关键字,而当标签中条件都不成立时,则自动消失。同时where后如果紧跟出现and,则会把and消除。

if标签,if标签中的test是if的判断条件如果test中的条件成立,则会在where关键字后面添加if标签中间的语句。test中的id或password是参数User中的属性。,当有多个if标签的test条件都成立时,则if标签中的内容都会拼接到where后。

    <select id="findUserByCondition" parameterType="User" resultType="User">select * from test<where><if test="id !=null">and id = #{id}</if><if test="password != null">and password = #{password}</if></where></select>

通过这些动态的查询拼接语句,可以根据传进来的条件,动态的查询某一项数据。

2.set和if

在SQL语句中更新和select查询语句类似,语句中的set标签与select中的where标签功能相似,如果set标签中的某些保留,则set标签会变为SQL语句的set关键字,并将if中test成立的标签中的内容加入到set后面。

if标签和1中的if标签功能一样,这里就不再过多赘述。

public int updateUserByCondition(User user);
<update id="updateUserByCondition" parameterType="User">update test<set><if test="username != null">username = #{username}</if><if test="password!=null">password = #{password}</if></set>where id = #{id}</update>

3.foreach方法

foreach方法实现的是类似与SQL中的where id in(1,2,3)的语句,不过采用了where id = 1 or id =2 or id = 3的模式。

一样是在mapper文件中编写接口,并在映射文件中编写映射。

在foreach方法中我们采用迭代方式,传入的参数实际上是上方where id in(1,2,3)中括号中的数据。我们将这些数据以列表的方式传入。

而在映射文件中,我们在原有的where标签中加入新的foreach标签,在foreach标签中,collection后面加的是传入的类型,必须是可迭代类型,item是用id表示列表迭代过程中的参数名,每循环一次,id就等于不同的值。

open和colse以及separator分别是下方内容的一些属性添加
这里的open和close分别是(),所以在装配时,id=#{id}会变为(id=#{id}),在不同的迭代中用separator分割出来。距离就是
select * from test where (id = 1) or (id = 2) or (id = 3)

public List<User> findUsersByIds(List<String> ids);
<select id="findUsersByIds" parameterType="java.util.List" resultType="User">select * from test<where>
--             select * from test where (id=1) or (id = 2) or (id = 3)
--             collection是循环的类型,item是循环的每一项用id表示<foreach collection="list" item="id" open="(" close=")" separator="or">id = #{id}</foreach></where></select>


http://www.mrgr.cn/p/10548685

相关文章

Laravel 6 - 第十四章 响应

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

接口自动化测试框架建设的经验与教训

为什么选择这个话题&#xff1f; 一是发现很多“点工”在转型迷茫期都会问一些自动化测试相关的问题&#xff0c;可以说自动化测试是“点工”升级的必经之路&#xff1b;二是Google一下接口自动化测试&#xff0c;你会发现很多自动化测试框架相关的文章&#xff0c;但是大部分…

同旺科技 USB TO SPI / I2C适配器读写24LC256--页写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版&#xff1b; 从00地址开始写入64个字节&#xff0c;然后再将64个字节读回&#xff1b; 页写时序&#xff1a; 读时序&#xff1a…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

指令优化:基于大型语言模型的指令算子的进化多目标指令优化

指令优化:基于大型语言模型的指令算子的进化多目标指令优化 摘要 基于指令的语言建模在预训练的语言模型中受到了极大的关注。 提出了一种指令优化方法,将指令生成视为一个进化的多目标优化问题,利用大型语言模型(LLM)来模拟指令运算符,包括变异和交叉。 此外,为这些运算…

探索直播+电商系统中台架构:连接消费者与商品的智能纽带

随着直播电商的崛起&#xff0c;电商行业进入了全新的智能时代。直播形式的互动性和即时性为消费者提供了全新的购物体验&#xff0c;而电商平台则为商品的展示、销售和配送提供了强大的支持。在这一背景下&#xff0c;直播电商系统中台架构成为了连接消费者与商品的智能纽带&a…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标&#xff1a;1、实现串口定长收发数据通信&#xff1b;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA&#xff08;Direct Memory …

yolo-驾驶行为监测:驾驶分心检测-抽烟打电话检测

在现代交通环境中&#xff0c;随着汽车技术的不断进步和智能驾驶辅助系统的普及&#xff0c;驾驶安全成为了公众关注的焦点之一 。 分心驾驶&#xff0c;尤其是抽烟、打电话等行为&#xff0c;是导致交通事故频发的重要因素。为了解决这一问题&#xff0c;研究人员和工程师们…

MySQL索引为什么选择B+树,而不是二叉树、红黑树、B树?

12.1.为什么没有选择二叉树&#xff1f; 二叉树是一种二分查找树&#xff0c;有很好的查找性能&#xff0c;相当于二分查找。 二叉树的非叶子节值大于左边子节点、小于右边子节点。 原因&#xff1a; 但是当N比较大的时候&#xff0c;树的深度比较高。数据查询的时间主要依赖于…

算法学习笔记Day8——回溯算法

本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;回溯算法代码是否有规律可循&#xff1f; 一、介绍 1.回溯算法是什么&#xff1f; 回溯算法就是个多叉树的遍历问题&#xff0c;关键在于在前序和后序时间点做一些操作…

wps屏幕录制怎么用?分享使用方法!

数字化时代&#xff0c;屏幕录制已成为我们学习、工作和娱乐中不可或缺的一部分。无论是制作教学视频、分享游戏过程&#xff0c;还是录制网络会议&#xff0c;屏幕录制都能帮助我们轻松实现。WPS作为一款功能强大的办公软件&#xff0c;其屏幕录制功能也备受用户青睐。本文将详…

CentOS-7安装Mysql并允许其他主机登录

一、通用设置&#xff08;分别在4台虚拟机设置&#xff09; 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入&#xff1a; 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服…

day13 ts后端持久层框架(java转ts全栈/3R教室)

简介&#xff1a;如果说TS全栈后端开发最重要的两个框架&#xff0c;除了nestjs就是持久层框架了&#xff0c;这里主要看下Typeorm&#xff08;java中常用的就是mybatis&#xff0c;springdatajpa&#xff0c;hebernite了&#xff09; 先回顾下ORM的概念&#xff1a;ORM就是建…

C# GetField 方法应用实例

目录 关于 C# Type 类 GetField 方法应用 应用举例 心理CT设计题 类设计 DPCT类实现代码 小结 关于 C# Type 类 Type表示类型声明&#xff1a;类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义&#xff0c;以及开放或封闭构造的泛型类型。调用 t…

二叉树的性质

性质一:二叉树的第i层上最多有2^(i-1) 个节点 性质二:深度为k的二叉树最多有2^(k)-1个节点 等比数列求和公式: 直接套进去就得到 2^(k)-1 (结点的度&#xff08;Degree) &#xff1a;结点子树的个数。树的度&#xff1a; 树中结点的最大度数。度为k的树也称为k叉树) 性质三:叶…

Uptime Kuma 使用指南:一款简单易用的站点监控工具

我平时的工作会涉及到监控&#xff0c;而站点是一个很重要的监控项。项目上线后&#xff0c;我们通常会将站点监控配置到云平台上&#xff0c;以检测各站点的连通性。但随着项目不断增多&#xff0c;云平台上的配额就有点捉急了。针对这个情况&#xff0c;我们可以试试这个开源…

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色。 先看效果图&#xff1a; 在CSS中&#xff0c;你可以使用border属性或者background属性来画一条虚线。以下是两种常见的方法&#xff1a; 方法一&#xff1a;使用border属性 你可以设置一个元素的border…

4.24日团队开发第五天

今天进行了晨会主要讨论了昨天完成情况,以及遇到的问题 同时针对完成度进行了分析,及时调整了进度

Linux 网络操作命令Telnet

Telnet 尽管 Telnet 已经逐渐被更安全的 SSH 协议所取代&#xff0c;但在某些特定场景下&#xff0c;如对旧系统的维护或教育目的&#xff0c;Telnet 仍然有其使用价值。本文将介绍如何在 Linux 系统中安装 Telnet 客户端&#xff0c;以及如何使用它进行远程登录。 用户使用 t…

MySQL 锁机制全面解析

目录 1. MySQL的锁类型1.1 全局锁1.2 表锁1.3 行锁1.4 共享锁&#xff08;读锁&#xff09;1.5 排它锁&#xff08;写锁&#xff09;1.6 死锁 2 乐观锁和悲观锁2.1 乐观锁2.2 悲观锁 3 意向锁4 间隙锁5 临键锁6 插入意向锁7. 事务隔离级别对锁的影响6.1 读未提交&#xff08;Re…