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

Mybatis-Flex的简单入门,Mybatis-Flex和其它框架对比

前言

        最近做项目,项目组必须要用Mybatis-Flex,然后自己去学了一下,给大家进行分享。

        MyBatis-Flex 是 MyBatis 的一个增强工具,旨在简化 MyBatis 的使用并提高开发效率。它通过提供一系列的便捷方法和特性来减少重复代码的编写,使得数据库操作更加直观和高效。MyBatis-Flex 专注于提升开发者体验,尤其是在处理CRUD(创建、读取、更新、删除)操作时。

Mybatis-Flex的官网:MyBatis-Flex - MyBatis-Flex 官方网站

📌 特征

  1. 轻量:除了 MyBatis,没有任何第三方依赖、没有任何拦截器,在执行的过程中,没有任何的 Sql 解析(Parse)。 这带来了几个好处:极高的性能、极易对代码进行跟踪和调试、把控性更高。

  2. 灵活:支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。

  3. 强大:支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能简单来说

简单来说,Mybatis-Flex 相比 Mybatis-Plus 等框架 速度更快、功能更多、代码更简洁~ 

 1、准备

1.1 首先准备一个数据库,我这里准备的是course表格,课程表

1.2 Spring Boot 项目初始化

此时需要创建 Spring Boot 项目,并添加 Maven 依赖;此处我通过 IDEA 使用 Spring Initializer 快速初始化一个 Spring Boot 工程。

📌 创建新项目,以下是相关参数:

📌 指定 spring boot 版本和勾选 web 依赖

1.3 添加 Maven 主要依赖

往 pom.xml 文件中添加以下依赖,由于本项目是通过 Spring Initializer 搭建,因此已存在 spring-boot-starter-web 和 spring-boot-starter-test 依赖。

      <dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.5.4</version></dependency>

1.4 配置数据源

在 application.properties 或 application.yml 中配置数据源:

#数据库连接配置
spring.datasource.username=root
spring.datasource.password=root
#mysql5~8 驱动不同driver-class-name     8需要增加时区的配置serverTimezone=UTC,放在url最后
#useSSL=false 安全连接
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3 Mybatis-Flex 实践
3.1 编写实体类和 Mapper 接口
路径:src/main/java/com/yinyu/flex/pojo/User.java

📌 User 实体类

使用 @Table("sf_sourse") 设置实体类与表名的映射关系
使用 @Id(keyType = KeyType.Auto) 标识主键为自增

大家进行测试的话只需要加我画框框的地方就可以了 

 

 Mapper 接口继承 BaseMapper 接口

路径:src/main/java/com/yinyu/flex/mapper/UserMapper.java

这部分也可以使用 MyBatis-Flex 的代码生成器来生,功能非常强大的。详情进入:代码生成器章节 了解。

3.2 在主启动类添加 @MapperScan 注解

路径:src/main/java/com/yinyu/flex/MybatisFlexApplication.java

用于扫描 Mapper 文件夹:

package com.yinyu.flex;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.yinyu.flex.mapper")
public class MybatisFlexApplication {public static void main(String[] args) {SpringApplication.run(MybatisFlexApplication.class, args);}}

