SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL
动态SQL—SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)Mybatis的动态SQL操作
昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder,掌握MyBatis核心配置文件以及元素的使用,也掌握MyBatis映射文件及其元素的使用。那么今天我们需要掌握的是更加复杂的查询操作。
- 学会编写MyBatis中动态SQL
- 学会MyBatis的条件查询操作
- 学会MyBatis的更新操作
- 学会MyBatis的复杂查询操作
一、什么是动态SQL?
MyBatis 中的动态 SQL 是一种在 SQL 查询语句中根据不同的条件来动态生成不同的 SQL 片段的技术。它允许你根据不同的情况来构建查询条件,避免写大量重复的 SQL 语句。
动态SQL常用元素
| 元素 | 说明 |
|---|---|
| < if > | 判断语句,用于单条件判断 |
| < choose >(< when >、< otherwise >) | 相当于Java中的switch…case…default语句,用于多条件判断 |
| < where > | 简化SQL语句中where的条件判断 |
| < trim > | 可以灵活地去除多余的关键字 |
| < set > | 用于SQL语句的动态更新 |
| < foreach > | 循环语句,常用于in语句等列举条件中 |
动态 SQL 通常用于构建复杂的查询条件,例如:
- 根据不同的条件组合进行查询,比如根据姓名、性别、年龄等多个条件进行筛选。
- 根据不同的条件来动态排序查询结果。
- 在更新操作中,根据传入的参数来选择性地更新某些字段。
- 在插入操作中,根据不同的参数情况来选择性地插入某些字段。
MyBatis 提供了以下方式来实现动态 SQL:
-
使用
<if>元素: 可以根据条件来动态生成 SQL 片段。例如:<select id="findByCondition" parameterType="map" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where> </select>代码解释如下:
<select>标签定义了一个查询语句,并指定了它的唯一标识符(id)、输入参数类型(parameterType)和结果类型(resultType)。SELECT * FROM users是实际的 SQL 查询语句,表示从名为 “users” 的表中选取所有列的数据。<where>标签是 MyBatis 提供的一个用于构建动态 SQL 的元素,它会在生成的 SQL 语句中添加 “WHERE” 关键字,并且只会在至少有一个条件满足时添加。<if>标签是<where>标签中的子元素,用于判断某个条件是否成立。它的 “test” 属性用于指定一个条件表达式。如果
test="name != null"成立,那么会在生成的 SQL 语句中添加一个 “AND name = #{name}” 的条件。如果
test="age != null"成立,那么会在生成的 SQL 语句中添加一个 “AND age = #{age}” 的条件。这样,在实际执行查询时,如果传入的参数中有 “name”,那么会根据 “name” 的值添加相应的查询条件;同样地,如果传入的参数中有 “age”,那么会根据 “age” 的值添加相应的查询条件。
-
使用
<choose>元素: 类似于 switch 语句,根据条件选择一个分支进行处理。<select id="findByCondition" parameterType="map" resultType="User">SELECT * FROM users<where><choose><when test="name != null">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND 1=1</otherwise></choose></where> </select>代码解释:
这段代码使用了 MyBatis 中的动态 SQL 元素
<choose>元素,也称为<choose>/<when>/<otherwise>构造。这样的构造允许你在 SQL 查询中根据条件动态地生成不同的部分。<choose>包含了多个<when>元素,每个<when>元素对应一个条件判断,如果条件满足,就会生成相应的 SQL 查询条件。如果所有条件都不满足,就会执行<otherwise>部分。简单来说,这个查询语句的意思是:
- 如果传入的参数
name不为null,则添加条件AND name = #{name}到查询语句中。 - 如果传入的参数
age不为null,则添加条件AND age = #{age}到查询语句中。 - 如果以上条件都不满足(即都为
null),则添加条件AND 1=1到查询语句中。这个条件相当于一个恒为真的条件,因此不会影响查询结果。
- 如果传入的参数
-
使用
<trim>元素: 可以根据条件来剪切 SQL 片段的开始或结尾,以防止出现多余的关键字。<select id="findByCondition" parameterType="map" resultType="User">SELECT * FROM users<where><trim prefix="AND (" suffix=")" prefixOverrides="OR"><if test="name != null">OR name = #{name}</if><if test="age != null">OR age = #{age}</if></trim></where> </select>上述代码使用了 MyBatis 的动态 SQL 元素中的
<trim>元素,用于构建更复杂的条件语句。<trim>元素用于构建一个以AND为前缀和)为后缀的条件片段,同时在生成条件语句时去除可能多余的OR。简单来说,这个查询语句的意思是:
- 如果传入的参数
name不为null,则将OR name = #{name}添加到条件片段中。 - 如果传入的参数
age不为null,则将OR age = #{age}添加到条件片段中。
<trim>元素的prefix属性指定前缀,suffix属性指定后缀,prefixOverrides属性指定需要去除的前缀。在这个例子中,prefix是AND (,suffix是),prefixOverrides是OR。这样,如果有至少一个条件满足,就会生成类似AND ( condition1 OR condition2 )的查询语句。如果没有条件满足,就会生成AND (),这不会影响查询结果。 - 如果传入的参数
-
使用
<foreach>元素: 可以用来遍历集合或数组参数,生成多个相同的 SQL 片段。<select id="findByIds" parameterType="list" resultType="User">SELECT * FROM usersWHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach> </select>
这段代码是一个 MyBatis 的动态 SQL 查询语句,用于根据传入的一组 id 值查询对应的用户信息。这个查询语句利用了 <foreach> 元素,允许在 SQL 查询中动态地生成 IN 子句。
具体来说,这个查询语句的意思是:
- 查询
users表中的所有列(SELECT *)。 - 使用
WHERE子句进行过滤,条件是id值在传入的list参数中。 <foreach>元素用于循环遍历传入的list参数,将每个id值包装在(和)之间,并使用,作为分隔符。
在这个查询语句中,<foreach> 元素的属性含义如下:
item:指定在每次循环中使用的变量名,这里是id。collection:指定要遍历的集合参数的名字,这里是list。open:指定循环的开始字符,这里是(。separator:指定循环每个元素之间的分隔符,这里是,。close:指定循环的结束字符,这里是)。
这样,如果传入一个列表参数 list,比如 [1, 2, 3],就会生成类似 SELECT * FROM users WHERE id IN (1, 2, 3) 的查询语句,从而查询对应的用户信息。
这些动态 SQL 的特性使得 MyBatis 在构建灵活和动态的查询条件时非常方便,避免了硬编码大量重复的 SQL 语句。
二、MyBatis的条件查询操作
在学习了上面的几个动态SQL的常用元素,现在我们来尝试一下编写一下我们自己项目的动态SQL。
1.编写一个使用<if>的动态SQl查询语句,若有账号名称Account则按账号名称Account查询,若有网站名WebsiteName则用WebsiteName查询,若俩个都有则俩个都匹配的才查询。
PasswordMSMapper.xml中编写动态sql语句:

