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

mybatis-plus超详细讲解

mybatis-plus

(简化代码神器)

地址:https://mp.baomidou.com/

目录

mybatis-plus

简介

特性

支持数据库

参与贡献

快速指南

1、创建数据库 mybatis_plus

2、导入相关的依赖

3、创建对应的文件夹

4、编写配置文件

5、编写代码

5.1、User实体类

5.2、mapper层

5.3、测试类扫描mapper层

6、测试

 7、总结

常用注解

新增数据

修改数据

删除数据

条件操作

1、QueryWrapper

1.1、eq

1.2、like

1.3、ge

1.4、lt

1.5、gt

2、查询

3、删除

4、修改

5、新增

service层条件操作

1、查询

2、删除

3、新增

4、修改

总结


简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持数据库
  • mysql 、 mariaDB 、 oracle 、 db2 、 h2 、 hsql 、 DuckDB、 Derby、 Phoenix
  • 神州通用、虚谷、优炫

提示

任何能使用 MyBatis 进行增删改查,并且支持标准 SQL 的数据库应该都在 MyBatis-Plus 的支持范围内,具体支持情况如上。

如果您想要的数据库类型不在上面的列表,欢迎给我们 PR 您的数据库方言。

参与贡献

欢迎各路好汉一起来参与完善 MyBatis-Plus,我们期待你的 PR!

  • 贡献代码:代码地址 MyBatis-Plus ,欢迎提交 Issue 或者 Pull Requests
  • 维护文档:文档地址 MyBatis-Plus-Doc ,欢迎参与翻译和修订
  • 授权说明:MyBatis-Plus LOGO 官方授权沟通邮件

快速指南

我们将通过一个简单的项目来阐述 MyBatis-Plus的强大功能,在此之前,您需要先了解以下几点:

  • 拥有 Java 开发环境以及相应 IDE
  • 熟悉 Spring Boot
  • 熟悉 Maven

使用第三方组件:

1、导入对应的依赖

2、代码如何编写

步骤

1、创建数据库 mybatis_plus

现有一张 User 表,其表结构如下:

idnameageemail
1小李18admin1@baomidou.com
2小陈20admin2@baomidou.com
3小徐28admin3@baomidou.com
4小贾21admin4@baomidou.com
5小张24admin5@baomidou.com

其对应的数据库 sql 脚本如下:

CREATE DATABASE IF NOT EXISTS `mybatis_plus` USE `mybatis_plus`;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` BIGINT NOT NULL COMMENT '主键ID',`name` VARCHAR(30) DEFAULT NULL COMMENT '姓名',`age` INT DEFAULT NULL COMMENT '年龄',`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;INSERT  INTO `user`(`id`,`name`,`age`,`email`) VALUES 
(1,'小李',18,'admin1@baomidou.com'),
(2,'小陈',20,'admin2@baomidou.com'),
(3,'小徐',28,'admin3@baomidou.com'),
(4,'小贾',21,'admin4@baomidou.com'),
(5,'小张',24,'admin5@baomidou.com');
2、导入相关的依赖

完整的pom文件,复制粘贴即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.26</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

说明:我们使用mybatis-plus可以节省我们大量的代码,尽量不要同时导入mybatis和mybatis-plus!

3、创建对应的文件夹

pojo->mapper->service->controller

4、编写配置文件
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root
#连接数据库mybatis-plus.type-aliases-package=com.example.demo.pojo
mybatis-plus.configuration.map-underscore-to-camel-case=false
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.auto-mapping-behavior=full
#mybatis相关的配置
5、编写代码

5.1、User实体类
package com.example.demo.pojo;import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;/*** <p>* * </p>** @author author* @since 2024-12-15*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user")
public class User implements Serializable {private static final long serialVersionUID = 1L;/*** 主键ID*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 邮箱*/private String email;}
5.2、mapper层
package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.pojo.User;/*** <p>*  Mapper 接口* </p>** @author author* @since 2024-12-15*/
//在对应的Mapper上继承基本的类baseMapper
public interface UserMapper extends BaseMapper<User> {//所有的CRUD已经编写完成//不需要像以前的配置一些xml}

此时编写完这两个之后就可以开始进行测试了,至于之前的mapper.xml文件现在无需进行编写

5.3、测试类扫描mapper层
package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@MapperScan("com.example.demo.mapper")
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
6、测试
package com.example.demo;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class DemoApplicationTests {@AutowiredUserMapper userMapper;@Testvoid contextLoads() {List<User> users = userMapper.selectList(null);for (User user : users) {System.out.println(user.toString());}}}

直接在测试类中编写以上代码,selectList中为null原因是需要传入一个QueryWrapper条件管理的对象

而传入一个null值表示不需要任何条件,所以是全查

此时控制台就会将所有的数据都输出

完整的代码示例请移步:Spring Boot 快速启动示例 [Spring MVC 快速启动示例]