就可以进行测试了

    /*** 查询课程列表** @param sfCourse 课程* @return 课程*/@Overridepublic List<SfCourse> selectSfCourseList(SfCourse sfCourse,Integer  pageNum, Integer pageSize) {// 创建 QueryWrapper 实例QueryWrapper queryWrapper = query().and(SF_COURSE.COURSE_ID.eq(sfCourse.getCourseId())).and(SF_COURSE.COURSE_CODE.eq(sfCourse.getCourseCode())).and(SF_COURSE.SEMESTER_ID.eq(sfCourse.getSemesterId())).and(SF_COURSE.COURSE_NAME.eq(sfCourse.getCourseName())).and(SF_COURSE.SUBJECT_ID.eq(sfCourse.getSubjectId()));if (pageNum != null && pageSize != null)return sfCourseMapper.paginate(pageNum, pageSize, queryWrapper).getRecords();elsereturn sfCourseMapper.selectListByQuery(queryWrapper);}

上面是我的测试案例。

2、MyBatis-FlexMyBatis-Plus:的对比 

基础查询对比​

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().where(EMPLOYEE.LAST_NAME.like(searchWord)) //条件为null时自动忽略.and(EMPLOYEE.GENDER.eq(1)).and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query().like(searchWord != null, "last_name", searchWord).eq("gender", 1).gt("age", 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);

或者 MyBatis-Plus 的 lambda 写法:

LambdaQueryWrapper<Employee> queryWrapper = Wrappers.<Employee>lambdaQuery().like(StringUtils.isNotEmpty(searchWord), Employee::getUserName,"B").eq(Employee::getGender, 1).gt(Employee::getAge, 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);

Fluent-MyBatis:

EmployeeQuery query = new EmployeeQuery().where.lastName().like(searchWord, If::notNull).and.gender().eq(1).and.age().gt(24).end();
List<Employee> employees = employeeMapper.listEntity(query);

查询集合函数​

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().select(ACCOUNT.ID,ACCOUNT.USER_NAME,max(ACCOUNT.BIRTHDAY),avg(ACCOUNT.SEX).as("sex_avg"));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query().select("id","user_name","max(birthday)","avg(birthday) as sex_avg");
List<Employee> employees = employeeMapper.selectList(queryWrapper);

缺点:字段硬编码,容易拼错。无法使用 ide 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现。

Fluent-MyBatis:

EmployeeQuery query = new EmployeeQuery().select.id().userName().max.birthday().avg.sex("sex_avg").end()
List<Employee> employees = employeeMapper.listEntity(query);

缺点:编写内容不符合 sql 直觉。

and(...) 和 or(...)​

假设我们要构建如下的 SQL 进行查询(需要在 SQL 中添加括号)。

SELECT * FROM tb_account
WHERE id >= 100
AND (sex = 1 OR sex = 2)
OR (age IN (18,19,20) AND user_name LIKE "%michael%" )

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().where(ACCOUNT.ID.ge(100)).and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2))).or(ACCOUNT.AGE.in(18, 19, 20).and(ACCOUNT.USER_NAME.like("michael")));

MyBatis-Plus:

QueryWrapper<Employee> query = Wrappers.query().ge("id", 100).and(i -> i.eq("sex", 1).or(x -> x.eq("sex", 2))).or(i -> i.in("age", 18, 19, 20).like("user_name", "michael"));
// or lambda
LambdaQueryWrapper<Employee> query = Wrappers.<Employee>lambdaQuery().ge(Employee::getId, 100).and(i -> i.eq(Employee::getSex, 1).or(x -> x.eq(Employee::getSex, 2))).or(i -> i.in(Employee::getAge, 18, 19, 20).like(Employee::getUserName, "michael"));

Fluent-MyBatis:

AccountQuery query = new AccountQuery().where.id().ge(100).and(new AccountQuery().where.sex().eq(1).or(new AccountQuery().where.sex().eq(2).end()).end()).or(new AccountQuery().where.age.in(18,19,20).and.userName().like("michael").end()).end();

缺点:许多 .end() 方法调用,容易忘记出错(或者写错了?欢迎纠正)。

多表查询 1​

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().select().from(ACCOUNT).leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)).where(ACCOUNT.AGE.ge(10));List<Account> accounts = mapper.selectListByQuery(query);

MyBatis-Plus:

// 不支持~~~~

Fluent-MyBatis:

StudentQuery leftQuery = new StudentQuery("a1").selectAll().where.age().eq(34).end();
HomeAddressQuery rightQuery = new HomeAddressQuery("a2").where.address().like("address").end();IQuery query = leftQuery.join(rightQuery).on(l -> l.where.homeAddressId(), r -> r.where.id()).endJoin().build();List<StudentEntity> entities = this.mapper.listEntity(query);

缺点:编写内容不符合 sql 直觉。同时在编写 end() 和 endJoin() 容易忘记。