①首先进行单条件查询测试,若Account不为空:

②也是单条件查询测试,若WebsiteName不为空:

③若是俩个条件都满足呢?Account和WebsiteName都不为空:

④若是俩个条件都不满足呢?Account和WebsiteName都为空:

可以看到Mybatis是会根据我们输入的查询条件进行拼接生成动态的SQL。
2.那么我们继续尝试编写<choose>的动态sql语句,情景时:若有账号名Account,则优先使用账号名进行查询。若无账户名,有网站名WebsiteName,那么就按网站名搜索。若账号名,网站名都无,那么就采用默认查询passwordms表中的所有信息。
在使用<if>元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个去执行。这时候使用<choose>就是非常合适的,如果使用<if>则是不合适的。
PasswordMSMapper.xml中编写动态sql语句:

那么去编写我们的测试类,根据不同的输入情况,查看是否满足我们的需求?
①Account不为空,WebsiteName为空的情况:

②Account不为空,WebsiteName不为空的情况(结果和上面的一样):

③Account为空,WebsiteName不为空的情况:

④Account为空,WebsiteName也为空的情况:

可以看到Mybatis是会根据我们输入的查询条件进行拼接生成动态的SQL。
3.那么我们继续尝试编写<where>、<trim>的动态sql语句,情景时:在sql中where 后面直接跟and 或者 or之类的关键字都是错误的,会导致我们的SQL语句运行不成功

