Mybatis入门,day2,动态SQL

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.mzph.cn/diannao/2951.shtml

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

相关文章

《R语言与农业数据统计分析及建模》学习——描述性统计分析

一、描述性统计概念和方法 1、概念和作用 描述性统计是对数据进行概括和描述&#xff0c;便于理解数据的特征、趋势和分布&#xff0c;帮助我们了解数据基本情况和总体特征&#xff0c;为后续更深入的数据分析和建模提供基础。 2、基础方法 &#xff08;1&#xff09;中心趋…

npm、yarn与pnpm详解

&#x1f525; npm、yarn与pnpm详解 &#x1f516; 一、npm &#x1f50d; 简介&#xff1a; npm是随Node.js一起安装的官方包管理工具&#xff0c;它为开发者搭建了一个庞大的资源库&#xff0c;允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。 &#…

CountDownLatch源码分析

1.创建 CountDownLatch latch new CountDownLatch(5); 2.latch.countDown(); 将count执行减一操作&#xff0c;当count为0时&#xff0c;等待中的线程会被唤醒 SIGNAL (值为-1)&#xff1a; 表示后继节点需要被唤醒。当一个节点释放锁的时候&#xff0c;会唤醒它的后继节点…

openjudge_2.5基本算法之搜索_1998:寻找Nemo

题目 1998:寻找Nemo 总时间限制: 2000ms 内存限制: 65536kB 描述 Nemo 是个顽皮的小孩. 一天他一个人跑到深海里去玩. 可是他迷路了. 于是他向父亲 Marlin 发送了求救信号.通过查找地图 Marlin 发现那片海像一个有着墙和门的迷宫.所有的墙都是平行于 X 轴或 Y 轴的. 墙的厚度可…

C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法

C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法 —— 2024-04-21 杭州 文章目录 C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法1.C++ 使用 std::thread 和 std::promise/std::future2.C++ 使用 std::async3.C/POSIX 使用 pthread在 C++ 和 C 语言…

2010-2023年“国家级大数据综合试验区”试点城市DID匹配数据

2010-2023年国家级大数据综合试验区试点城市DID匹配数据 1、时间&#xff1a;2010-2023年 2、来源&#xff1a;国家发展改革委、工业和信息化部、ZY网信办发函批复的试验区 3、指标&#xff1a;行政区划代码、年份、所属省份、地区、国家级大数据综合试验区、最早设立年份 …

Python基础:【习题系列】判断题(二)

Python中单行注释以#符号开始。 答案&#xff1a;对 Python中可以使用操作符来增加变量的值。 答案&#xff1a;对 在Python中&#xff0c;元组一旦创建就不能被修改。 答案&#xff1a;对 Python中的函数可以没有参数。 答案&#xff1a;对 在Python中&#xff0c;可以用{…

ELK创建仪表盘

创建仪表盘步骤&#xff1a; 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search&#xff0c;可以添加想要的字段&#xff0c;并保存这个search方便下次直接打开该search&#xff0c;并方便在可视化和仪表盘中使用该search. 二、生成饼图…

c++中的函数

一、函数概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个程序块实现特定功能。 二、函数的定义 函数定义主要有5个步骤&#xff1a; 返回值类型函数名参数列表函数体语句ret…

Node.js安装与配置:从零开始构建高效的开发环境

在当今互联网时代&#xff0c;Node.js已经成为了许多开发者心目中的首选技术栈之一。它的轻量级、高效性以及广泛的生态系统&#xff0c;使得它在构建Web应用、后端服务以及大规模数据处理等方面表现出色。然而&#xff0c;要充分利用Node.js的潜力&#xff0c;首先需要正确地安…

上海计算机学会 2024年4月月赛 丙组T1 最大公约数

第一题&#xff1a;T1最大公约数 标签&#xff1a; g c d gcd gcd题意&#xff1a;求 a a a和 b b b的最大公约数&#xff08; 1 ≤ a , b ≤ 1 , 000 , 000 , 000 1≤a,b≤1,000,000,000 1≤a,b≤1,000,000,000&#xff09;题解&#xff1a;辗转相除法 g c d ( a , b ) g c …

Laravel 6 - 第十二章 控制器

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

QService 服务 指令引用的“0x00000000”内存。该内存不能为“read“

QtServiceBase类在Qt框架中是设计用来简化Windows服务或类Unix守护进程创建的。这个类提供了一组方法和属性&#xff0c;使得开发者能够专注于服务逻辑&#xff0c;而不必担心操作系统层面的细节。下面是一些QtServiceBase类中常用的属性和方法&#xff1a; 常用方法 start():…

【Linux】Linux权限管理详解

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 1. Linux权限概念2. 文件访问者分类a) 文件和目录的访问者&#xff1a;b) 文件类型和访问权限 3. 文件权限值的表…

安装VCenter 7 对硬件资源的需求

安装VMware vCenter Server 7.x 对硬件资源的需求主要包括以下方面&#xff1a; 服务器硬件&#xff1a; 处理器&#xff1a;64位 x86架构&#xff0c;推荐采用多核CPU以支持高并发管理和运行多个虚拟机。具体数量取决于vCenter Server将管理的虚拟机规模及复杂度。内存&#x…

第四百七十七回

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"Get包简介"相关的内容&#xff0c;本章回中将介绍GetMaterialApp组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经…

K-近邻算法的 sklearn 实现

实验目的与要求 掌握基于 K-近邻分类算法的编程方法通过编程理解 K-近邻分类算法和该算法的基本步骤 实验器材 硬件&#xff1a;PC 机&#xff08;参与实验的学生每人一台&#xff09;软件环境&#xff1a;Python3.7 Pycharm 实验内容 使用 sklearn 库中的 neighbors 模块实…

idrac管理界面报错:RAC0508: 发生意外错误。

在idrac服务器-服务模块&#xff0c;看到如下报错信息&#xff1a; RAC0508: 发生意外错误。 等待几分钟然后刷新页面。 如果问题仍然存在&#xff0c;请联系服务提供商。 经查询&#xff0c;还是不知道是啥问题。 经查询&#xff0c;发现可能是数据库方面的报错&#xff0c;不…

xgp怎么取消续费 微软商店xgp会员取消自动续费详细教程

xgp怎么取消续费 微软商店xgp会员取消自动续费详细教程 XGP这个游戏平台小伙伴们并不陌生吧&#xff0c;它是微软Xbox游戏部门推出的游戏租赁制会员服务&#xff0c;主要用于主机和PC两个平台。这个平台的会员就可以免费享受多款大制作游戏&#xff0c;而且每个月还会自动更新…

Java中的运算符

运算符是用于数学函数、一些特殊的赋值语句和逻辑比较方面的特殊符号。 赋值运算符&#xff08;“”&#xff09; 赋值运算符是一个二元运算符&#xff08;即对两个操作数进行处理&#xff09;&#xff0c;功能是将右侧的操作数赋值给左侧的操作数。 int a 100; 该表达式就…