多表查询 2​

假设查询的 SQL 如下:

SELECT a.id, a.user_name, b.id AS articleId, b.title
FROM tb_account AS a, tb_article AS b
WHERE a.id = b.account_id

MyBatis-Flex:

QueryWrapper query = new QueryWrapper()
.select(ACCOUNT.ID, ACCOUNT.USER_NAME, ARTICLE.ID.as("articleId"), ARTICLE.TITLE)
.from(ACCOUNT.as("a"), ARTICLE.as("b"))
.where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID));

MyBatis-Plus:

// 不支持~~~~

Fluent-MyBatis:

// 不支持~~~~

PS:也有可能是笔者自己不知道如何支持,而非 Fluent-MyBatis 原因,有知道的同学可以给下示例代码。

部分字段更新​

假设一个实体类 Account 中,我们要更新其内容如下:

  • userName 为 "michael"
  • age 为 "18"
  • birthday 为 null

其他字段保持数据库原有内容不变,要求执行的 SQL 如下:

update tb_account
set user_name = "michael", age = 18, birthday = null
where id = 100

MyBatis-Flex 代码如下:

Account account = UpdateEntity.of(Account.class);
account.setId(100); //设置主键
account.setUserName("michael");
account.setAge(18);
account.setBirthday(null);accountMapper.update(account);

MyBatis-Plus 代码如下(或可使用 MyBatis-Plus 的 LambdaUpdateWrapper,但性能没有 UpdateWrapper 好):

UpdateWrapper<Account> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 100);
updateWrapper.set("user_name", "michael");
updateWrapper.set("age", 18);
updateWrapper.set("birthday", null);accountMapper.update(null, updateWrapper);

Fluent-MyBatis 代码如下:

AccountUpdate update = new AccountUpdate()
.update.userName().is("michael")
.age().is(18)
.birthday().is(null)
.end()
.where.id().eq(100)
.end();
accountMapper.updateBy(update);

三种框架对比

功能或特点MyBatis-FlexMyBatis-PlusFluent-MyBatis
对 entity 的基本增删改查
分页查询
分页查询之总量缓存
分页查询无 SQL 解析设计(更轻量,及更高性能)
多表查询: from 多张表
多表查询: left join、inner join 等等
多表查询: union,union all
单主键配置
多种 id 生成策略
支持多主键、复合主键
字段的 typeHandler 配置
除了 MyBatis,无其他第三方依赖(更轻量)
QueryWrapper 是否支持在微服务项目下进行 RPC 传输未知
逻辑删除
乐观锁
SQL 审计
数据填充
数据脱敏✔️ (收费)
字段权限✔️ (收费)
字段加密✔️ (收费)
字典回写✔️ (收费)
Db + Row
Entity 监听
多数据源支持借助其他框架或收费
多数据源是否支持 Spring 的事务管理,比如 @Transactional 和 TransactionTemplate 等
多数据源是否支持 "非Spring" 项目
多租户
动态表名
动态 Schema

最后

        选择哪一个框架应该基于项目的具体需求和技术栈的选择。如果你追求极致的性能并且可以接受较小的社区支持,那么 MyBatis-Flex 可能是一个不错的选择;而如果你更看重社区支持和丰富的插件生态,那么 MyBatis-Plus 则可能更适合你。 

相关文章:

Mybatis-Flex的简单入门,Mybatis-Flex和其它框架对比

前言 最近做项目&#xff0c;项目组必须要用Mybatis-Flex&#xff0c;然后自己去学了一下&#xff0c;给大家进行分享。 MyBatis-Flex 是 MyBatis 的一个增强工具&#xff0c;旨在简化 MyBatis 的使用并提高开发效率。它通过提供一系列的便捷方法和特性来减少重复代码的编写&am…...

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...

linux的磁盘管理

认识磁盘 从外到内&#xff0c;磁道从0~XXX。扇区默认512字节先读完一个柱面的0号磁道&#xff0c;接着读第二个柱面的0号磁道……直至所有柱面的0号磁道读写完毕&#xff0c;进入下一个磁道。 磁盘命名规则 物理磁盘:sd开头&#xff1b;虚拟磁盘vd开头 sdb1&#xff1a;第二…...

