当前位置: 首页 > news >正文

MyBatis的动态SQL语句

文章目录

  • 前言
    • LocalDate
    • 数据库代码
    • po 包
  • if+where 标签 查
  • trim 标签 增
  • set 标签 改
  • foreach 标签 删


前言

提示:这里可以添加本文要记录的大概内容:

查询条件是动态的

MyBatis的动态SQL语句是指在运行时根据不同条件选择不同的SQL语句执行。
这些条件可以是参数值、条件语句、动态标签等。
动态SQL语句的编写可以有效地减少重复代码

LocalDate

在 Java 8 中,LocalDatejava.time 包中的一个类,表示一个日期(年、月、日)。为了创建一个 LocalDate 对象,需要使用 LocalDate.of() 方法,该方法接受三个参数:年、月、日。

例如:

LocalDate date = LocalDate.of(2022, 9, 1);

这将创建一个 LocalDate 对象,表示 2022 年 9 月 1 日。

在你的代码中,为了将生日传递给 Cust 对象,你需要使用 LocalDate.of() 方法来创建一个 LocalDate 对象,并将其传递给 Cust 构造函数。例如:

Cust cust = new Cust(null, "吴三", "17446541321", LocalDate.of(2008, 5, 12), 10.0);

这将创建一个 Cust 对象,并将生日设置为 2008 年 5 月 12 日。

所以,你需要注意的是,LocalDate 是一个类,而 LocalDate.of() 是用于创建 LocalDate 对象的方法。

具体使用:

LocalDate 类提供了一个静态方法 of(int year, int month, int dayOfMonth),该方法允许创建一个指定年份、月份和日期的 LocalDate 对象。

以下是使用 LocalDate.of() 方法创建 LocalDate 对象的步骤:

  1. 导入 java.time.LocalDate 类:
   import java.time.LocalDate;
  1. 使用 of() 方法创建 LocalDate 对象:
   LocalDate date = LocalDate.of(year, month, dayOfMonth);

其中 year、month 和 dayOfMonth 分别代表年份、月份和日期,是整数类型的值:

   LocalDate date = LocalDate.of(2022, 10, 1);

创建了一个 LocalDate 对象,表示 2022 年 10 月 1 日。

  1. 处理 LocalDate 对象:

    一旦创建了一个 LocalDate 对象,可以使用它来执行各种操作,例如:

    • 获取日期的年份、月份和日期:
     int year = date.getYear();int month = date.getMonthValue();int day = date.getDayOfMonth();
  • 获取星期几:
     DayOfWeek dayOfWeek = date.getDayOfWeek();
  • 进行日期计算:
     LocalDate plusDays = date.plusDays(7); // 返回一周后的日期LocalDate minusMonths = date.minusMonths(2); // 返回两个月前的日期
  • 比较日期:
     LocalDate otherDate = LocalDate.of(2022, 10, 2);boolean isBefore = date.isBefore(otherDate); // 返回 trueboolean isAfter = date.isAfter(otherDate); // 返回 falseboolean isEqual = date.isEqual(otherDate); // 返回 false

这些就是使用 LocalDate.of() 方法创建和处理 LocalDate 对象的步骤。

数据库代码

这里以客户表为例

CREATE TABLE cust (id INT PRIMARY KEY auto_increment,         # idname VARCHAR(50) NOT NULL,    # 姓名phone VARCHAR(20),      # 电话birthday DATE,          # 出生日期balance DOUBLE          # 余额
);
INSERT INTO cust (id, name, phone, birthday, balance) VALUES (1, '张三', '13611111111', '1990-01-01', 1000.00);INSERT INTO cust (id, name, phone, birthday, balance) VALUES (2, '李四', '13722222222', '1995-02-02', 2000.00);INSERT INTO cust (id, name, phone, birthday, balance) VALUES (3, '王五', '13833333333', '1985-03-03', 3000.00);

po 包

新建项目后完善 pom.xml 文件、mybatis 的配置文件、log4j 的日志文件

在 main/java 文件中新建包 mapper 和 po

po 包代码:这里面有个Date类型,要注意!

