【笔记学习篇】一篇文章搞定Mybatis-快速回顾

news2024/12/23 5:21:56

在这里插入图片描述

概述

5.1.1 Mybatis简介
Mybatis是一款优秀的持久层框架,它以sql为中心,支持定制化sql、存储过程以及高级映射。
使用Mybatis框架,可以无需手动编写基础的JDBC代码、无需手动设置参数和转换结果集到对象。
Mybatis可以使用简单的xml或注解来配置和映射原声类型、接口和Java的pojo为数据库中的记录。
Mybatis框架本身是对JDBC的轻量级封装,学习成本低,而sql语句也方便优化,执行效率高,使用灵活,更加适合在电商等互联网项目中使用。

Mybatis的简介

在介绍Mybatis框架时,以mysql数据库操作为例。
首先,创建一个用户表作为后续讲解的操作基础,表结构如图5.1所示:
在这里插入图片描述

其次,创建g_ac_user表,并添加一条记录:

在这里插入图片描述

Mybatis底层也是基于JDBC的,与数据库之间的访问操作通过JDBC完成。

JDBC全称为Java Database Connectivity,是一种用于执行sql语句的Java API,可以为多种关系数据库提供统一访问接口。JDBC隔离了操作不同数据库的访问差异。

(2)JDBC访问操作数据库流程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一般来说,JDBC代码耦合性强,需要在代码中拼接sql语句,编码与传参方式不灵活,同时每一次操作都需要创建与销毁连接。
Mybatis框架针对这些不足有相应的解决方案。使用Mybatis框架后,可以在xml中写sql语句,使sql语句与Java代码分离。

5.2 Mybatis初探

在g_ac_user数据表定义的基础上,介绍Mybatis框架使用的基本流程。
现在通过定义一个非常简单的需求–根据id查询用户详情,来完成第一个Mybatis程序。

1.添加依赖库
首先,需要添加Mybatis的依赖包,这里主要是引入mysql的驱动包。

在这里插入图片描述

2.在build中添加资源引入配置

2.在build中添加资源引入配置

在这里插入图片描述
3.创建实体类
在这里插入图片描述
4.创建对应数据表
创建数据库语句
在这里插入图片描述

创建数据表语句,这里设置主键id为自动递增:

在这里插入图片描述

  1. 添加xml映射文件

在这里插入图片描述

  1. 添加mybatis.xml配置文件
    在这里插入图片描述
  2. 测试

每个基于 Mybatis的应用都是以一个SqlSessionFactory的实例为核心的。

SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而
SqlSessionFactoryBuilder则可以从xml配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

Mybatis封装了对数据库的访问,把对数据库的会话和事务控制放到了SqlSession对象中。
Mybatis操作数据库有两种方式:
(1)从ibatis继承的传统的SqlSession接口操作
(2)使用Mapper的操作方式
接下来结合实例看看这两种方式。

Mybatis操作数据库有两种方式:
(1)从ibatis继承的传统的SqlSession接口操作

在这里插入图片描述
在这里插入图片描述

Mybatis操作数据库有两种方式:
(2)使用Mapper的操作方式

在这里插入图片描述

在这里插入图片描述
Mybatis操作数据库有两种方式:
以上两种操作方式的输出结果是一致的,输出结果为:

在这里插入图片描述

5.3.1 Xml映射文件

在Mybatis框架中,数据库操作映射是由xml配置文件和mapper映射方法共同组成的。随后分别对数据库操作常用的增删改查操作的配置方式进行简要介绍。

数据库常用操作配置方式

  1. 增加:
    (1)不传参
    在这里插入图片描述

上述是最简单的方式,在语句中直接给sql语句写上固定的值,然后对应的mapper方法只需要写成:
在这里插入图片描述

数据库常用操作配置方式

  1. 增加:
    (2)parameterType指定类型
    在这里插入图片描述

对应的mapper方法如下:
在这里插入图片描述