Alibaba EasyExcel 导入导出全家桶

一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势&#xff1a; EasyExcel也是阿里研发在poi基础上做了封装&#xff0c;改进产物。它替开发者做了注解列表解析&#xff0c;表格填充等一系列代码编写工作&#xff0c;并将此抽象成通用和可扩展的框架。相对p…...

使用Scala编写一个简单的决策树分类测试demo

使用Scala编写一个简单的决策树分类测试demo&#xff0c;我们可以基于Apache Spark的MLlib库来实现。这里将展示如何创建一个简单的决策树分类器&#xff0c;并用它来进行预测。我们将遵循以下步骤&#xff1a; 设置环境和导入必要的包。加载并准备数据集。构建决策树模型。使…...

SQLServer中使用ISNULL替换为指定的替换值

ISNULL (Transact-SQL) 适用于&#xff1a; SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库 NULL替换为指定的替换值。 1、语法 ISNULL ( check_expression , rep…...

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…...

【信息系统项目管理师】第9章:项目范围管理-基础和过程 考点梳理

文章目录 9.1 管理基础9.1.1 产品范围和项目范围9.1.2 管理新实践 9.2 项目范围管理过程9.2.1 过程概述9.2.2 裁剪考虑因素9.2.3 敏捷与适应方法 【学习建议】本章节内容属于10大管理知识领域&#xff0c;选择、案例、论文都会考&#xff0c;建议重点学习。项目范围管理包括确保…...

智能制造标准体系建设指南

一、智能制造系统架构总览 智能制造作为当今制造业转型升级的核心&#xff0c;深度整合了新一代信息技术与传统制造工艺&#xff0c;催生出一个横跨产品全生命周期、纵贯多层级组织架构&#xff0c;并彰显多元智能特性的复杂系统。这一架构从生命周期、系统层级、智能特征三个…...

怎么获取键值对的键的数值?

问&#xff1a; 通过paelData.cardMap.C0002112可以获取到Cooo2112里面的数据&#xff0c;但是有时候接口返回的不是C0002112而是C0002093或者其他值&#xff0c;请问我该怎么写&#xff1f; 后端返回的数据是这样的&#xff1a; cardMap: { C0002112: { name: Item 1, va…...

反向代理后Request.Url.AbsoluteUri获取成了内网IP

出现的问题&#xff1a;用户请求的是域名&#xff0c;而后端通过Request.Url.AbsoluteUri获取用户请求的绝对路径时&#xff0c;变成了内网IP 解决方式&#xff1a; 反向代理配置中加上&#xff1a; proxy_set_header Host $host; # proxy_set_header Host h o s t : host: h…...

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化

论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息&#xff1a; 简介&#xff1a; 本文的背景是基于人类语言理解的组合性特征&#xff0c;即语言处理本质上是层次化的&#xff1a;语法规则将词级别的意义组合成更大的成分的意义&…...

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…...

window系统,照片应用打开图片,但是提示操作系统找不到已输入的环境选项,请问怎么解决,以便能打开图片

文章目录 问题描述问题解决一、先用AI提问&#xff0c;看能否得到解答二、最终的解决方法-修改环境变量 至此问题解决。 问题描述 Windows中&#xff0c;使用默认的图片应用打开图片时&#xff0c;提示&#xff1a; 操作系统找不到已输入的环境选项如下图&#xff1a; 这个问…...

Excel之查找函数-XLOOKUP

背景&#xff1a; 某些数据处理&#xff0c;需要对比两个乱序或者数据不完全相同的数值&#xff0c;取到另外一个数据值&#xff0c;数据量大的情况下&#xff0c;人工对比太耗时&#xff0c;XLOOKUP函数是一个查找函数&#xff0c;可以通过遍历对比某一单元格的值&#xff0c…...

深入理解 Java 内存管理:堆和栈