public class Cust {private Integer id;private String name;private String phone;private Date birthday;private double balance;// 为了模糊查询某个时间段private Date startTime;private Date endTime;// 自动生成 Getter、Setter、toString()、有参无参方法
}

提示:以下是本篇文章正文内容,下面案例可供参考

if+where 标签 查

if+where语句可以根据条件动态构建where子句,以过滤查询结果。

在 mapper 包内新建接口文件和与之同名的映射文件
映射文件中的namespace必须是接口的限定名

先写接口文件:
在模糊查询功能中,输入 id 按照 id 查询,输入名字按照名字查询,输入手机号按照手机号查询,所以返回值是多个,查询多个用List

public interface CustMapper {List<Cust> queryCusts(Cust cust);
}

复制方法名回到映射文件粘贴到 id

下面模糊查询某个时间段的映射文件代码:

<mapper namespace="com.mybatis.mapper.CustMapper"><!-- 动态的where条件 --><select id="queryCusts" parameterType="Cust" resultType="Cust">select * from cust<where><if test="startTime != null">and birthday &gt;=#{startTime}</if><if test="endTime != null">and birthday &lt;=#{endTime}</if></where></select>
</mapper>

以上代码中,映射文件中的 select 语句使用了动态的 where 条件,其中的 if 标签用于判断 startTime 和 endTime 是否为 null,若不为 null,则生成相应的SQL语句。
若输入了 startTime,则添加一个条件为 birthday>=startTime 的 where 子句;
若输入了 endTime,则添加一个条件为 birthday<=endTime 的 where 子句。

测试代码(模糊查询某个时间段):

    @Testpublic void where() throws Exception {CustMapper mapper = session.getMapper(CustMapper.class);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date startTime = sdf.parse("1990-01-01");Date endTime = sdf.parse("1999-12-31");Cust cust = new Cust();cust.setStartTime(startTime);cust.setEndTime(endTime);mapper.queryCusts(cust);}

在测试代码中,将 startTime 和 endTime 分别解析成日期格式,并通过set方法设置到Cust 对象中,作为参数传递给 queryCusts 方法进行查询。
在这里插入图片描述
如果是模糊查询 id、姓名、手机号:
映射文件代码:

<mapper namespace="com.mybatis.mapper.CustMapper"><!-- 动态的where条件 --><select id="queryCusts" parameterType="Cust" resultType="Cust">select * from cust<where><if test="id != null">and id = #{id}</if><!-- 类型是String,也不能等于空 --><if test="name != null and name != '' ">and name like concat('%',#{name},'%')</if><if test="phone != null and phone != '' ">and phone like concat('%',#{phone},'%')</if> </where></select>
</mapper>

测试代码(模糊查询 id、姓名、手机号):

	@Test public void where() {CustMapper mapper = session.getMapper(CustMapper.class);Cust cust = new Cust(null, "三", null,null,1000.0);mapper.queryCusts(cust);}

在测试代码中创建了一个Cust 对象,只设置了 name 属性值为"三",然后调用queryCusts 方法进行查询。因为 id 和 phone 属性值为null,所以查询条件中只会有name 相关的查询语句。此时,查询结果会返回所有名字包含"三"的记录。

需要注意的是,测试代码中设置的name值必须是一个非空字符串才会被加入到查询条件中。如果 name 属性值为 null 或空字符串,那么查询条件中不会包含对 name 的筛选。

查询结果:
在这里插入图片描述

trim 标签 增

Trim语句:可以包装一组语句,去除多余的空格或逗号;

mapper接口的代码:

void insertCust(Cust cust);

在映射文件增加对应的语句:
增加客户信息

<insert id="insertCust" parameterType="Cust" useGeneratedKeys="true" keyProperty="id">insert into cust<trim prefix="(" suffix=")" suffixOverrides=",">id, name,<if test="phone != null and phone != '' ">phone,</if><if test="birthday != null">birthday,</if><if test="balance != null">balance,</if></trim><trim prefix="values(" suffix=")" suffixOverrides=",">#{id}, #{name},<if test="phone != null and phone != '' ">#{phone},</if><if test="birthday != null">#{birthday},</if><if test="balance != null">#{balance},</if></trim>
</insert>