数据库常用操作配置方式

  1. 增加:
    (3)@Param注解指定名称
    在这里插入图片描述
    对应的mapper方法:
    在这里插入图片描述
    数据库常用操作配置方式
  2. 删除:
    在delete标签中写删除语句::
    在这里插入图片描述
    对应mapper接口方法
    在这里插入图片描述

数据库常用操作配置方式
3. 修改:
在delete标签中写修改语句:

对应mapper接口方法:

在这里插入图片描述在这里插入图片描述
数据库常用操作配置方式
4. 查询:
在select标签中写查询语句:
在这里插入图片描述

对应mapper接口方法:
在这里插入图片描述
数据库常用操作配置方式
4. 查询:
(1)模糊查询
在sql中模糊查询使用like关键词,在之前的学习中了解到等号的使用方式就是直接在等号后面写上变量即可,那么like在Mybatis中怎么使用呢?
方法一:方法一:使用模板变量
在这里插入图片描述

方法二:使用双引号包裹%

在这里插入图片描述

方法三:CONCAT函数连接字符串

在这里插入图片描述

数据库常用操作配置方式
4. 查询:
(2)结果映射
resultMap是Mybatis中提供的一个非常强大的功能,虽然通过resultType=java.util.HashMap也可以来指定返回值的包装,在大部分情况下都够用,但是HashMap不是一个较好的领域模型。
更多的会使用JavaBean和POJO作为领域模型,Mybatis对两者都提供了支持,但两者不能同时使用。

数据库常用操作配置方式
4. 查询:
(2)结果映射
select的resultMap值对应resultMap标签的id,实例如下。

在这里插入图片描述

数据库常用操作配置方式
4. 查询:
(3)结果缓存
Mybatis缓存机制有两级,一级缓存已经自动开启,无需手动操作,而且不能关闭;二级缓存需要手动开启。
开启方式:在全局配置文件的settings标签中增加或修改如下配置:
在这里插入图片描述

然后在响应的xml映射文件中增加cache标签:
在这里插入图片描述

数据库常用操作配置方式
4. 查询:
(3)结果缓存
cache元素用来开启当前mapper的namespace下的二级缓存,该元素的属性设置如下:
flushInterval:刷新间隔,可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段,默认情况下是不设置的,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size:缓存数目,可以被设置为任意正整数,要记住缓存对象数目和运行环境可用内存资源数目,默认值是1024。

readOnly:只读,属性可以被设置为true或false。因为只读的缓存会给所有调用者返回缓存对象的相同实例,所以这些对象不能被修改。这提供了很重要的性能优势,可读写的缓存会返回缓存对象的拷贝(通过序列化),这个操作会慢一些,但是安全,因此默认是false。
eviction:收回策略,默认为LRU,有如下几种:
LRU:最近最少使用的策略,移除最长时间不被使用的对象。
FIFO:先进先出策略,按对象进入缓存的顺序来移除它们。
SOFT:软引用策略,移除基于垃圾回收器状态和软引用规则的对象。WEAK:弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象。

5.3.2 动态sql语句

动态sql语句也是Mybatis非常强大的一个特性,可以让开发者在sql语句编写过程中减少出错的几率。
动态sql语句通过使用类似xml的语法来进行逻辑的判断与处理,Mybatis 3通过使用功能强大的OGNL表达式,大大精简了元素的种类,使得学习成本更低了。
在动态sql语句中,#方式能很大程度防止sql注入, 方式无法防止 s q l 注入。 方式无法防止sql注入。 方式无法防止sql注入。一般用于传入数据库对象,比如表名、列名。KaTeX parse error: Expected 'EOF', got '#' at position 47: …其安全性受到更多威胁,一般能用#̲的就尽量不用
动态sql相关标签包括条件、循环、关联和包含几个分类。

(1)条件型
根据条件判断是否拼接语句,包含标签组if、choose(when、otherwise)、trim等。

  1. if、where
    通常作为where子句的一部分。一般用来根据前端传过来的条件进行筛选,比如当前端要在设备列表中根据设备名称查询设备列表。

  2. if、where
    在传统的写法中,为了减少后续代码的判断,通常会在where后跟上一个1=1这样一个无意义的条件,以方便后续的条件拼接,如:

在这里插入图片描述

  1. if、where
    如果放在where标签内,则where标签会自动帮助开发者判断,当where中的条件有一项if是true而拼接了and或or语句,那么就会自动将where加上;否则将不会加上where。

在这里插入图片描述
2. chose
主要包含的标签有以下两个:
when
Otherwise
choose标签包含when和otherwise两个子标签,来实现在多个选项中进行判断的逻辑。有些类似于Java代码中switch语句。

  1. chose
    在Mybatis中没有else标签,要实现if、elseif、else功能,也需要借助于这个标签来实现。这里实现当前端不传某个设备状态的时候,查询的设备列表中不包含标记为“已删除”状态的设备,示例语句如下:
    在这里插入图片描述

  2. chose
    虽然在大部分情况下,前面的条件判断标签已经能满足日常使用的需求,但是假如在特殊场景下,用户依然会有灵活控制的需求。
    通过trim标签,可以实现类似于自定义标签的功能,实现更灵活的控制。下面以实现一个where为例,与where标签等价的trim标签如下

在这里插入图片描述

循环型主要使用foreach标签。foreach标签对集合进行操作,可以用来进行多条数据的插入或更新,以及查询语句的自动拼接。
(1)根据id数组查询列表

在这里插入图片描述

对应的mapper接口方法:

在这里插入图片描述
(2)批量插入
模板sql语句:

在这里插入图片描述

对应的mapper接口方法
在这里插入图片描述

(3)关联

关联查询一般有两种方式,分别是“嵌套结果”和“嵌套查询”。
嵌套查询的语句一般结构简单,但是在一次查询中要执行多条sql语句,效率会比较低;嵌套结果的语句结构比较复杂,但是语句只执行一次,性能相对高一些。
关联查询的场景包括一对一、一对多、多对一。

  1. 一对一
    示例:如果一条账号信息对应一条用户信息,那么登录表和用户表就是一对一的关系。所以,需要先创建账号信息表和身份信息表,再定义映射文件。
    在这里插入图片描述

  2. 一对一
    创建账号信息表:

在这里插入图片描述

创建身份信息表:
在这里插入图片描述

  1. 一对一
    定义sql映射文件
    方法一:嵌套结果(实际上就是通过join表连接查询,然后通过resultMap指定返回值结构包装)

在这里插入图片描述

  1. 一对一
    定义sql映射文件
    方法二:嵌套查询:实际是做多次查询,将表之间关联的数据关系拆分为多条语句执行。

在这里插入图片描述

  1. 一对一
    定义sql映射文件
    方法二:嵌套查询:实际是做多次查询,将表之间关联的数据关系拆分为多条语句执行。

在这里插入图片描述

  1. 一对多
    这里,假设一个账号对应多条用户信息。
    指定collection标签的property属性,通过select属性指定下一步查询使用的语句id,通过column属性向下一步查询传递参数。

  2. 一对多
    方法一:嵌套结果

在这里插入图片描述

  1. 一对多
    方法一:嵌套查询

在这里插入图片描述

  1. 多对一
    人员属于某个单位,这里创建单位表,包含字段id、unit_name
    方法一:嵌套结果

在这里插入图片描述

  1. 多对一
    方法二:嵌套结果

在这里插入图片描述

面向对象的三大特性,封装是其中之一。
Mybatis也提供了include和sql标签来实现包含的功能。可以通过sql标签定义通用语句,比如将条件查询拆分然后在多处引用,Mybatis会在编译阶段将其合并。
比如对于查询用户列表,拆分前如下代码所示,条件判断只能在这一处使用。

在这里插入图片描述

拆分后,将if条件判断放入sql标签内,那么whereCondition就是一个可复用的语句块,可以在多个地方引用,减少代码重复。
在这里插入图片描述

5.3.2* mapper