深入理解 Java 内存管理&#xff1a;堆和栈的全面解析 在 Java 编程语言中&#xff0c;内存管理是一个至关重要的概念&#xff0c;其中堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两个核心的内存区域。理解它们的工作原理、用途以及它们在程序执行过程…...

深度全解析开放开源大模型之BLOOM

BLOOM是 BigScience Large Open-science Open-access Mul-tilingual Language Model首字母的缩写。 BigScience 不是财团&#xff08;consortium&#xff09;&#xff0c;也不是正式成立的实体。这是一个由HuggingFace、GENCI和IDRIS发起的开放式协作组织&#xff0c;以及一个…...

下载谷歌浏览器的官方离线安装包

网址&#xff1a;https://support.google.com/chrome/answer/95346?hlzh-Hans&coGENIE.Platform%3DDesktop#zippy%2Cwindows...

ORACLE创建用户报错ORA-65096: invalid common user or role name

在高版本的oracle中创建用户时提示错误ORA-65096: invalid common user or role name&#xff0c;官网说明用户名必须使用C##或c##开头。以下方法亲测有效。 通过设置"_ORACLE_SCRIPT"参数为true来临时绕过CDB中创建用户必须以"C##"开头的限制。请注意&…...

河工oj第七周补题题解2024

A.GO LecturesⅠ—— Victory GO LecturesⅠ—— Victory - 问题 - 软件学院OJ 代码 统计 #include<bits/stdc.h> using namespace std;double b, w;int main() {for(int i 1; i < 19; i ) {for(int j 1; j < 19; j ) {char ch; cin >> ch;if(ch B) b …...

运维大屏与设备仪表盘:打造高效运维管理的视觉中枢

在快速发展的信息化时代&#xff0c;运维行业面临着前所未有的挑战。随着业务规模的不断扩大和系统复杂度的日益增加&#xff0c;如何高效、准确地监控和管理设备运行状态&#xff0c;成为运维团队亟待解决的问题。运维大屏与设备仪表盘作为运维管理的重要工具&#xff0c;为运…...

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…...

使用setsockopt函数SO_BINDTODEVICE异常,Protocol not available

前言 最近在使用OLT的DHCP Server的时候发现一些异常现象&#xff0c;就是ONU发的一个vlan的discover包其他不同vlan的DHCP地址池也会收到&#xff0c;导致其他服务器也发了offer包&#xff0c;ONU同时会有多个ip地址。一开始是没有使用SO_BINDTODEVICE&#xff0c;后面查到使…...

rpm包转deb包或deb包转rpm包

Debian系&#xff08;Ubuntu、Deepin、麒麟Destop等&#xff09;用的安装包是deb的&#xff0c;Red Hat系&#xff08;CentOS、欧拉、麒麟Server等&#xff09;用的安装包是rpm的。 如果需要在Ubuntu上安装rpm&#xff0c;或需要在CentOS上安装deb&#xff0c;需要安装alien s…...

ChatGPT 和文心一言哪个更好用?

ChatGPT vs 文心一言&#xff1a;哪个更好用&#xff1f; 引言 在人工智能蓬勃发展的今天&#xff0c;聊天机器人已经成为我们生活和工作中不可或缺的一部分。你可能听说过ChatGPT和文心一言这两个热门的聊天机器人&#xff0c;它们分别来自OpenAI和百度。那么&#xff0c;究…...

T113-S3 Tina 存储类型修改

前面介绍了如何在 Tina 中添加新的板子&#xff0c;本节介绍如何修改板子存储类型。 1、确定存储类型 Tina 支持多种存储类型&#xff0c;包括 SD 卡、eMMC、SPI NAND、SPI NOR 等。在添加板子之前&#xff0c;需要确定板子使用的存储类型。 存储类型修改 在 device/config/…...

【css】基础(一)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;css专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &a…...

Linux中inode

磁盘的空间管理 如何对磁盘空间进行管理&#xff1f; 假设在一块大小为500G的磁盘中&#xff0c;500*1024*1024524288000KB。在磁盘中&#xff0c;扇区是磁盘的基本单位&#xff08;一般大小为512byte&#xff09;&#xff0c;而文件系统访问磁盘的基本单位是4KB&#xff0c;因…...