接下来是测试:【注意: LocalDate】当然前面的类型也要改

	@Testpublic void trim() {CustMapper mapper = session.getMapper(CustMapper.class);Cust cust = new Cust(null, "吴三", "17446541321", LocalDate.of(1998, 6, 12), 10.0);mapper.insertCust(cust);}

在这里插入图片描述

set 标签 改

set语句:可用于构建UPDATE语句的SET子句;

mapper接口的代码:

void updateCust(Cust cust);

在对应的映射文件中:

根据 id 更改名字 和 电话号码

    <update id="updateCust" parameterType="Cust">update cust<set><if test="name != null and name != '' ">name = #{name},</if><if test="phone != null and phone != '' ">phone = #{phone},</if></set>where id = #{id}</update>

测试类代码:

	@Testpublic void set() {CustMapper mapper = session.getMapper(CustMapper.class);Cust cust = new Cust(10, "刘兆儿", "1459745610",null,1000.0);mapper.updateCust(cust);}

控制台:
在这里插入图片描述

foreach 标签 删

Foreach语句:用于遍历集合或数组,可以重复执行SQL语句;

可能要删多个数据,可以用数组(array)或 集合(list)

mapper接口的代码:

    void deleteCusts(int[] ids);

在对应的映射文件中:

    <delete id="deleteCusts" parameterType="int">delete from cust where id in<foreach collection="array" item="no" open="(" close=")" separator=",">#{no}</foreach></delete>