Mybatis中的mapper就是指Mybatis执行数据库操作的接口和方法,在非注解模式下还包括与当前mapper类所对应的xml文件。
在Mybatis提供的功能中,可以直接在java mapper接口上及其方法参数上使用注解,可用注解如下:
@Insert : 新增 , 和xml insert sql语法完全一样;
@Select : 查询, 和xml select sql语法完全一样;
@Update : 更新, 和xml update sql语法完全一样;
@Delete : 删除, 和xml delete sql语法完全一样;
@Param : 入参,通过value指定sql语句中可用的参数名称;
@Results : 结果集合;
@Result : 结果。

5.3.3 Mybatis的xml配置

xml映射配置文件包含了对Mybatis框架运行较为重要的settings、properties和typeAliases信息等,以下分别予以介绍。

  1. properties
    这些属性都是可以外部配置并且可以动态替换的,既可以在典型的Java属性文件中配置,也可以通过properties元素的子元素来传递,例如:

在这里插入图片描述

  1. properties
    其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值,比如
    在这里插入图片描述

driver和url属性将会由config.properties文件中对应的值来替换,这样就为配置提供了诸多灵活选择,属性也可以被传递到SqlSessionBuilder.build()方法中。例如:

在这里插入图片描述

  1. properties
    如果属性在多个地方进行了配置,那么Mybatis加载的顺序为:
    (1)在properties元素体内指定的属性首先被读取
    (2)然后根据properties元素中的resource属性读取类路径下的属性文件,或者根据url属性文件或根据url属性指定的路径读取属性文件,并覆盖已经读取的同名属性。
    (3)最后读取作为方法参数传递的属性,并覆盖已经读取的同名属性。
    因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,properties中指定属性优先级最低。以下对Mybatis配置中的重要参数进行介绍。

  2. settings
    这是Mybatis中极为重要的参数调整,它们会改变Mybatis的运行时行为。一个完整的settings元素的示例如下:
    在这里插入图片描述

  3. typeAliases
    类型别名是为Java类型设置一个短的名字,它只和XML配置有关,存在的意义仅在于用来减少类完全限定类型的冗余,例如:
    在这里插入图片描述

当这样配置时,Blog不仅可以用在任何使用domain.blog.Blog的地方,也可以指定一个包名,Mybatis会在包名下搜索需要的Java Bean,比如:

在这里插入图片描述

每一个在包domain.blog中的Java Bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为它的别名。(比如domain.blog.Author的别名为author;若有注解,则别名为其注解值。)

5.3.4 日志

一般来说,Mybatis内置日志工厂在运行时选择合适的日志工具,并且内置的日志工厂将从以下日志实现中按顺序查找。

  1. slf4j
  2. Apache Commons Logging
  3. Log4j 2
  4. Log4j
  5. JDK Logging
    如果未找到,那么日志功能不启用。

一些Java服务器中已经内置了Apache Commons Logging的实现,所以当Mybatis的运行环境在这些服务器中时,需要在配置文件中添加一个setting配置。

5.3.4 日志
日志输出需要用到src/main/resources下的log4j.properties配置文件,示例如下:
logImpl可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口org.apache.ibatis.logging.Log 的,且构造方法是以字符串为参数的类的完全限定名。

在这里插入图片描述

5.4.1 代码生成

在代码编写过程中,其中一项比较繁琐的工作就是各种目录和文件的创建,以及其中基础内容的添加。这些工作如果完全由人工手动完成,那么将占用开发者大量时间在这样的重复工作之中,这个时候,代码生成器就是至关重要的了。
Mybatis通过Mybatis Generator提供代码生成的功能。
要使用Mybatis Generator提供的代码生成功能,需要引入相关的jar包。

(1)添加配置文件
在src/main/resources中新增generator-config.xml配置文件,配置数据库连接、指定生成的文件和位置,以及所要生成的数据库表。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(1)添加配置文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(2)生成方式
通常来说,生成方式主要有如下几种:
命令行方式
使用ant
使用maven
使用Java代码
Eclipse插件
下面分别对命令行生成、Java代码生成和Eclipse插件生成三种方式进行简要介绍。

