【Mybatis】XML映射文件
目录
11.3XML映射文件
1.select
2.insert、update、delete
3.Sql
4.parameters(参数)
5.resultMap
6.resultMap 使用示例
(1)在先前创建的数据库stu中创建表student 2,并插入若干条数据,代码如下:
(2)创建工程mybatis_ResultMap_demo。
(3)创建实体对象映射数据库表。
(4)创建映射接口和映射文件。
(5)测试。
11.3XML映射文件
xml和dtd 部分是必须填写且不需要配置的部分每次使用时,只需要将这部分复制到文件顶部即可。
mapper 元素是整个映射文件的容器,所有的SQL映射都包含在这个元素中,mapper本身有一个参数namespace,即命名空间这个命名空间就是文件所对应的接口文件的Java类只有当这个命名空间被配置时,才可以直接通过访问Java接口的方法实现SOL调用。
映射器是MyBatis最复杂且最重要的组件它由一个接口加上XML文件(或者注解)组成。在映射器中可以配置参数、SOL 语句、存储过程、缓存等内容,并且通过简易的映射规则映射到指定的POJO或者其他对象上,映射器能有效消除JDBC底层的代码。
MyBatis的映射器也可以使用注解完成,但可读性较差,企业中应用不广,官方亦不推荐使用。
1.select
查询语句是 MyBatis 中最常用的元素之一,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常对应多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和精力放到查询和结果映射的原因。对简单类别的查询元素是非常简单的。例如:
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT *FROM PERSON WHERE ID=#{id}
</select>
这个语句被称为selectPerson,使用一个int(或Integer)类型的参数,并返回一个HashMap类型的对象,其中的键是列名,值是列对应的值。
注意参数标识 #{id},其告诉 MyBatis创建一个PreparedStatement (预处理语)参数使用JDBC,这样的一个参数在SOL中会由一个“?”来标识,并被传递到一个新的预处理语句中,类似于以下的JDBC代码(不是MyBatis的代码):
String selectPerson ="SELECT* FROM PERSON WHEREID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);
当然,这需要很多单独的JDBC 的代码来提取结果并将它们映射到对象实例中,这就是MyBatis 节省时间的原因。我们需要深入了解参数和结果映射。select 元素有很多属性允许用户配置,以决定每条语句的作用细节。关于select元素主要属性的描述参见表11-2。
表11-2select元素的主要属性描述
属性 | 描述 |
id | 在命名空间中唯一的标识符,可以被用来引用这条语句 |
parameterType | 将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过TypeHandler 推断出具体传入语句的参数,默认值为unset |
resultMap | 外部resultMap的命名引用。结果集的映射是MyBatis 最强大的特性若能对其有一个很好地理解则许多复杂映射的情形都能迎刃而解。可以使用resultMap或resultType,但不能同时使用 |
flushCache | 如果设置为true,则任何时候只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值为false |
useCache | 如果设置为true,则将会导致本条语句的结果被二级缓存,select元素默认值为true |
timeout | 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为unset(依赖驱动) |
fetchSize | 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动) |
statementType | 值为STATEMENT、PREPARED或CALLABLE之一。这会让MyBatis分别使用JDBC中的 Statement、PreparedStatement 或CallableStatement,默认值为PREPARED |
resultSetType | 值为FORWARDONLY、SCROLL SENSITIVE 或SCROLL INSENSITIVE 之一默认值为 umset(依赖驱动),是结果集的类型 |
databaseld | 如果配置了databaseIdProvider,则MyBatis会加载所有的不带databaseId 或匹配当前databaseId语句;如果带或者不带databaseId的语句都有,则不带的会被忽略 |
2.insert、update、delete
数据操纵语句 insert、update 和 delete 在它们的实现中非常相似。
<insert Id=“insertAuthor” parameterType=“domain.blogAuthor” flushCache=“true”
statementType=“PREPARED”keyProperty=“”keyColumn=“”useGeneratedKeys=“”
utimeout=“20”>
<update id=“updateAuthor” parameterType=“domain.blog.Author” flushCache=“true”
statementType=“PREPARED” timeout=“20”>
<delete id=“deleteAuthorr” parameterType=“domain.blog.Author” flushCache=“true”
statementType=“PREPARED” timeout=“20”>
insert、update和delete元素的主要属性描述如表11-3所示
表11-3 insert、update和delete 元素的主要属性描述
下面是insert、update和delete语句的示例
属性 | 描述 |
id | 命名空间中的唯一标识符,可被用来代表这条语句 |
parameterType | 将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过TypeHandler推断出具体传入语句的参数,默认值为unset |
parameterMap | STATEMENT、PREPARED或CALLABLE之一。这会让MyBatis分别使用StatementPreparedStatement或CallableStatement,默认值为PREPARED |
flushCache | 将其设置为 tue,任何时候只要语句被调用,都会导致本地缓存和二级缓存都被清空,默认值为true(对应插入、更新和删除语句) |
statementType | STATEMENT、PREPARED或CALLABLE之一。这会让MyBatis 分别使用 Statement PreparedStatement或CallableStatement,默认值为PREPARED |
useGeneratedKeys | (仅对insert和update 有用)这会令MyBatis 使用JDBC的getGeneratedKeys 方法来获取由数据库内部生成的主键(如像MySOL和SOLServer 这样的关系数据管理系统的自动递增字段),默认值为false |
keyProperty | (仅对insert 和update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys的返回值或者通过 insert 语的 selectKey 子元素设置其键值,默认为 unset。如果希望得到多个生成的列,则也可以是逗号分隔的属性名称列表 |
keyColumn | (仅对msert和update 有用)通过生成的键值设置表中的列名这个设置在某些数据库(如PostgreSQL)中是必需的,当主键列不是表中的第一列时需要设置。如果希望得到多个生成的列,则也可以是逗号分隔的属性名称列表 |
下面是insert、update和delete语句的示例。
<insert id=“addStudent” parameterType=“student”
insert into
student(sno,name,sex,age,deptno)
values(#{sno}#{name},#{sex},#{age},#{dept_no})
</insert>
<update id=“updateStudent” parameterType=“student”>
update student set name
=#{name},sex=#{sex},age=#{lage},dept_no=#{dept_no}
where sno=#{sno}
</update>
<delete id=“deletestudent” uparameterType=“String”>
delete from student
where sno=#{sno}
</delete>
3.Sql
这个元素可以被用来定义可重用的 SOL代码段,可以包含在其他语句中。例如:
<sql id=“userColumns”>
${alias}.id,${alias}.username,${alias}.password
</sq1>
这个SQL片段可以被包含在其他语句中。例如:
<select id=“selectUsers” resultType=“map”>
Select
<include>refid=“userColumns”><property name=“alias” value=“t1”/></include>,
</select>
4.parameters(参数)
在MyBatis中,参数是非常强大的元素。类似于之前的语句,简单参数示例如下。
<select id=“selectUsers” parameterType=“int”resultType="User”>
select id,username,password from users where id= #{id}
</select>
这个示例说明了一个非常简单的命名参数映射。参数类型被设置为int,这里的参数名是id,也可以是其他名称。参数为简单数据类型的,都与此类似。以下示例中参数类型是一个对象,MyBatis的处理方式不同于简单数据类型。
<insert id="insertUser"parameterType="User">
Insert into users(id,username,password)
values(#{id},#{username},#{password})
</insert>
如果User类型的参数对象传递到了语句中,则id、userame和password 属性将会被查找,它们的值就会被传递到预处理语句的参数中。
5.resultMap
resultMap是映射中最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。resultMap 定义的主要是一个结果集的映射关系,也就是SOL到Java Bean 的映射关系定义。
下面是简单映射语句的示例,但没有明确的resultMap。例如:
<select id=“selectUsers” resultType=“map”>
select id,username, hashedPassword from some_table where id = #{id}
</select>
resultType=“map”表示返回的数据是一个Map集合(使用列名作为key列值作为value)。虽然数据被封装成Map集合返回,但是Map ”集合并不能很好地描述一个领域模型。可以使用JavaBeans或POJOs来作为领域模型描述数据MyBatis对两者都支持来看下面这个JavaBean:
public class User {private int id;private String username;private String hashedPassword;public int setId(int id) {This.id=id;}public void getUsername() {return username;}public void setUsername(String username) {this.username=username;}public String getHashedPassword() {return hashedPassword;}public void setHashedPassword(String hashedPassword) {this.hashedPassword=hashedPassword;}
}
基于JavaBean的规范,上面这个类有3个属性:id、username和hashedPassword。这些在select语句中会精确匹配到列名。
这样的一个JavaBean可以被映射到结果集,就像映射到HashMap一样简单。
<select id=“selectUsers” parameterType=“int” resultType=“com.someapp.model.User”>
select id,username,hashedPassword from some table where id = #{id}
</select>
以下使用了类型别名,使用它们时可以不输入类的全路径。例如:
<!--在XML配置文件中-->
<typeAlias type=“com.someapp,model.User” alias=“User”/>
<!--在SOL映射的XML文件中-->
<select id=“selectUsers” parameterType=“int”resultType=“User”>
select id,username hashedPassword from some table where id = #{id}
</select>
在这些情况下,MyBatis会在幕后自动创建一个resultMap,基于属性名来映射列到JavaBean 的属性上。如果列名没有精确匹配,则可以在列名上使用 select 字句的别名(一个标准的SOL特性)来匹配标签。例如:
<select id=“selectUsers” parameterType=“int” resultType=“User”>
select
user_id as “id”,
user_name as “userName”,
hashed_password as “hashedPassword”
from some_table
where id = #{id}
</select>
resultMap最常见的使用方式如下所示,这也是解决列名不匹配的另外一种方式。
<resultMap id=“userResultMap” type= “User”>
<id property= “id” column= “user_id” />
<result property= “username” column= “user_name” />
<result property= “password” column= “hashed_password” />
</resultMap>
引用此语句时使用resultMap 属性即可(注意,这里去了resultType属性)。例如:
<select id= “selectUsers” parameterType= “int” resultMap= “userResultMap”>
select user_id, user_name, hashed_password from some_table where id=#{id}
</select>
6.resultMap 使用示例
(1)在先前创建的数据库stu中创建表student 2,并插入若干条数据,代码如下:
DROP TABLE IF EXISTS `student_2`;CREATE TABLE `student_2` (`stu_sno` varchar(100) NOT NULL DEFAULT '',`stu_name` varchar(100) NOT NULL,`stu_sex` varchar(8) DEFAULT NULL,`stu_age` int(3) DEFAULT NULL,`stu_dept_no` varchar(60) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `student_2` VALUES ('20231505', 'Marry', '女', '18', '260');INSERT INTO `student_2` VALUES ('20231506', '王宝宝', '男', '22', '2602');INSERT INTO `student_2` VALUES ('20231508', '李勇', '男', '20', '2605');INSERT INTO `student_2` VALUES ('20231509', '刘娟', '女', '19', '2605');
(2)创建工程mybatis_ResultMap_demo。
在idea 中创建Maven Project,在“GroupID”文本框中输入“com.mialab”,在“ArtifactID”文本框中输入“mybatis_ResultMap_demo”。最终完成的mybatis_ResultMap_demo工程目录及文件如图11-4所示,student2初始表数据如图11-5所示。
图11-4 mybatis_ResultMap_demo工程目录及文件
图11-5 student2表中的数据
(3)创建实体对象映射数据库表。
Student对象用于映射student _2 表,Student.java 主要代码如下(此处get方法、set方法和toString方法略:
public class Student {private String sno;private String name;private String sex;private int age;private String dept_no;...
}
(4)创建映射接口和映射文件。
接口StudentMapper.java的主要代码如下:
public interface StudentMapper {public List<Student> getSudentAll();
}
映射文件StudentMapper.xml的主要代码如下:
<mapper namespace="com.mialab.mybatis_ResultMap_demo.mapper.StudentMapper"><resultMap id="studentResultMap" type="student"><id property="sno" column="stu_sno" /><result property="name" column="stu_name" /><result property="sex" column="stu_sex" /><result property="age" column="stu_age" /><result property="dept_no" column="stu_dept_no" /></resultMap><select id="getSudentAll" resultMap="studentResultMap">select * from student_2</select>
</mapper>
这里column属性表示数据库表的列名,property 表示数据库列映射到返回类型的属性。<resultMap id=“studentResultMap”type=“student”>中的id 是resultMap 的唯一标识符,type则表示 resultMap的实际返回类型。“student”是类型别名,表示的是“com.mialab.mybatis_ResultMap_demo.domain.Student", 在mybatis-config.xml中有声明。
<id property="sno" column="stu_ sno" />中的id表示这个对象的主键(或者唯一标识),property表示POJO的属性名称,column 表示数据库表的列名。这样,POJO就和数据库SQL的结果一一对应起来了 。
(5)测试。
main方法的主要测试代码如下:
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> stu_list = mapper.getSudentAll();
for(Student stu:stu_list) {//System.out.println(stu);log.info(stu);
}
运行ResultMap_ Main 的main方法,控制台显示内容如下:
DEBUG [main] - ==> Preparing: select * from student_2
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 4INFO [main] - Student [sno=20231505, name=Marry, sex=女, age=18, dept_no=260]INFO [main] - Student [sno=20231506, name=王宝宝, sex=男, age=22, dept_no=2602]INFO [main] - Student [sno=20231508, name=李勇, sex=男, age=20, dept_no=2605]INFO [main] - Student [sno=20231509, name=刘娟, sex=女, age=19, dept_no=2605]
相关文章:

【Mybatis】XML映射文件
目录 11.3XML映射文件 1.select 2.insert、update、delete 3.Sql 4.parameters(参数) 5.resultMap 6.resultMap 使用示例 (1)在先前创建的数据库stu中创建表student 2,并插入若干条数据,代码如下: (2)创建工程mybatis_ResultMap_demo。 (…...
11.2【MyBatis】主配置文件
目录 11.2【MyBatis】主配置文件 1.properties(属性) 2.settings(设置) 3.typeAliases(别名) 4.typeHandlers类型处理器 5.objectFactory 对象工厂 6.plugins(插件) 7.environments (配置环境) 8.mappers (映射器) 11.2【MyBatis】主配置文件 MyBatis的 …...

linuxARM裸机学习笔记(2)----汇编LED灯实验
MX6ULL 的 IO IO的复用功能 这里的只使用了低五位,用来配置io口,其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的,GPIO1_IO00 一共可以复用为 9种功能 IO,分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…...

用C语言实现插入排序算法
1.设计思路 用插入排序对长度为n的待排序数组A进行排序的伪代码(在代码中,A中元素的数目n用A.length来表示)。 伪代码如下: INSERTION-SORT(A) for j2 to A.length:keyA[j] //将A[j]插入已排序序列A[1..j-1]ij-1while i>0…...

2023 电赛E题--可能会出现的问题以及解决方法
2023年电赛E题报告模板(K210版)--可直接使用 本文链接:2023年电赛E题报告模板(K210版)--可直接使用_皓悦编程记的博客-CSDN博客 解决激光笔在黑色区域无法识别 本文链接: 2023 电赛 E 题 激光笔识别有误-…...

Demystifying Prompts in Language Models via Perplexity Estimation
Demystifying Prompts in Language Models via Perplexity Estimation 原文链接 Gonen H, Iyer S, Blevins T, et al. Demystifying prompts in language models via perplexity estimation[J]. arXiv preprint arXiv:2212.04037, 2022. 简单来说就是作者通过在不同LLM和不同…...

WEB集群——http、tomcat
1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8,配置服务启动脚本,部署jpress应用。 1. 简述静态网页和动态网页的区别。 1)、静态网页 (1)、什么是静态网页 请求响应信息&…...
Socks5代理:网络安全与爬虫之利器
一、Socks5代理:简介与工作原理 Socks5代理,全称为Socket Secure 5代理,是一种允许用户通过代理服务器进行网络连接的技术。它是Socks协议的最新版本,在网络安全和数据传输方面有着显著的优势。 Socks5代理与其他代理的不同之处在…...
如何兼容低版本浏览器
如何兼容低版本浏览器 分为三个部分来说 HTML 低版本浏览器无法识别新增的HTML5元素,如果要兼容这部分浏览器,需要做以下处理: 对于非可替换元素,比如article、section、header、footer等,这种元素虽然低版本浏览器不识…...

【雕爷学编程】MicroPython动手做(39)——机器视觉之图像基础2
MixPY——让爱(AI)触手可及 MixPY布局 主控芯片:K210(64位双核带硬件FPU和卷积加速器的 RISC-V CPU) 显示屏:LCD_2.8寸 320*240分辨率,支持电阻触摸 摄像头:OV2640,200W像素 扬声器&#…...
gitlab搭建
回到目录 GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务。 Gitlab 是被广泛使用的基于 git 的开源代码管理平台, 基于 Ruby on Rails 构建, 主要针对软件开发过程中产生的代码和文档进行管理,…...

JMeter 的使用
文章目录 1. JMeter下载2. JMeter的使用2.1 JMeter中文设置2.2 JMeter的使用2.2.1 创建线程组2.2.2 HTTP请求2.2.3 监听器 1. JMeter下载 官网地址 https://jmeter.apache.org/download_jmeter.cgi https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.zip 下载解…...
Java语言 Iterator 如何装换成 List
迭代器如何逆向转换成List集合 在 Java 中,迭代器(Iterator)是一种用于遍历集合中元素的对象,它提供了一种简单而一致的方式来访问集合中的元素,而不需要暴露集合内部的结构。如果我们需要将一个迭代器逆向转换成 Lis…...

国产GOWIN实现低成本实现CSI MIPI转换DVP
CSI MIPI转换DVP,要么就是通用IC操作,如龙讯芯片和索尼芯片,但是复杂的寄存器控制器实在开发太累。对于FPGA操作,大部分都是用xilinx的方案,xilinx方案成本太高,IP复杂。 而用国产GOWIN已经实现了直接mipi …...
Typescript第六章 类型进阶(类型之间的关系,全面性检查,对象类型进阶,函数类型进阶,条件类型等)
文章目录 第六章 类型进阶6.1 类型之间的关系6.1.1 子类型和超类型6.1.2 型变结构和数组型变函数型变 6.1.3 可赋值性6.1.4 类型拓宽const类型多余属性检查 6.1.5 细化辨别并集类型 6.2 全面性检查6.3对象类型进阶6.3.1 对象类型的类型运算符“键入”运算符keyof运算符 6.3.2 R…...

kernel32.dll如何修复,快速解决kernel32.dll缺失的方法
Kernel32.dll是Windows操作系统中一个重要的系统文件,对于系统的正常运行至关重要。然而,由于各种原因,用户可能会遇到kernel32.dll文件的缺失问题。今天小编就来给大家详细的介绍一下kernel32.dll这个文件,并且详细的介绍一下ker…...
初始化前端项目配置 eslint、prettier、husky 等等
每次新项目都要重新配置一遍,有点麻烦,记录一下。 一、配置 ESLint 1.1 核心配置 执行 npm init eslint/config 命令进行初始化,根据提示一路下一步即可,完成后会自动生成 eslintrc 文件并安装相关依赖。 1.2 React 编译模式配…...

嵌入式存储器为AI的实现提供了实现架构
近年来,大脑启发式计算机领域的研究活动获得了巨大的发展。主要原因是试图超越传统的冯诺依曼架构的局限性,后者越来越受存储器-逻辑通信的带宽和等待时间的局限性的影响。在神经形态架构中,内存是分布式的,可以与逻辑共定位。鉴于…...

iOS开发-格式化时间显示刚刚几分钟前几小时前等
iOS开发-格式化时间显示刚刚几分钟前几小时前等 在开发中经常遇到从服务端获取的时间戳,需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 主要用到了NSCalendar、NSDateComponents这两个类 NSString *result nil;NSCalendarUnit components (NSC…...
ffmpeg视频音频命令
视频音频合并 视频音频合并,以视频时间为主,音频短了循环 方法1:混音,视频权重0,volume调节音量,aloop无限循环,duration:first为第一个素材的长度 ffmpeg -i video.mp4 -i audio.mp3 -filter_…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...