测试类代码:

	@Testpublic void foreach() {CustMapper mapper = session.getMapper(CustMapper.class);// idint [] nos = {1,2,3,4,5};mapper.deleteCusts(nos);}

在这里插入图片描述

相关文章:

MyBatis的动态SQL语句

文章目录 前言LocalDate数据库代码po 包 ifwhere 标签 查trim 标签 增set 标签 改foreach 标签 删 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 查询条件是动态的 MyBatis的动态SQL语句是指在运行时根据不同条件选择不同的SQL语句执行。 这些条件可…...

交互式AI技术与模型部署:bert-base-chinese模型交互式问答界面设置

使用Gradio实现Question Answering交互式问答界面&#xff0c;首先你需要有一个已经训练好的Question Answering模型&#xff0c;这里你提到要使用bert-base-chinese模型。 Gradio支持PyTorch和TensorFlow模型&#xff0c;所以你需要将bert-base-chinese模型转换成PyTorch或Te…...

Edge浏览器安装vue devtools

1. 下载地址 GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications. 2. 下载后的压缩包解压并打开文件夹&#xff0c;右键选择&#xff1a;git bush here 3. 安装依赖 npm install 4. 成功安装依赖后打包 npm run build...

zookeeper基础

安装 https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/ 命令 bin/zkServer.sh start bin/zkServer.sh stop bin/zkServer.sh status bin/zkCli.sh ll / quit 各个配置项的含义&#xff1a; tickTime&#xff1a;每个时钟周期的毫秒数。ZooKeeper使用一个内部…...

【C++】类与对象(2)

文章目录 前言一、类的6个默认成员函数二、构造函数1.概念2.特性3.初始化列表 三、析构函数1.概念2.特性 四、拷贝构造函数1.概念2.特性 五、赋值运算符重载1.运算符重载2.赋值运算符重载3.前置和后置重载 六、取地址及const取地址操作符重载总结 前言 在前面&#xff0c;给大…...

数据结构——绪论

一、绪论 &#xff08;一&#xff09;基本概念 数据&#xff1a;数据是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;在计算机程序中通常作为一个整…...

Docker Dockerfile 语法与指令

一、简介 Docker 镜像原理、容器转成镜像 随便找个案例&#xff0c;进入 https://hub.docker.com/ 搜索 centos&#xff0c;然后随便找个版本&#xff08;例如&#xff1a;centos7&#xff09;点击一下&#xff0c;就会进入 centos7 的 dockerfile 文件&#xff1a; // 空镜像…...

【LeetCode每日一题】——566.重塑矩阵

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 566.重塑矩阵 四【题目描述】 在 MATLAB 中&…...

Manim(一款强大的数学可视化动画引擎)学习历程

相逢情便深&#xff0c;恨不相逢早 第一眼看见上面这种类型的视频我就深深被它的简约清楚所折服&#xff0c;我觉得它完全符合我的审美&#xff0c;我也相信只要了解过制作这种视频的软件的人都会喜欢上它。运用这种风格比较有名的是b站里的一位up主名叫3Blue1Brown&#xff0…...

powershell脚本写一个托盘图标

1、准备ico格式图标 star_bethlehem_icon 文件名改为star.ico 2、安装VSCode 如何下载安装VSCode 扩展&#xff1a;PowerShell扩展 3、创建项目 1、运行PowerShell命令 mkdir trayicon_ps1;cd trayicon_ps1;New-Item trayicon.ps1;code .2、将star.ico放入trayicon_ps1文…...

前端Vue入门-day08-vant组件库

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 vant 组件库 安装 导入 全部导入 按需导入 浏览器配饰 Viewport 布局 Rem 布局适配 vant 组件库 …...

华为OD机考--【磁盘容量排序】

■ 题目描述 【磁盘容量排序】 磁盘的容量单位常用的有M&#xff0c;G&#xff0c;T这三个等级&#xff0c;它们之间的换算关系为1T 1024G&#xff0c;1G 1024M&#xff0c;现在给定n块磁盘的容量&#xff0c; 请对它们按从小到大的顺序进行稳定排序&#xff0c;例如给定5…...

实现弧形切角两种方式

1、css 的 radial-gradient <view style"padding:30px; background: #ccc;"><view class"navActive"></view> </view>.navActive{width: 200px;height: 40px;background-color: #fff;color: rgb(0,63,136);position: relative;bor…...

什么是强化学习?

&#x1f4dd;什么是强化学习&#xff1f; 1. &#x1f4dd;监督&#xff0c;非监督&#xff0c;强化2. &#x1f4dd;非 i.i.d3. &#x1f4dd;强化学习基本形式4. &#x1f4dd;马尔可夫过程 &#x1f31f; 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#x…...

如何在Linux系统上安装cpolar内网穿透

如何在Linux系统上安装cpolar内网穿透 文章目录 如何在Linux系统上安装cpolar内网穿透 cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系…...

分布式软件架构——内容分发网络

内容分发网络&#xff08;CDN&#xff0c;Content Distribution Network或Content Delivery Network&#xff09; 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现…...

【HAL库】STM32CubeMX开发----STM32F407----LAN8720A----移植FreeModbus实现ModbusTCP

前言 本次实验以 STM32F407VET6 芯片为MCU&#xff0c;使用 25MHz 外部时钟源。 以太网PHY层芯片为 LAN8720A&#xff0c;移植FreeModbus实现ModbusTCP网口通信。 具体内容参考文章&#xff1a;【HAL库】STM32CubeMX开发----STM32F407----ETHLAN8720ALWIP----ping通 本次移植…...

11-矩阵(matrix)_方阵_对称阵_单位阵_对角阵

矩阵及其运算 [ a 11 ⋯ a 1 n ⋯ ⋯ ⋯ a m 1 ⋯ a m n ] \begin{bmatrix} a_{11} & \cdots & a_{1n} \\ \cdots & \cdots & \cdots \\ a_{m1} & \cdots & a_{mn} \\ \end{bmatrix} ​a11​⋯am1​​⋯⋯⋯​a1n​⋯amn​​ ​ 矩阵就是二维数组&…...

AWS多账户单点登录 IAM Identity Center(AWS SSO)

需求场景 多个aws账户&#xff0c;登陆麻烦且不安全&#xff0c;SSO单点功能并且外部身份提供者 — 如果您要管理外部身份提供者&#xff08;IdP&#xff09;&#xff08;例如 Okta 或 Active Directory&#xff09;中的用户。 官方文档&#xff1a;https://docs.aws.amazon.c…...

实验2-3-3 求奇数分之一序列前N项和 (15 分)

实验2-3-3 求奇数分之一序列前N项和 &#xff08;15 分&#xff09; 本题要求编写程序&#xff0c;计算序列 1 1/3 1/5 … 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后6位。…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...