verilog fpga 如果if语句==号后面是个表达式 运行不稳定

来自 文心一言 在Verilog中编写FPGA代码时&#xff0c;使用if语句进行条件判断是常见的操作。然而&#xff0c;当if语句中的条件判断使用的是表达式&#xff08;如后面是一个复杂的表达式&#xff09;&#xff0c;确实可能会遇到运行不稳定的问题。这通常是由于以下几个原因导…...

BFS广度优先搜索

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种用于遍历或搜索树或图的算法。 它从根节点开始&#xff0c;逐层访问每个节点&#xff0c;并在访问完一层后才访问下一层。BFS常用于寻找最短路径的问题。 下面将用实例一和实例二来实现BFS广度优先搜索 …...

uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊

实现效果如图 抽成组件navbar.vue&#xff0c;放入分包 <template><view class"header-nav-box":style"{height:Props.imgShow?:statusBarHeightpx,background:Props.imgShow?:Props.bgColor||#ffffff;}"><!-- 是否使用图片背景 false…...

小程序项目的基本组成结构

分类介绍 项目根目录下的文件及文件夹 pages文件夹 用来存放所有小程序的页面&#xff0c;其中每个页面都由4个基本文件组成&#xff0c;它们分别是&#xff1a; .js文件&#xff1a;页面的脚本文件&#xff0c;用于存放页面的数据、事件处理函数等 .json文件&#xff1a;…...

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…...

《C++与 OpenCV 机器学习模块:目标检测的强大融合》

在当今科技飞速发展的时代&#xff0c;目标检测技术已经成为计算机视觉领域的一颗璀璨明珠&#xff0c;广泛应用于安防监控、自动驾驶、智能图像分析等众多领域。而 C语言凭借其高效性和强大的性能&#xff0c;与 OpenCV 的机器学习模块相结合&#xff0c;为实现精准且高效的目…...

函数与模块

目录 1.函数 1.1.函数概念 1.2.函数定义 1.3.函数分类 1.4.函数参数类型 1.4.1.位置参数 1.4.2.关键字参数 1.4.3.默认值参数 1.4.4.可变参数 1.5.匿名函数 1.6.参数传递问题 2.冒泡排序 2.1.冒泡排序规则 2.2.冒泡排序实现 3.math 模块 4.random 模块 5.date…...

SQL面试题——滴滴SQL面试题 取出累计值与1000差值最小的记录

滴滴SQL面试题 取出累计值与1000差值最小的记录 今天的题目来自滴滴出行 已知有表cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 +-----+--------+ | id | money | +-----+--------+ | 1 | 200 | | 2 | 300 …...

使用 Elastic 和 Amazon Bedrock 制作混合地理空间 RAG 应用程序

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Srinivas Pendyala, Ayan Ray 借助 Elasticsearch 及其向量数据库&#xff0c;你可以构建可配置的搜索和可信的生成式 AI (GenAI) 体验&#xff0c;这些体验可快速从原型扩展到生产。主要功能包括&#xff1a; 内…...

计算机软著个人申请指南

笔者最近申请了两本软著证书&#xff0c;结合自己的经历介绍一下。 软著登记网址&#xff1a;中国版权业务登记平台 准备工作 你的项目源码源代码统计工具 source-codes-trim&#xff1a;笔者开发自用的源码处理工具vscode插件其他的可以自己在网上搜资源 Word 申请流程 注…...

OmniParser一种用于增强视觉语言模型与用户界面交互效果的技术

OmniParser一种用于增强视觉语言模型与用户界面交互效果的技术 OmniParser的核心功能是将用户界面截图转换为结构化元素&#xff0c;这一过程涉及几个关键步骤和技术要素&#xff0c;解决了视觉语言模型&#xff08;VLMs&#xff09;在与用户界面交互时所面临的多种挑战。 1.…...