插件机制是使用框架编程过程中一种非常优秀的机制,可以在不改动原有程序文件代码的情况下实现功能的扩展。 Mybatis允许在映射语句执行的某一点进行拦截增强,默认情况下,Mybatis可以被拦截的接口和方法有列举如下:
Executor(update、query、flushStatements、commint、rollback、getTransaction、close、isClosed)
ParameterHandler(getParameterObject、setParameters)
ResultSetHandler(handleResultSets、handleOutputParameters)
StatementHandler(prepare、parameterize、batch、update、query)
由于这些都是Mybatis的基础模块,所以编写插件的时候需要非常小心,以免影响Mybatis本身功能的稳定性。

(1)插件模板
Mybatis插件实现org.apache.ibatis.plugin.Interceptor接口,在实现类中进行插件功能逻辑的编写。Interceptor接口的结构如下:

在这里插入图片描述

从结构上可以看到包含3个方法需要实现:
1.intercept方法:是拦截器实现的主要方法。这种实现方法及命名在其它框架中也有使用,插件所需要做的主要操作逻辑也应该是在这个方法内部完成的。
2.plugin方法:这个函数中的参数target就是被拦截器拦截的对象,此方法会在目标对象执行前被调用,方法的实现很简单,只需要调用org.apache.ibatis.plugin.Plugin类的静态方法wrap即可拦截目标对象.
3.setProperties方法:是用来传递插件的参数,不同的参数可以影响插件的行为。这里的参数通过在mybatis-config.xml文件中配置插件来传入

(2)注解配置拦截器及签名
除了需要实现拦截器接口之外,还需要给实现类配置拦截器添加注解org.apache.ibatis.plugin.@Interceps和org.apache.ibatis.plugin.@Signature。这两个注解是用来配置拦截器要拦截的接口的方法。配置签名如下:

在这里插入图片描述

5.5.2 插件使用

打开前面“开发第一个Mybatis程序中的UserMapper类”,按着键盘ctrl键,然后将鼠标移动到接口方法上,可以看到其中多了一个选项“Open … in *.xml”,这就是mybatipse插件对于提示功能的增强,如图5.11所示。

在这里插入图片描述

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

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

相关文章

App测试时常用的adb命令

adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

银发产业资讯丨蚂蚁集团、金城药业、百联集团、京东健康布局业务

银发经济『新趋势大数据』 AgeNews 每日银发产业大事件速览 2024-10-8 星期二 AgeClub整理 金融监管总局:鼓励险企提供更多养老保障服务 蚂蚁集团等签署合作协议,聚焦智慧医疗领域 金城医药等合作聚焦年长女性健康科技领域 京东健康助力四川发放…

Internet Download Manager6.42免费版下载神器新体验

🚀 开篇就燃!你的下载速度被“TA”承包了 #### 🌟 初识IDM 6.42,下载界的“超跑”驾到 各位追求效率的小伙伴们,今天小红要来揭秘一款让我彻底告别“龟速”下载的神器——Internet Download Manager (简称IDM) 6.42版&…

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中,“股票”可以说: • 株(かぶ) 这是最常用的表达方式,直接表示“股票”。 例如: 株を買う - 买股票 株を売る - 卖股票 • 株式(かぶしき) 这个词也是“股票”的意…

学习文档(二)

异常 这是Java 异常类层次结构图概览: Exception 和 Error 有什么区别? 一、概念与本质 Exception(异常):异常是在程序运行过程中出现的可预料的、可恢复的不正常情况。例如,试图打开一个不存在的文件时&#xff0…

【数据结构-栈】【位运算优化】力扣3170. 删除星号以后字典序最小的字符串

给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时,你可以执行以下操作: 删除最左边的 ‘’ 字符,同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典…

【C++篇】虚境探微:多态的流动诗篇,解锁动态的艺术密码