 7、总结

通过以上几个简单的步骤,我们就实现了 User 表的查找功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。但 MyBatis-Plus 的强大远不止这些功能,想要详细了解 MyBatis-Plus 的强大功能?那就继续往下看吧!

配置日志

在application.xml文件中写入这句代码

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

常用注解

@TableName("表名")

当表名与实体类名不一致时,可以在实体类上加入@TableName()声明

@TableId声明属性为表中的主键(若属性名称不为默认id)

@TableFieId("字段") 当实体类属性与表字段不一致时,可以用来声明

@TableName("表名")
public class User{@TableIdprivate Long userId;@TableFieId("name")private String realName}  

新增数据

我们需要配置主键自增

1、实体类字段上 @TableId(type =IdType.AUTO)

/*** 主键ID*/@TableId(value = "id", type = IdType.AUTO)private Long id;

 编写一个Test测试类

 @Testpublic void insert(){User user = new User();user.setName("小明");user.setAge(18);user.setEmail("admin1@baomidou.com");userMapper.insert(user);}

 这边也是同样直接调用自带的insert方法,插入完后执行selectList方法查看是否成功

此时可以看到,确实多了一条数据,并且就是刚刚插入的数据

修改数据

@Testpublic void update(){User user = new User();user.setName("小明");user.setAge(18);user.setEmail("admin6@baomidou.com");user.setId(6L);userMapper.updateById(user);}

修改数据时需要传入一个id,而调用的方法也需要使用updateById的方法,并且是根据在实体类中设置的主键来判断的,所以说实体类的注解很关键(如果我们设置了其他的位主键,那么就会根据其他的来进行修改)

执行完毕后,使用selectList再次查询,查看是否成功修改,

数据已成功修改!!!!

删除数据

这边为我们提供了很多的删除方法,而我们用的最多的也就是第二种deleteById(单个删除)

也是非常简单,只需要添加一条代码就可以了

@Testpublic void delete(){userMapper.deleteById(6);}

里面的值也就是我们需要删除的数的id,我们现在把刚刚添加的删除

执行方法后,再次使用selectList方法查询

可以看到,已经成功删除

条件操作

上面的增删查改操作都仅仅是很普通的操作,那么现在我们对操作进行优化,可以有更加高级的操作

1、QueryWrapper

在查询中,上方展示的是全查,现在展示带条件的查询

并且以下的方法可以使用多个,表示同时带多个条件

1.1、eq

表示等于查询,在数据库中表示 “=”

@Testvoid contextLoads() {QueryWrapper<User> qw=new QueryWrapper<>();qw.eq("name","小李");List<User> users = userMapper.selectList(qw);for (User user : users) {System.out.println(user.toString());}}

这段代码就可以实现查询为name的列,name列里面是小李

这样查询结果就是name小李的一行

1.2、like

在数据库中表示 “like”,也就是模糊查询

@Testvoid contextLoads() {QueryWrapper<User> qw=new QueryWrapper<>();qw.like("name","小");List<User> users = userMapper.selectList(qw);for (User user : users) {System.out.println(user.toString());}}

这样就可以将name中包含 “小” 的每一行都输出

执行方法后,可以看到确实将每一条name中包含了 “小” 的都输出了

1.3、ge

gt相似,此代码表示在数据库中,age列大于等于19的都会输出

此时只输出了四条,因为有一条的age是小于19的,所以不会输出

1.4、lt

表示小于,在age这个列中小于19的都会输出

@Testvoid contextLoads() {QueryWrapper<User> qw=new QueryWrapper<>();qw.lt("age","19");List<User> users = userMapper.selectList(qw);for (User user : users) {System.out.println(user.toString());}}

此时只输出了age小于19的数据

1.5、gt

表示大于,在age这个列中大于19的都会输出

@Testvoid contextLoads() {QueryWrapper<User> qw=new QueryWrapper<>();qw.gt("age","19");List<User> users = userMapper.selectList(qw);for (User user : users) {System.out.println(user.toString());}}

此时只输出了age大于19的数据

方法太多这里表示不完,详细的请看官网​​​​​​

2、查询

selectList():根据qw类来当做参数,根据条件查询

selectBatchIds():可以有多个id,将多个id全查出来

selectById():单查,只能有一个id,查询一条数据

selectCount():查数量,将qw类的条件当做参数,根据条件查询,将数量查出来

selectByMap():传递一个Map集合,集合中的key是列名,value是值

selectMaps():传递一个qw类,再传递一个Map集合,将两个的条件一起结合

selectObjs():即使在查询中指定了多个字段,selectObjs 方法也只会返回查询结果中每个记录的第一个字段的值,结果以 List<Object> 的形式返回

selectOne():如果查询结果有多条数据,那么会抛出异常;如果没有数据,则返回 null

selectPage():分页查询使用,传递一个Ipage类,以及一个qw

3、删除

delete():传递一个qw类,如果qw中没有任何条件,那么就会全部删除

deleteById():传递一个id,可以是字符串,也可以是数字等,根据在实体类中的主键来进行删除

deleteBatchIds():传递多个id,同样可以是字符串或数字等,表示同时删除多条数据

deleteByMap():传递一个Map集合,key表示列,value表示值,可以同时删除多个

4、修改

update中只有两个方法,也非常的简单

update():根据qw条件进行修改

updateById():传入一个实体类,直接根据实体类的信息进行修改,修改主键所在的列

5、新增

insert只有一个方法,也是无需多说

insert():传入一个实体类,直接增加实体中的信息

service层条件操作

刚刚所有的操作都是在mapper层实现的,所以说大多部分只有一些方法,而service层有更多的方法供我们使用

1、查询

在service层中,方法也与mapper层有所不同,这里的查询方法变成了list()

但是与之前的都基本相似,这里就不多介绍了,因为都差不多

2、删除

删除方法也有所不同,从delete变成了remove,并且都与mapper层相似,所以也不过多介绍了

3、新增

新增方法从insert变成了save,并且也比之前多了很多

saveBatch():一次性增加多条数据,批量新增

saveOrUpdate():这个在项目中使用最频繁,因为他只需要一个方法,就可以实现新增或修改,实现原理也很简单,传入一个实体类,如果有id,那么就是修改,如果没有id,那么就是新增

saveOrUpdateBatch():同样,有id则修改,无id则新增,可以批量操作

4、修改

修改的方法也很多,不过大多方法一看就知道什么意思,所以只介绍部分方法

updateBatchByid():批量修改,可以传入一个集合,里面都是实体类的信息

lambdaUpdate():使用 Lambda 表达式来描述要更新的实体类对象的字段和条件,从而实现更加简洁和类型安全的更新操作

总结

那么,mybatis-plus的使用就都介绍完了,是不是非常简便呢,这也就是mybatis-plus为什么要推出的原因,就是因为sql代码太难写了,所以使用了mybatis-plus就可以极大的简化我们的开发

如果想更深入的了解mybatis-plus可以前往官网查看:MyBatis-Plus 🚀 为简化开发而生 (baomidou.com)

制作不易,有问题可联系作者,或者直接在评论声明,作者看到会第一时间解决

相关文章:

mybatis-plus超详细讲解

mybatis-plus &#xff08;简化代码神器&#xff09; 地址&#xff1a;https://mp.baomidou.com/ 目录 mybatis-plus 简介 特性 支持数据库 参与贡献 快速指南 1、创建数据库 mybatis_plus 2、导入相关的依赖 3、创建对应的文件夹 4、编写配置文件 5、编写代码 …...

浏览器可以直接请求 websocket

一、原生支持 浏览器原生支持 WebSocket 协议&#xff0c;这使得开发者可以直接在 JavaScript 代码中使用 WebSocket 来建立与服务器的双向通信通道。 const socket new WebSocket("ws://localhost:8080");socket.addEventListener("open", function (e…...

* 和 .* 的区别(MATLAB)

在 MATLAB 中&#xff0c;* 和 .* 都是用来进行乘法操作的运算符&#xff0c;但它们有不同的应用场景。我们将从数学和编程的角度详细解析这两者的区别&#xff0c;并且讲解 MATLAB 中 . 运算符的其他常见用法。 1. * 和 .* 的区别 *&#xff1a;矩阵乘法&#xff08;线性代数…...

51c视觉~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12059371 #SaRA 修改一行代码就能实现高效微调&#xff01;上海交大&腾讯开源&#xff1a;兼顾原始生成和下游任务 仅修改一行训练代码即可实现微调过程。 文章链接&#xff1a;https://arxiv.org/pdf/2409.06633 …...

JVM虚拟机总揽

为什么 Java 要在虚拟机里运行&#xff1f; 先说结论&#xff1a; 可以一次编译&#xff0c;在各个硬件平台如 Windows_x64、Linux_aarch64&#xff09;都可以执行建立一个托管环境&#xff08;Managed Runtime&#xff09;&#xff0c;这个托管环境能够代替我们处理一些代码…...

PCL点云库入门——PCL库可视化之PCLVisualizer类显示复杂点云信息等(持续更新)

1、PCLVisualizer类可视化 PCLVisualizer类作为PCL库可视化到的高级功能&#xff0c;不仅支持点云等数据的可视化&#xff0c;还提供了丰富的交互功能和自定义选项&#xff0c;如颜色调整、视角切换、标注添加等。用户可以通过PCLVisualizer类轻松实现复杂的数据分析和处理任务…...

Hugface国内镜像

问题&#xff1a; urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /Salesforce/blip-image-captioning-base/resolve/main/preprocessor_config.json (Caused by ProxyError(Cannot connect to proxy.,…...

Vue3 重置ref或者reactive属性值

需要重新定义一个对象绑定复制给原对象 。 实例代码: const data () > ({groupId: ,groupCode: ,groupName: ,groupType: ,});const formData ref(data());//重置对象值 const reset()>{Object.assign(formData, data()…...

前端的Python入门指南(完):错误和异常处理策略及最佳实践

《前端的 Python 入门指南》系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;常用语法和关键字对比&#xff08;二&#xff09;&#xff1a;函数的定义、参数、作用域对比&#xff08;三&#xff09;&#xff1a;数据类型对比 - 彻底的一切皆对象实现和包装对象异…...

c++:std::map下标运算符的不合理使用

这是我分析之前遗留代码时发现的一个隐藏点&#xff1b;不过我并不认为这样使用std::map是合理的。 看看简化后的代码&#xff0c;v1、v2的值应该是多少呢&#xff1f; #include <map>std::map<int, int> cm[2];int get_cm_value(int device, int ctrl) { auto …...

音频数据采样入门详解 - 给Python初学者的简单解释

音频数据采样入门详解 - 给Python初学者的简单解释 声音是如何变成数字的&#xff1f;什么是采样率&#xff1f;为什么要懂这个&#xff1f;Python小例子总结 大家好&#xff01;今天我们来聊一个有趣的话题&#xff1a;音频数据是如何在计算机中处理的。让我用最简单的方式来解…...

vue el-dialog实现可拖拉

el-dialog实现拖拉&#xff0c;每次点击度居中显示&#xff0c;以下贴出代码具体实现&#xff0c;我是可以正常拖拉并且每次度显示在中间&#xff0c;效果还可以&#xff0c;需要的可以丢上去跑跑 组件部分&#xff1a; <el-dialog:visible.sync"dialogVisible"…...

iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境

在 Objective-C 项目中设置 Dev、Staging 和 Prod 三个不同的环境&#xff0c;并为每个环境使用不同的 Bundle ID&#xff0c;可以通过以下步骤实现&#xff1a; 步骤 1: 创建不同的 Build Configuration 打开项目&#xff1a; 启动 Xcode 并打开你的项目。 选择项目文件&…...

开源实时多模态AI Agent,搭载Gemini多模态API(在线体验)

今天发现一个惊艳的开源项目&#xff0c;利用多模态大模型API进行多智能体交互。支持RAG、搜索等。 TEN Agent 是一款由 TEN 提供支持的对​​话式 AI&#xff0c;集成了 Gemini 2.0 Multimodal Live API、OpenAI Realtime API、RTC 等。它提供实时的看、听和说功能&#xff0…...

【持续更新】Github实用命令

Intro 最近高强度使用github&#xff0c;遂小计于此作为备忘。 Basic github是一个代码管理软件&#xff0c;能够track文件变动并且管理版本&#xff0c;是当代coding必不可少的工具。当你安装好github在本地以后&#xff0c;你可以通过以下命令初始化当前文件夹&#xff08…...

B树的性质和插入过程

性质 平衡性&#xff1a;所有叶子节点都在同一层多路&#xff1a;m 阶 B 树 最多&#xff1a; m 个分支&#xff0c;m-1 个元素 最少&#xff1a; 根节点 2 个分支 1个元素 其他节点 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ 个分支 ⌈ m / 2 ⌉ \lceil m/2\rceil ⌈m/2⌉ −…...

分布式链路追踪-02-Dapper 论文介绍

开源项目 auto-log 自动日志输出 概要 现代互联网服务通常被实现为复杂的、大规模的分布式系统。 这些应用程序是由软件模块的集合构建的&#xff0c;这些模块可能由不同的团队使用不同的编程语言开发&#xff0c;并且可以跨越多个物理设施的数千台机器。 在这样的环境中&…...

python:用 sklearn 构建线性回归模型,并评价

编写 test_sklearn_6.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 估计器构建线性回归模型 """ import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import rcParamsfrom sklearn import dataset…...

CTFHUB 信息泄露 备份文件下载-网站源码

根据提示应是猜测网站源码的备份文件&#xff0c;可以采用bp拼接文件名和后缀 开启bp抓包后设置第一个攻击点导入文件名 第二个攻击点导入后缀 开始暴力破解&#xff0c;有成功响应的 拼接到网站后缀后可以直接下载 解压缩后记事本的名字就是flag 总结&#xff1a; …...

Java String详解(三)

上一篇博客&#xff1a;Java String详解&#xff08;二&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blo…...

在pycharm2024.3.1中配置anaconda3-2024-06环境

version: anaconda3-2024.06-1 pycharm-community-2024.3.1 1、安装anaconda和pycharm 最新版最详细Anaconda新手安装配置环境创建教程_anaconda配置-CSDN博客 【2024最新版】超详细Pycharm安装保姆级教程&#xff0c;Pycharm环境配置和使用指南&#xff0c;看完这一篇就够了…...

从0到1实现vue3+vite++elementuiPlus+ts的后台管理系统(一)

前言&#xff1a;从这篇文章开始实现vue3vite的后台管理系统&#xff0c;记录下自己搭建后台系统图的过程。 这篇文章完成项目的初始化和基本配置&#xff0c;这一步可以直接跟着vue3官网进行。整个系列只有前端部分&#xff0c;不涉及后端。 vue3官网&#xff1a;https://cn.…...

升级thinkphp8最新版本,升级后发现版本不变

升级thinkphp8.0.3最新版本8.1.1&#xff0c;升级后发现版本不变&#xff0c; 更新TP有两个方法 1 全部更新(所有插件都一起更新) composer update 2 只更新TP框架核心 composer update topthink/framework 造成可能有两个原因&#xff0c;一是缓存问题&#xff0c;二是更新…...

PPP协议

PPP是一种常见的广域网数据链路层协议&#xff0c;主要用于在全双工的链路上进行点到点的数据传输封装&#xff0c;支持同步传输和异步传输&#xff0c;通常用于VPN和拨号上网 PPP 概述 PPP一般运行在serial串口上&#xff0c;是一种广域网协议&#xff0c;PPP建立分为LCP&a…...

JAVA基础:数据类型

JAVA基础:数据类型 强类型语言 强类型语言(Strongly Typed Language)是指在编程语言中,每个变量都必须有一个明确的类型,并且在编译时会进行类型检查。 JAVA是强类型语言,所有变量必须先定义后使用。 弱类型语言 弱类型语言(Weakly Typed Language)是指在编程中类…...

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…...

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来&#xff0c;Nacos 2.0 在社区的支持下已走过近三年&#xff0c;期间取得了诸多成就。在高性能与易扩展性方面&#xff0c;Nacos 2.0 取得了显著进展&#xff0c;同时在易用性和安全性上也不断提升。想了解更多详细信息&#xff0c;欢迎阅读我们之前发布的回…...

GeoIP介绍

文章目录 GeoIP1. GeoIP的详细介绍2. 在Go语言中使用GeoIP GeoIP GeoIP是一种技术&#xff0c;它允许通过IP地址来查询地理位置信息&#xff0c;如国家、地区、城市等。这种技术在网络安全、内容分发、市场分析等领域有着广泛的应用。 1. GeoIP的详细介绍 原理&#xff1a; …...

详述 BigDecimal 的错误计算

摘要 详细阐述在使用 Java 的 BigDecimal 类时&#xff0c;可能产生的错误计算。 据 java中BigDecimal的介绍及使用&#xff0c;BigDecimal格式化&#xff0c;BigDecimal常见问题-CSDN博客 介绍&#xff1a;“BigDecimal 的执行顺序不能调换&#xff08;乘法交换律失效&am…...

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法&#xff0c;如网格和点云&#xff0c;适合GPU加速的光栅化操作&#xff0c;但缺乏灵活性。而基于神经辐射场&#xff08;NeRF&#xff09;的表示方式&#xff0c;尽管质量高&#xff0c;但需要高成本的训练和渲染时间。此外&#xff0…...

(三)PyQT5+QGIS+python使用经验——解决各版本不兼容问题

一、问题描述 基础环境&#xff1a;Windows10&#xff08;64&#xff09; PyCharm2024 QGIS 3.22。 目的&#xff1a;解决之前python版本多&#xff0c;pyqt5以及QT Designer交互使用存在环境变量冲突矛盾&#xff0c;以及QGIS安装时自带python、pyqt5等问题。 尤其是在QT …...

uniapp navigateTo、redirectTo、reLaunch等页面路由跳转方法的区别

uni.switchTab 跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 // app.json {"tabBar": {"list": [{"pagePath": "index","text": "首页"},{"pagePath": "other","text&…...

[创业之路-198]:华为的成立发展与新中国的建立与发展路径的相似性比较

目录 一、公司比较 1、创业初期的艰难与挑战 2、坚持自主创新与研发 3、市场拓展与国际化战略 4、企业文化与社会责任 5、面临的挑战与应对策略 二、任正非管理企业的思想大量借鉴了毛泽东建国的思想 1、矛盾论与企业管理 2、群众路线与企业文化 3、战略思维与长远发…...

[Unity Shader]【图形渲染】【游戏开发】 Unity Shader与原始Shader的区别

在Unity中,Shader是用于控制如何渲染图形的程序,通常涉及到对图形管线的自定义操作。尽管所有的着色器都遵循基本的图形渲染流程,但Unity Shader和原始Shader(通常指OpenGL/DirectX等底层API的Shader)之间存在显著差异。理解这些区别能帮助开发者更好地在Unity环境下进行图…...

JAVA学习日记(二十七)反射

一、反射的概述 二、获取Class对象的三种方式 import testpackage.Student;public class Main {public static void main(String[] args) throws ClassNotFoundException {//获取.class对象的三种方式//1. Class.forName("全类名")//2. 类名.class//3. 对象.getClas…...

PyTorch中apex的安装方式

apex是NVIDIA开发的基于PyTorch的混合精度训练加速神器&#xff0c;能够增加运算速度&#xff0c;并且减少显存的占用。 Github地址&#xff1a;https://github.com/NVIDIA/apex官方教程&#xff1a;https://nvidia.github.io/apex/ 安装方式 需要注意的是apex的安装不能通过…...

JavaScript网络请求( XMLHttpRequest 对象,进度事件, 跨源资源共享)

一、 XMLHttpRequest 对象 IE5 是第一个引入 XHR 对象的浏览器。这个对象是通过 ActiveX 对象实现并包含在 MSXML 库中 的。为此&#xff0c; XHR 对象的 3 个版本在浏览器中分别被暴露为 MSXML2.XMLHttp 、 MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。 所有现代…...

Android Studio、JDK、AGP、Gradle、kotlin-gradle-plugin 兼容性问题

文章目录 问题&#xff1a;解决办法&#xff1a;gradle与 java的版本兼容AGP与Gradle的版本兼容kotlin 与 jvm 的版本兼容KGP、Gradle、AGP兼容关系kotlin 与 java 的编译版本配置 问题&#xff1a; 你从githb上clone了一个项目&#xff0c;本地跑的时候&#xff0c;各种报错。…...

滑动窗口(定长窗口)

题目一&#xff1a;找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 - 力扣&#xff08;LeetCode&#xff09; ​ ​ 分析 异位次&#xff0c;就是通过排序之后可以跟哪个单词一样&#xff0c;例如 hello 跟 lleho 这是定长窗口&#xff0c; 窗口维护在p的…...

Vue Web开发(九)

1. 用户管理 1.1. user页面下的diolog表单 本节课完成user页面下的diolog表单&#xff0c;表单里的元素都是动态渲染&#xff0c;以一个CommonForm组件的形式放入user页面。 运用Element ui Form表单。 1.1.1. CommonForm组件 在src/components下新建CommonForm.vue组件&am…...

go语言zero框架下的日志记录的sdk实战案例

在 Go 语言中&#xff0c;构建一个日志 SDK 是常见的开发任务&#xff0c;尤其是当你希望将日志记录集中管理时。一个好的日志 SDK 可以帮助你规范化日志记录的方式&#xff0c;并将日志存储到不同的地方&#xff08;例如&#xff1a;控制台、文件、数据库、远程日志服务等&…...

【Unity基础】Unity中拖拽3D物体的过程分析和实现方法

我们先来分析一下Unity中拖拽物体的过程&#xff1a; 第一步&#xff1a;先检测拖拽的输入方式&#xff0c;可以鼠标&#xff0c;触摸&#xff0c;可以用InputManager输入&#xff0c;也可以 使用InputSystem输入 第二步&#xff1a;获取触碰点的位置&#xff0c;并计算offse…...

深入了解Spring

目录 Spring基础 什么是Spring框架&#xff1f; Spring 包含的模块有哪些&#xff1f; Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架&#xff1f; Sp…...

vue3修改elementui-plus的默认样式的几种方法

#创作灵感 今天写vue的前端项目&#xff0c;因为需要去修改elementui-plus中drawer的默认样式&#xff0c;所以刚好将修改步骤记录下来。 一共提供了三种方法&#xff0c;但亲测第二种最好用。 使用第二种是可以无视自己的代码中是否定义了该盒子&#xff0c;因为有时候盒子的…...

免费开源!推荐一款网页版数据库管理工具!

免费开源&#xff01;推荐一款网页版数据库管理工具&#xff01; DBGate 是一个开源的数据库管理工具&#xff0c;DBGate 的最大特点是可以 Web 访问&#xff01;&#xff0c;轻松实现一台机器部署&#xff0c;所有人使用&#xff01; 无论是 MySQL、PostgreSQL、SQLite 还是…...

Ubuntu22.04切换gcc版本教程

在编译安装程序的时候,由于gcc版本过高,导致编译无法通过,需要降低gcc版本。 一、安装gcc版本 根据自己的需求安装gcc版本。 sudo apt update sudo apt install gcc-10 g++-10二、切换gcc版本 sudo update-alternatives --install /usr/bin/gcc gcc...

OpenCV相机标定与3D重建(24)计算两个二维点集之间的最佳仿射变换矩阵(2x3)函数estimateAffine2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个二维点集之间的最优仿射变换&#xff0c;它计算 [ x y ] [ a 11 a 12 a 21 a 22 ] [ X Y ] [ b 1 b 2 ] \begin{bmatrix} x\\ y\\ \en…...

并发修改导致MVCC脏写问题

并发修改导致MVCC脏写问题 一、概要 1.1 业务场景 数据库表结构设计&#xff1a; 一个主档数据&#xff0c;通过一个字段&#xff0c;逗号分隔的方式去关联其他明细信息的id。 如主档数据A&#xff0c;有3条明细数据与A关联&#xff0c;其id分别是1,2,3&#xff0c;那么其存…...

webSokect安卓和web适配的Bug 适用实时语音场景

❌BUG&#xff1a; Failed to construct WebSocket: The URLs scheme must be either ws or wss. https is not allowed.WebSocket 协议在创建连接时&#xff0c;规定其 URL 的协议头&#xff08;scheme&#xff09;必须是 ws&#xff08;用于非加密的普通 WebSocket 连接&…...

Linux系列之如何更换Centos yum源?

环境 Centos7Xshell7 问题描述 最近安装了一个虚拟机&#xff0c;准备用来学习&#xff0c;不过使用yum命令安装一些软件&#xff0c;不过使用这个命令时候&#xff0c;提示 Cannot find a valid baseurl for repo: base/7/x86_64&#xff0c;Could not retrieve mirrorlis…...