在这个示例中我们写了个
<trim> prefix="AND (" suffix=")" prefixOverride="AND",
在<if>条件中Account满足时,程序会自动在AND Account=#{Account}前面、后面,添加上前后缀生成新的语句:
AND (AND Account=#{Account}),
若是WebsiteName也满足的话,新的sql语句为:
AND (AND Account=#{Account} AND WebsiteName = #{WebsiteName} )
我们写的prefixOverrides=“AND”,会自动将()里面的多余的前缀AND去除,即生成:
AND ( Account=#{Account} AND WebsiteName = #{WebsiteName} )
看到这里是不是觉得那外面还有一个where呢?where AND (Account=#{Account} AND WebsiteName = #{WebsiteName})也是错的对不?实际上<where> 会自动帮我们去除()外多余的AND和OR防止SQL语句出错。
因此这个流程下来我们的语句就变成了:
where ( Account=#{Account} AND WebsiteName = #{WebsiteName} )
我们去输入测试类看看就知道是不是了
①Account不为空,WebsiteName也不为空:

②Account为空,WebsiteName不为空:
根据我们上面讲的流程:那么推测生成的动态sql语句应该是:
where ( WebsiteName=#{WebsiteName} )

③Account、WebsiteName都为空:
根据我们上面讲的流程:那么推测生成的动态sql语句应该是:
Select * from passwordms,因为if里面的条件每一个成立,所以where也不会添加进去,但是会自动删除语句中多余的AND或OR

可以看到Mybatis是会根据我们输入的查询条件进行拼接生成动态的SQL,并且正确无误。
三、Mybatis的更新操作
4.那么我们继续尝试编写<set>、<trim>的动态sql语句,情景时:如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而在实际应用中,大多数情况下都是更新某一个或几个字段。如果更新的每一条数据都要将其所有的属性都更新一遍,那么执行效率是非常差的。为了解决更新数据的效率问题,MyBatis提供了<set>元素。
除了可以用<trim>元素来进行更新操作外,也使用<set>元素来进行更新操作, 在映射文件中使用<set>元素和<if>元素组合进行update语句动态SQL组装时,如果<set>元素内包含的内容都为空,则会出现SQL语法错误。因此,在使用<set>元素进行字段信息更新时,要确保传入的更新字段不能都为空。
除此以外还可以跟前面的<trim>元素联合起来一起使用。其中, <trim>元素,suffixOverrides属性指定去除的<trim>元素所包含内容的后缀为逗号 。
好那么我们来编写我们的Mapper文件:

接下来进行测试类测试:
①:更新多个字段的情况:

可以看到嗷,正常数据更新了,但是呢,其实是有问题的,不管数据是不是更原来的一样,都会对数据库进行一次更新的操作。
因此我们还需要再改改,还需要加一个数据库对比的判断,详细代码如下:

isDataEqual()方法如下:
// 判断两个对象的数据是否相等private boolean isDataEqual(PasswordMS oldData, PasswordMS newData) {return Objects.equals(oldData.getAccount(), newData.getAccount())&& Objects.equals(oldData.getWebsiteName(), newData.getWebsiteName());}

那么保持参数条件不变的情况下继续进行测试:

可以看到测试成功,正确提示!
②尝试看看单参数字段修改的情况:

③若是无参数那么就会报错,所以一定要确保更新的参数必须要有,不能全为空。

好的那么更新操作就学到这里了。
四、使用Mybatis的动态SQL进行复杂操作
使用 <foreach> 元素可以在 MyBatis 中对集合进行迭代操作,通常用于构建 IN 条件的查询语句。
<foreach>元素的属性
| 属性 | 说明 |
|---|---|
| item | 表示集合中每一个元素进行迭代时的别名。该属性为必选。 |
| index | 在List和数组中,index是元素的序号,在Map中,index是元素的key。该属性可选。 |
| open | 表示foreach语句代码的开始符号,一般和close=“)”合用。常用在in条件语句中。该属性可选。 |
| separator | 表示元素之间的分隔符,例如,在条件语句中,separator=“,”会自动在元素中间用“,”隔开,避免手动输入逗号导致SQL错误,错误示例如in(1,2,)。该属性可选。 |
| close | 表示foreach语句代码的关闭符号,一般和open="("合用。常用在in条件语句中。该属性可选。 |
| collection | 用于指定遍历参数的类型。注意,该属性必须指定,不同情况下,该属性的值是不一样的。 |
<collection>属性的取值
在遍历参数时,<collection>属性的值是必须指定的。不同情况下,该属性的取值也是不一样的,主要有以下三种情况:List类型、数值类型、Map类型。
- 若入参为单参数且参数类型是一个List,collection属性值为list。
- 若入参为单参数且参数类型是一个数组,collection属性值为array。
- 若传入参数为多参数,就需要把参数封装为一个Map进行处理,collection属性值为Map。若传入参数为多参数,就需要把参数封装为一个Map进行处理,collection属性值为Map。
5.那么我们继续尝试编写<foreach>的动态sql语句,情景时:要从数据表passwordms中查询出id为1、2、3的账号信息,就可以利用数组作为参数,存储id的属性值1、2、3,并通过<foreach>元素迭代数组完成账号信息的批量查询操作。
好那么我们来编写我们的Mapper文件:
<select id="findByIds" parameterType="list" resultType="PasswordMS">SELECT * FROM passwordmsWHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach></select>

在我们的代码中,findByIds 是查询的 ID,parameterType 设置为 list 表示传入的参数是一个 List,resultType 设置为 PasswordMS 表示返回结果是 PasswordMS 类型的对象。
编写测试类:
输入的参数类型为同一种,查询1-3的账号信息
@Test
void findByIds() {SqlSession session = MyBatisUtil.createSqlSession();List<Integer> idList = Arrays.asList(1, 2, 3); // 要查询的 id 列表// 传入参数查询,返回结果List<PasswordMS> passwordMSList = session.selectList("findByIds", idList);for (PasswordMS s : passwordMSList) {logger.info("id:" + s.getId() + ",账号:" + s.getAccount() + ",密码:" + s.getPassword() + ",网站名:" + s.getWebsiteName() + ",网站网址:" + s.getWebsiteURL() + ",网站缩略图:" + s.getWebsiteImage() + ",账号描述:" + s.getAccountDescription());}// 关闭 sessionsession.close();
}

可以看出,通过使用 <foreach> 元素就能够方便地在 MyBatis 中对集合进行迭代操作,构建需要的查询条件。
总结
这是第三天对SSM框架的学习,深入学习了MyBatis的动态SQL,它允许我们根据不同的条件在 SQL 查询中动态地构建、拼接和执行 SQL 语句。动态 SQL 可以帮助你编写更加灵活、可复用和动态的数据库查询语句,适用于各种复杂的业务场景。
想要跟着学习的可以去我的资源里面找对应的文件下载,我的md文件也会发上去,项目文件会上传可以自己跟着学习一下。
PS:sql语句自己编写┗|`O′|┛ 嗷~~
作者:Stevedash
发表于:2023年8月23日 16点28分
注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。
相关文章:
SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL
动态SQL—SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第三天)Mybatis的动态SQL操作 昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder,掌握MyBatis核心配置文件以及元素的使用,也掌握My…...
Kaggle(3):Predict CO2 Emissions in Rwanda
Kaggle(3):Predict CO2 Emissions in Rwanda 1. Introduction 在本次竞赛中,我们的任务是预测非洲 497 个不同地点 2022 年的二氧化碳排放量。 在训练数据中,我们有 2019-2021 年的二氧化碳排放量 本笔记本的内容&am…...
【技巧分享】如何获取子窗体选择了多少记录数?一招搞定!
Hi,大家好久不见。 我这个更新速度是不是太慢了呀,因为,最近又又又在忙,请大家谅解啦。 现在更新文章、视频都要花好久去考虑,好不容易有个灵感了,一搜索,结果发现之前都已经分享过了(委屈脸&…...
Kotlin AQ
如何学习kotlin? 学习Kotlin的步骤如下: 1. 理解Kotlin的基础:首先,你需要理解Kotlin的基础知识,包括变量、数据类型、运算符、控制流等。你可以通过阅读Kotlin的官方文档或者其他在线教程来学习。 2. 实践编程:理论…...
SpringBoot入门篇2 - 配置文件格式、多环境开发、配置文件分类
目录 1.配置文件格式(3种) 例:修改服务器端口。(3种) src/main/resources/application.properties server.port80 src/main/resources/application.yml(主要用这种) server:port: 80 src/m…...
UOS安装6.1.11内核或4.19内核
6.1.11内核 sudo sh -c echo "deb https://proposed-packages.deepin.com/beige-testing unstable main dde community commercial " > /etc/apt/sources.list.d/deepin-testing.list sudo apt update && sudo apt install linux-image-6.1.11-amd64-de…...
HiveSQL刷题
41、同时在线人数问题 现有各直播间的用户访问记录表(live_events)如下,表中每行数据表达的信息为,一个用户何时进入了一个直播间,又在何时离开了该直播间。 user_id (用户id)live_id (直播间id)in_datetime (进入直…...
path路径模块
path模块是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。 path.join( )用来将多个路径片段拼接成一个完整的路径字符串 ../会抵消前面的路径 const path require(path) const pathStr path.join(/a,/b,../,/d) conso…...
1.文章复现《热电联产系统在区域综合能源系统中的定容选址研究》(附matlab程序)
0.代码链接 文章复现《热电联产系统在区域综合能源系统中的定容选址研究》(matlab程序)-Matlab文档类资源-CSDN文库 1.简述 本文采用遗传算法的方式进行了下述文章的复现并采用电-热节点的方式进行了潮流计算以降低电网的网络损耗 分析了电网的基本数…...
【Terraform学习】使用 Terraform 托管 S3 静态网站(Terraform-AWS最佳实战学习)
使用 Terraform 托管 S3 静态网站 实验步骤 前提条件 安装 Terraform: 地址 下载仓库代码模版 本实验代码位于 task_s3 文件夹中。 变量文件 variables.tf 在上面的代码中,您将声明,aws_access_key,aws_secret_key和区域变量…...
触发JVM fatal error并配置相关JVM参数
1. 絮絮叨叨 工作中,Java服务因为fatal error(致命错误,笔者称其为jvm crash),在服务运行日志中出现了致命错误的概要信息: # # A fatal error has been detected by the Java Runtime Environment: # # S…...
爬虫(bilibili热门课程记录)
什么是爬虫?程序蜘蛛,沿着互联网获取相关信息,收集目标信息。 一、python环境安装 1、先从Download Python | Python.org中下载最新版本的python解释器 2、再从Download PyCharm: Python IDE for Professional Developers by JetBrains中下…...
14-模型 - 增删改查
增: # 1. 找到模型类并创建对象 user User() # 2. 给对象的属性赋值 user.username username user.password password user.phone phone # 3. 将user对象添加到session中 (类似缓存) db.session.add(user) # 4. 提交数据 db.session.commit() 删: # 两种删除:# 1. 逻辑删…...
C#与西门子PLC1500的ModbusTcp服务器通信3--搭建ModbusTcp服务器
1、打开仿真工具,创建PLC,注意创建完成后不要关闭 注意,这个IP地址必须与西门子虚拟网卡的IP地址及虚拟机的网卡IP地址同一网段 2、打开博途V15,创建项目,命名为Lan项目 3、添加1500系列CPU1513 4、设置设置IP地址及属…...
Linux系统编程:线程控制
目录 一. 线程的创建 1.1 pthread_create函数 1.2 线程id的本质 二. 多线程中的异常和程序替换 2.1 多线程程序异常 2.2 多线程中的程序替换 三. 线程等待 四. 线程的终止和分离 4.1 线程函数return 4.2 线程取消 pthread_cancel 4.3 线程退出 pthread_exit 4.4 线程…...
基于Java+SpringBoot+Vue前后端分离纺织品企业财务管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
搭建开发环境-Windows
写C# 的请出去。 然后,Windows 是最好的Linux发行版。搭建开发环境-WSLUbuntu...
【 Python 全栈开发 - 人工智能篇 - 45 】集成算法与聚类算法
文章目录 一、集成算法1.1 概念1.2 常用集成算法1.2.1 Bagging1.2.2 Boosting1.2.2.1 AdaBoost1.2.2.2 GBDT1.2.2.3 XgBoost 1.2.3 Stacking 二、聚类算法2.1 概念2.2 常用聚类算法2.2.1 K-means2.2.2 层次聚类2.2.3 DBSCAN算法2.2.4 AP聚类算法2.2.5 高斯混合模型聚类算法 一、…...
SSM商城项目实战:账户充值功能实现
SSM商城项目实战:账户充值功能实现 在一个电商平台中,用户账户充值是一个非常重要的功能。本文将介绍如何在SSM(SpringSpringMVCMyBatis)商城项目中实现账户充值功能。通过本文的指导,你将学会如何在项目中添加账户充…...
wireshark工具pcap文件转换
pcap详解_pcap_loop_小虎随笔的博客-CSDN博客 分析802.11无线报文hexdump内容:利用wireshark自带二进制工具text2pcap将hexdump内容转换为pcap文件..._weixin_30835933的博客-CSDN博客 text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件(wireshark,数据) …...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