HBU深度学习作业10-BPTT

1、推导BPTT 2、推导梯度 3、分析其可能存在梯度爆炸的原因并给出解决方法 为了改善循环神经网络的长程依赖问题&#xff0c;一种非常好的解决方案是在公 式(6.50)的基础上引入门控机制来控制信息的累积速度&#xff0c;包括有选择地加入新 的信息&#xff0c;并有选择地遗忘之…...

L2G6000 - MindSearch部署实践

文章目录 MindSearch部署实践部署MindSearch到 hugging face Spaces上启动MindSearch启动后端启动前端 部署到自己的 HuggingFace Spaces上 部署MindSearch streamlit版本到Hugging Face上 MindSearch部署实践 部署MindSearch到 hugging face Spaces上 在Codespaces上选择Bla…...

CentOS 7 上安装 MySQL 8.0.40 (二进制安装)

要在 CentOS 7 上安装 MySQL 8.0.40&#xff0c;按照以下步骤操作&#xff1a; 下载安装包。 https://dev.mysql.com/downloads/mysql/ 下载之前查看系统c版本 解压安装包 首先&#xff0c;解压下载的 .tar.xz 安装包。 cd /path/to/your/downloads tar -xvf mysql-8.0…...

应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建

水下无人航行器数字样机功能模型构建 一、项目背景 为响应水下装备系统研制数字化转型及装备系统数字样机建设的需要&#xff0c;以某型号水下无人航行器&#xff08;Underwater Unmanned Vehicle&#xff0c;UUV&#xff09;为例&#xff0c;构建UUV数字样机1.0功能模型。针对…...

Chromium CDP 开发(六):注册自己的指令(下)

引言 在这一章节中&#xff0c;我们将详细讲解如何将新定义的 TimerSend 指令和 TimerLog 事件添加到项目 的 inspector_protocol_config.json 文件中&#xff0c;从而使这些功能能够在 CDP&#xff08;Chrome DevTools Protocol&#xff09;中被识别并正常使用。 inspector_pr…...

【基础算法总结】哈希表/set/map篇

目录 一&#xff0c;哈希表简介二&#xff0c;算法原理和代码实现1.两数之和349.两个数组的交集面试题01.02.判断是否互为字符重排217.存在重复元素219.存在重复元素II692.前k个高频单词45.字母异位词分组 三&#xff0c;算法总结 一&#xff0c;哈希表简介 哈希思想是算法中一…...

数字逻辑理论题目+知识点复习

昨天考完的数字逻辑理论考试&#xff0c;啊啊啊还有实验&#xff0c;生活不易&#xff0c;且行且珍惜。 请以最大的善意对待生活(,,>᎑<,,)。...

证明网络中的流形成一个凸集

证明网络中的流形成一个凸集 步骤1&#xff1a;定义和符号步骤2&#xff1a;线性组合步骤3&#xff1a;验证容量限制步骤4&#xff1a;验证流量守恒结论示例代码&#xff08;C语言&#xff09; 在网络流理论中&#xff0c;一个流 f f f 是定义在网络图的边集上的一种函数&…...

SpringBoot3

1. 配置文件 1. 基本使用 使用 配置文件classpath:application.properties spring.jdbc.drivercom.mysql.cj.jdbc.Driver spring.jdbc.urljdbc:mysql://localhost:3306/batis spring.jdbc.usernameroot spring.jdbc.password123456使用配置文件的值&#xff1a;Value("…...

Linux之线程概念,理解和控制

Linux之线程概念&#xff0c;理解和控制 一.线程1.1线程的概念1.2线程的理解1.3线程的优缺点&#xff0c;异常和用途1.4线程和进程1.5线程的控制1.4.1线程的创建1.4.2线程的终止1.4.3线程的等待1.4.4线程的分离 一.线程 1.1线程的概念 在我们了解了进程的同时我们在学校上课时…...

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化&#xff0c;传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念&#xff0c;如Trace和Span&#xff0c;并讨论了其基本原理。接着&#xff0c;文章介绍了SkyWa…...