文章目录 C 多态详解(进阶篇)前言第一章:多态的原理1.1 虚函数表的概念1.1.1 虚函数表的生成过程 1.2 虚表的存储位置 第二章:动态绑定与静态绑定2.1 静态绑定2.1.1 静态绑定的实现机制:2.1.2 示例代码: 2.…

从0到1:小区业主决策投票小程序开发笔记

可研 小区业主决策投票小程序: 便于业主参与社区事务的决策,通过网络投票的形式,大大节省了业委会和业主时间,也提高了投票率。其主要功能:通过身份证、业主证或其他方式确认用户身份;小区管理人员或业委会…

YOLO5的修改

在传统的yolov5网络中并不存在注意力机制,但是源代码中存在相关简略的代码: def __init__(self, c, num_heads):"""Initializes a transformer layer, sans LayerNorm for performance, with multihead attention and linear layers.See …

prometheus client_java实现进程的CPU、内存、IO、流量的可观测

文章目录 1、获取进程信息的方法1.1、通过读取/proc目录获取进程相关信息1.2、通过Linux命令获取进程信息1.2.1、top(CPU/内存)命令1.2.2、iotop(磁盘IO)命令1.2.3、nethogs(流量)命令 2、使用prometheus c…

tableau除了图表好看,在业务中真有用吗?

tableau之前的市值接近150亿美金,被saleforce以157亿美金收购,这个市值和现在的蔚来汽车差不多。 如果tableau仅仅是个show的可视化工具,必然不会有这么高的市值,资本市场的眼睛是雪亮的。 很多人觉得tableau做图表好看&#xff…

分布式常见面试题总结

文章目录 1 什么是 UUID 算法?2 什么是雪花算法?🔥3 说说什么是幂等性?🔥4 怎么保证接口幂等性?🔥5 paxos算法6 Raft 算法7 CAP理论和 BASE 理论7.1 CAP 理论🔥7.2 为什么无法同时保…

Echarts合集更更更之树图

实现效果 写在最后🍒 源码,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云

DGL库之HGTConv的使用

DGL库之HGTConv的使用 论文地址和异构图构建教程HGTConv语法格式HGTConv的使用 论文地址和异构图构建教程 论文地址:https://arxiv.org/pdf/2003.01332 异构图构建教程:异构图构建 异构图转同构图:异构图转同构图 HGTConv语法格式 dgl.nn.…

极客兔兔Gee-Cache Day7

protobuf配置: 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本,则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf,还需要protoc-g…

【单链表的模拟实现Java】

【单链表的模拟实现Java】 1. 了解单链表的功能2. 模拟实现单链表的功能2.1 单链表的创建2.2 链表的头插2.3 链表的尾插2.3 链表的长度2.4 链表的打印2.5 在指定位置插入2.6 查找2.7 删除第一个出现的节点2.8 删除出现的所有节点2.9 清空链表 3. 正确使用模拟单链表 1. 了解单链…

重头开始嵌入式第四十八天(Linux内核驱动 linux启动流程)

目录 什么是操作系统? 一、管理硬件资源 二、提供用户接口 三、管理软件资源 什么是操作系统内核? 一、主要功能 1. 进程管理: 2. 内存管理: 3. 设备管理: 4. 文件系统管理: 二、特点 什么是驱动…

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址:GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了,可以参考其他…

yq 工具

文章目录 yq命令快速 Recipes查找数组中的项目查找并更新数组中的项目深度修剪一棵树对数组中的项目进行多次或复杂的更新按字段对数组进行排序 OperatorsOmitOmit keys from mapOmit indices from array DeleteDelete entry in mapDelete nested entry in mapDelete entry in …

【重学 MySQL】六十三、唯一约束的使用

【重学 MySQL】六十三、唯一约束的使用 创建表时定义唯一约束示例 在已存在的表上添加唯一约束示例 删除唯一约束示例 复合唯一约束案例背景创建表并添加复合唯一约束插入数据测试总结 特点注意事项 在 MySQL 中,唯一约束(UNIQUE Constraint)…