MyBatis-Plus 核心功能
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、条件构造器
- 1、核心 Wrapper 类型
- 基础查询示例
- SQL 查询
- 使用 QueryWrapper 实现查询
- 更新操作示例
- 场景一:基础更新
- SQL 查询
- 使用 QueryWrapper 实现更新
- 场景二:复杂更新
- SQL 查询
- 使用 UpdateWrapper 实现更新
- 2、Lambda 表达式优化
- 改造查询示例
- 二、自定义 SQL 整合
- 场景说明
- Mapper 接口定义
- XML 映射文件
- 业务层调用
- 三、Service 接口
- 1. 基础接口定义继承 IService
- 2. 服务实现类规范
- 3. 结构优势说明
- 4. 方法调用示例
- MP的Service接口使用流程是怎样的?
- 1. 自定义 Service 接口继承 IService 接口
- 2. 实现自定义 Service 接口并继承Servicelmpl类
- 3. Mapper 接口的定义
- 4. 配置 Mapper 扫描
- 5. 在 Controller 组件中使用 Service
- 总结:完整流程
- 四、QueryWrapper 查询方法与 UpdateWrapper 更新方法对照手册
- QueryWrapper
- 核心方法
- 其他常用方法
- 示例
- UpdateWrapper
- 核心方法
- 示例
一、条件构造器
MyBatis-Plus 提供强大的 Wrapper
类体系,支持通过链式调用构建复杂查询条件,覆盖日常开发中各类 SQL 场景需求。
1、核心 Wrapper 类型
类型 | 适用场景 | 特点 |
---|---|---|
QueryWrapper | 构建 SELECT /UPDATE /DELETE 条件 | 字段名硬编码 |
LambdaQueryWrapper | 构建 SELECT /UPDATE | Lambda 表达式,避免硬编码 |
UpdateWrapper | 特殊 SET 语句构建 | 支持复杂 SET 逻辑 |
LambdaUpdateWrapper | 特殊 SET 语句构建 | Lambda 表达式优化 |
Wrapper
构造复杂SQL
基础查询示例
查询用户名包含 “o” 且余额 ≥1000 的用户,返回指定字段。
SQL 查询
SELECT id, username, info, balance
FROM user
WHERE username LIKE '%o%' AND balance >= 1000;
使用 QueryWrapper 实现查询
@Test
void testQueryWrapper() {// 1. 构建条件构造器(字段硬编码方式)QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.select("id", "username", "info", "balance") // 指定返回字段.like("username", "o") // 模糊查询:username LIKE '%o%'.ge("balance", 1000); // 范围查询:balance >= 1000// 2. 执行查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);
}
更新操作示例
场景一:基础更新
将用户名为 “jack” 的用户余额设为 2000。
SQL 查询
UPDATE user
SET balance = 2000
WHERE username = 'jack';
使用 QueryWrapper 实现更新
@Test
void testUpdateByQueryWrapper() {// 1. 准备更新实体(SET 字段)User updateEntity = new User();updateEntity.setBalance(2000);// 2. 构建条件构造器QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.eq("username", "jack"); // 精确匹配条件// 3. 执行更新userMapper.update(updateEntity, wrapper);
}
场景二:复杂更新
对 ID 为 1、2、4 的用户执行余额扣减 200 操作。
SQL 查询
UPDATE user
SET balance = balance - 200
WHERE id IN (1, 2, 4);
使用 UpdateWrapper 实现更新
@Test
void testUpdateWrapper() {// 1. 定义操作参数List<Long> targetIds = Arrays.asList(1L, 2L, 4L);int deductionAmount = 200;// 2. 构建 UpdateWrapper(支持复杂 SET 语句)UpdateWrapper<User> wrapper = new UpdateWrapper<>();wrapper.setSql("balance = balance - 200" ) .in("id", id); // 3. 执行更新(传入 null 表示不通过实体类设置字段)userMapper.update(null, wrapper);
}
条件构造器的用法:
QueryWrapper
和LambdaQueryWrapper
通常用来构建select
、delete
、update
的where
条件部分UpdateWrapper
和LambdaUpdateWrapper
通常只有在set
语句比较特殊才使用- 尽量使用
LambdaQueryWrapper
和LambdaUpdateWrapper
,避免硬编码
2、Lambda 表达式优化
通过 Lambda 表达式消除字段硬编码,提升代码可维护性。
改造查询示例
@Test
void testLambdaQueryWrapper() {// 1. 构建 Lambda 条件构造器LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();lambdaWrapper.select(User::getId, User::getUsername, User::getInfo, User::getBalance) // 指定查询的字段.like(User::getUsername, "o") // username LIKE '%o%'.ge(User::getBalance, 1000); // balance >= 1000// 2. 执行查询List<User> users = userMapper.selectList(lambdaWrapper);users.forEach(System.out::println);
}
二、自定义 SQL 整合
结合条件构造器与自定义 SQL 片段处理复杂业务场景。
可以利用MyBatisPlus
的Wrapper
来构建复杂的Where
条件,然后自己定义SQL语句中剩下的部分
场景说明
对指定 ID 的用户进行余额扣减操作,同时通过 Wrapper 动态构建条件。
Mapper 接口定义
public interface UserMapper extends BaseMapper<User> {// 使用 @Param(Constants.WRAPPER) 注解绑定 Wrappervoid updateBalanceByIds(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("amount") int amount);
}
XML 映射文件
<update id="updateBalanceByIds">UPDATE userSET balance = balance - #{amount}WHERE id IN<foreach collection="ids" separator="," item="id" open="(" close=")">#{id}</foreach>
</update>
业务层调用
@Test
void testCustomSqlUpdate() {// 1. 定义要更新的 ID 列表List<Long> ids = List.of(1L, 2L, 4L);// 2. 定义减少的金额int amount = 200;// 3. 构建条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids); // 条件:id IN (1, 2, 4)// 4. 自定义 SQL 方法调用userMapper.updateBalanceByIds(wrapper, amount);
}
三、Service 接口
1. 基础接口定义继承 IService
通过继承 IService<T>
接口获得 MyBatis-Plus 内置的通用 CRUD 方法
public interface IUserService extends IService<User> {/*** 根据用户名查询用户详细信息(自定义扩展方法)* @param username 用户名* @return 用户完整信息(包含关联实体)*/UserVO getUserDetailByUsername(String username);/*** 批量更新用户状态(自定义业务方法)* @param ids 用户ID集合* @param status 新状态值* @return 是否更新成功*/boolean updateUserStatus(List<Long> ids, Integer status);
}
2. 服务实现类规范
继承 ServiceImpl<M, T>
并实现自定义接口,通过组合方式实现功能
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> // 继承MP提供的基类implements IUserService { // 实现自定义接口@Autowiredprivate AccountService accountService; // 可注入其他服务// ================= 实现自定义方法 =================@Override@Transactional(rollbackFor = Exception.class)public UserVO getUserDetailByUsername(String username) {// 1. 查询基础信息LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUsername, username);User user = this.getOne(wrapper);// 2. 获取关联账户信息Account account = accountService.getByUserId(user.getId());// 3. 组装VOreturn UserVO.builder().user(user).account(account).build();}@Override@Transactional(rollbackFor = Exception.class)public boolean updateUserStatus(List<Long> ids, Integer status) {// 批量更新操作return this.update(new LambdaUpdateWrapper<User>().set(User::getStatus, status).in(User::getId, ids));}// ================= 可覆盖基类方法 =================@Overridepublic boolean save(User entity) {// 自定义保存逻辑(如密码加密)entity.setPassword(encrypt(entity.getPassword()));return super.save(entity);}
}
3. 结构优势说明
组件 | 功能说明 |
---|---|
IService<T> | 提供 20+ 通用 CRUD 方法(saveBatch、page、lambdaQuery 等) |
ServiceImpl<M,T> | 实现 IService 的默认方法,提供 baseMapper 快速访问 DAO 层 |
自定义接口 | 扩展业务相关方法,保持接口语义清晰 |
事务控制 | 通过 @Transactional 注解保证业务操作原子性 |
4. 方法调用示例
// 自动注入服务
@Autowired
private IUserService userService;// 使用通用方法
User user = userService.getById(1L);
Page<User> page = userService.page(new Page<>(1, 10), queryWrapper);// 调用自定义方法
UserVO userVO = userService.getUserDetailByUsername("mike");
boolean result = userService.updateUserStatus(Arrays.asList(1L,2L), 2);
MP的Service接口使用流程是怎样的?
1. 自定义 Service 接口继承 IService 接口
首先,你需要创建一个自定义的 Service
接口,并继承 MP 提供的通用 IService
接口。
public interface IUserService extends IService<User> {// 可以在这里定义额外的业务方法
}
IService<T>
是 MyBatis-Plus 提供的通用服务接口,包含了许多常用的 CRUD 方法。- 如果有额外的业务需求,可以在
IUserService
中定义自己的方法。
2. 实现自定义 Service 接口并继承Servicelmpl类
创建一个实现类来实现自定义的 Service
接口,并继承 MP 提供的 ServiceImpl
类。
@Service // 使用 Spring 的注解将该类注册为 Bean
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {// 实现自定义的业务方法
}
ServiceImpl<M, T>
是 MyBatis-Plus 提供的通用服务实现类:M
是 Mapper 接口的类型(例如UserMapper
)。T
是实体类的类型(例如User
)。
@Service
注解是 Spring 的注解,用于将该实现类注册为 Spring 容器中的 Bean,方便后续注入和使用。
3. Mapper 接口的定义
确保你已经定义了对应的 Mapper 接口,并继承 MP 提供的 BaseMapper
。
public interface UserMapper extends BaseMapper<User> {// 可以在这里定义额外的查询方法
}
BaseMapper<T>
是 MyBatis-Plus 提供的通用 Mapper 接口,包含了基本的 CRUD 方法。- 如果有额外的查询需求,可以在
UserMapper
中定义自己的方法。
4. 配置 Mapper 扫描
确保在 Spring Boot 的启动类或配置类上添加了 @MapperScan
注解,用于扫描 Mapper 接口。
@SpringBootApplication
@MapperScan("com.example.mapper") // 替换为你的 Mapper 接口所在的包路径
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
5. 在 Controller 组件中使用 Service
最后在需要使用的地方(如 Controller)通过依赖注入的方式使用自定义的 Service。
@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate IUserService userService;@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getById(id); // 调用 MP 提供的通用方法}@PostMappingpublic boolean addUser(@RequestBody User user) {return userService.save(user); // 调用 MP 提供的通用方法}
}
总结:完整流程
- 定义自定义
Service
接口,继承IService
。 - 创建自定义
Service
实现类,继承ServiceImpl
并实现自定义接口。 - 定义对应的
Mapper
接口,继承BaseMapper
。 - 配置
@MapperScan
注解,确保 Mapper 被正确扫描。 - 在需要的地方(如 Controller)注入并使用自定义
Service
。
通过这种方式可以充分利用 MyBatis-Plus 提供的通用方法,同时也可以根据业务需求扩展自己的功能。
基于Restful风格实现下面的接口:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data // 自动生成 getter/setter、toString 等方法
@ApiModel(description = "用户V0实体") // Swagger 注解,描述实体类
public class UserV0 {@ApiModelProperty("用户id") // Swagger 注解,描述字段private Long id;@ApiModelProperty("用户名")private String username;@ApiModelProperty("详细信息")private String info; // 原来的 "string" 应为 "String"@ApiModelProperty("使用状态(1正常 2冻结)")private Integer status;@ApiModelProperty("账户余额")private Integer balance;
}
四、QueryWrapper 查询方法与 UpdateWrapper 更新方法对照手册
QueryWrapper
核心方法
方法 | 描述 | SQL 示例 |
---|---|---|
eq | 等于 = | WHERE username = 'Tom' |
ne | 不等于 <> | WHERE age <> 18 |
gt | 大于 > | WHERE price > 100 |
between | 范围查询 | WHERE date BETWEEN ? AND ? |
like | 模糊匹配 | WHERE name LIKE '%T%' |
orderByAsc | 升序排序 | ORDER BY price ASC |
orderByDesc | 降序排序 | ORDER BY weight DESC |
其他常用方法
方法 | 描述 | 示例 |
---|---|---|
or | OR 条件拼接 | .eq("A",1).or().eq("B",2) |
in | IN 查询 | .in("status", 1, 2, 3) |
apply | 自定义 SQL 片段 | .apply("date_format(date,'%Y-%m') = '2023-01'") |
示例
@Test
public void testQueryWrapperExample() { // 构建查询条件QueryWrapper<User> qw = new QueryWrapper<User>(); qw.eq("username", "Tom") .like("email", "qq.com") .gt("age", 30); // 查询符合条件的用户列表List<User> userList = userMapper.selectList(qw); for (User user : userList) { logger.info("User: {}", user); } // 多条件更新(示例)User updateUser = new User();updateUser.setName("newName");updateUser.setEmail("newEmail");int updateResult = userMapper.update(updateUser, qw); logger.info("Update affected rows: {}", updateResult);// 多条件删除(示例)int deleteResult = userMapper.delete(qw); logger.info("Delete affected rows: {}", deleteResult);
}
代码功能说明
QueryWrapper<User>
:用于构建查询条件。eq("username", "Tom")
:表示查询username
等于"Tom"
的记录。like("email", "qq.com")
:表示查询email
字段中包含"qq.com"
的记录。gt("age", 30)
:表示查询age
大于30
的记录。userMapper.selectList(qw)
:执行查询并返回符合条件的用户列表。- 多条件更新和删除:注释掉的代码展示了如何根据条件进行更新或删除操作。
UpdateWrapper
核心方法
方法 | 描述 | SQL 示例 |
---|---|---|
set | 设置更新字段 | SET name = 'Tom' |
setSql | 直接写更新表达式 | SET price = price + 10 |
lambda | Lambda 条件构造 | .eq(User::getId, 1) |
示例
@Test
public void testUpdateWrapper() {
//创建一个UpdateWrapper对象,用于构建更新操作的查询条件。
UpdateWrapper uw = new UpdateWrapper();
//字段是"name",值是"Tom"。
uw.set("name", "Tom");//使用set方法设置另一个字段"age"的值为35。
uw.set("age", 35);//使用gt方法设置一个大于条件,即"salary"字段的值必须大于3000。
uw.gt("salary", 3000);//使用lt方法设置一个小于条件,即"salary"字段的值必须小于10000。
uw.lt("salary", 10000);//使用like方法设置一个模糊匹配条件,即"name"字段的值必须以"T"开头。
uw.like("name", "T%");int result = employeeMapper.update(null, uw);
System.out.println(result);
}
相关文章:
MyBatis-Plus 核心功能
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、条件构造器1、核心 Wrapper 类型基础查询示例SQL 查询使用 QueryWrapper 实现查询 更新操作示例场景一:基础更新SQL 查询使用 QueryWrapper 实现更新…...
阿里云实时计算Flink版产品体验测评
阿里云实时计算Flink版产品体验测评 什么是阿里云实时计算Flink应用场景实时计算Flink&自建Flink集群性价比开发效率运维管理企业安全 场景落地 什么是阿里云实时计算Flink 实时计算Flink大家可能并不陌生,在实时数据处理上,可能会有所接触…...
少儿编程 scratch四级真题 2025年3月电子学会图形化编程等级考试Scratch四级真题解析(判断题)
2025年3月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 11、小圆点角色的程序如下左图所示,程序运行后的效果如下右图所示,自制积木中又调用了自己,这种算法叫做递归。 答案&a…...
【连载3】基础智能体的进展与挑战综述
基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 2. 认知 人类认知是一种复杂的信息处理系统,它通过多个专门的神经回路协调运行…...
Schaefer 400图谱
图谱下载: https://github.com/ThomasYeoLab/CBIG/tree/master/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI 图 (第一行)显示了 Yeo et al. (2011) 的 7 网络和 17 网络分包。图…...
通过uri获取文件路径手机适配
青铜版本 return contentResolver.query(this, arrayOf(MediaStore.MediaColumns.DATA), null, null).let {if (it?.moveToFirst() true) {val columnIndex it.getColumnIndex(MediaStore.MediaColumns.DATA)val path it.getString(columnIndex)it.close()return path}&quo…...
Ubuntu 22.04 完美安装 ABAQUS 教程:从零到上手,解决兼容问题
教程概述与安装准备 本教程详细介绍了在 Ubuntu 22.04 系统上安装 ABAQUS 2023 及 ifort 2021 的步骤,并实现用户子程序的链接。教程同样适用于 ABAQUS 2021(需相应调整文件名和路径)以及 Ubuntu 18.04 至 22.04 系统,尽管未在所有版本上测试。需要注意的是,Intel 的 One…...
雷池WAF防火墙如何构筑DDoS防护矩阵?——解读智能语义解析对抗新型流量攻击
本文深度解析雷池WAF防火墙在DDoS攻防中的技术突破,通过智能语义解析、动态基线建模、协同防护体系三大核心技术,实现从流量特征识别到攻击意图预判的进化。结合2023年金融行业混合攻击防御案例,揭示新一代WAF如何通过协议级漏洞预判与AI行为…...
Linux权限理解
1.shell命令以及运行原理 下面来介绍一个话题,关于指令的运行原理,这里先简单理解就可以。当我们登上Linux后: yxx这里称之为用户名,VM-8-2-centos是主机名,~是当前目录,$是命令行提示符。 其中我们把上面的…...
使用labelme进行实例分割标注
前言 最近在学习实例分割算法,参考b站视频课教程,使用labelme标注数据集,在csdn找到相关教程进行数据集格式转换,按照相关目标检测网络对数据集格式的训练要求划分数据集。 1.使用labelme标注图片 在网上随便找了几张蘑菇图片&am…...
策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?
Autowire Resource 的区别 1.来源不同:其中 Autowire 是 Spring2.5 定义的注解,而 Resource 是 Java 定义的注解 2.依赖查找的顺序不同: 依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当…...
PromptUp 网站介绍:AI助力,轻松创作
1. 网站定位与核心功能 promptup.net 可能是一个面向 创作者、设计师、营销人员及艺术爱好者 的AI辅助创作平台,主打 零门槛、智能化的内容生成与优化。其核心功能可能包括: AI艺术创作:通过输入关键词、选择主题或拖放模板,快速生成风格多样的数字艺术作品(如插画、海报…...
软件架构评估利器:质量效用树全解析
质量效用树是软件架构评估中的一种重要工具,它有助于系统地分析和评估软件架构在满足各种质量属性方面的表现。以下是关于质量效用树的详细介绍: 一、定义与作用 质量效用树是一种以树形结构来表示软件质量属性及其相关效用的模型。它将软件的质量目标…...
XILINX DDR3专题---(1)IP核时钟框架介绍
1.什么是Reference Clock,这个时钟一定是200MHz吗? 2.为什么APP_DATA是128bit,怎么算出来的? 3.APP :MEM的比值一定是1:4吗? 4.NO BUFFER是什么意思? 5.什么情况下Reference Clock的时钟源可…...
ubuntu 2204 安装 vcs 2018
安装评估 系统 : Ubuntu 22.04.1 LTS 磁盘 : ubuntu 自身占用了 9.9G , 按照如下步骤 安装后 , 安装后的软件 占用 13.1G 仓库 : 由于安装 libpng12-0 , 添加了一个仓库 安装包 : 安装了多个包(lsb及其依赖包 libpng12-0)安装步骤 参考 ubuntu2018 安装 vcs2018 安装该…...
Python与去中心化存储:从理论到实战的全景指南【无标题】
Python与去中心化存储:从理论到实战的全景指南 随着区块链技术和Web3理念的兴起,去中心化存储逐渐成为构建新型互联网的核心模块之一。传统中心化存储的模式存在易被攻击、单点故障和高昂成本等问题,而去中心化存储通过分布式架构实现了更高的安全性、可靠性和数据透明度。…...
C++语言程序设计——01 C++程序基本结构
目录 编程语言一、C程序执行过程二、C基础框架三、输出语句cout换行 四、注释方法 编程语言 我们知道c是一门编程语言,它是在c语言的基础上发展而来,添加了类、对象、继承、多态等概念,我们可以称为它是一种面向对象编程的语言。 不过在学习…...
Unity UI中的Pixels Per Unit
Pixels Per Unit在图片导入到Unity的时候,将图片格式设置为Sprite的情况下会出现,其意思是精灵中的多少像素对应世界中的一个单位,默认是100 1. 对于在世界坐标中 在世界坐标中,一般对于Sprite的应用是Sprite Renderer组件 使…...
(十八)安卓开发中的后端接口调用详讲解
在安卓开发中,后端接口调用是连接移动应用与服务器的重要环节,用于实现数据的获取、提交和处理。本文将详细讲解安卓开发中后端接口调用的步骤,结合代码示例和具体的使用场景,帮助你全面理解这一过程。 什么是后端接口?…...
使用freebsd-update 升级FreeBSD从FreeBSD 14.1-RELEASE-p5到FreeBSD 14.2-RELEASE
使用freebsd-update 升级FreeBSD从FreeBSD 14.1-RELEASE-p5到FreeBSD 14.2-RELEASE 先升级小版本 准备升级前,先把当前的小版本升级到顶,比如现在是FreeBSD 14.1-RELEASE-p5,先升级到最新的14.1版本,使用命令: # fr…...
基础排序算法(三傻排序)
1. 选择排序 原理:每次从未排序部分选出最小(或最大)元素,放到已排序部分的末尾。时间复杂度:O(n),效率低但实现简单,适合小规模数据。 //选择排序public static void selectSort(int[] arr){i…...
五分钟了解智能体
在2025年人工智能技术全面渗透社会的背景下,“智能体”(Agent)已成为推动第四次工业革命的核心概念之一。从自动驾驶汽车到医疗诊断系统,从智能家居中枢到金融量化交易平台,智能体正在重构人类与技术交互的方式。本文将…...
【机器学习】笔记| 通俗易懂讲解:生成模型和判别模型|01
博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾:【科研小白系列】这些基础linux命令,你都掌握了嘛?每日一言🌼: “脑袋想不明白的,就用脚想”—…...
Jieba分词的原理及应用(三)
前言 “结巴”中文分词:做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景,在喂给模型之前需要进行分词操作。 分词的手段有很多,其中最常用的手段还是Jieba库进行…...
神经网络背后的数学原理
神经网络背后的数学原理 数学建模神经网络数学原理 数学建模 标题民科味道满满。其实这篇小短文就是自我娱乐。 物理世界是物种多样,千姿百态。可以从不同的看待眼中的世界,包括音乐、绘画、舞蹈、雕塑等各种艺术形式。但这些主观的呈现虽然在各人眼中…...
常用图像滤波及色彩调节操作(Opencv)
1. 常用滤波/模糊操作 import cv2 import numpy as np import matplotlib.pyplot as plotimg cv2.imread("tmp.jpg") img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_g cv2.GaussianBlur(img, (7,7), 0) img_mb cv2.medianBlur(img, ksize7) #中指滤波 img_bm …...
FFMPEG和opencv的编译
首先 sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-de…...
用户登录不上linux服务器
一般出现这种问题,重新用root用户修改lsy用户的密码即可登录,但是当修改了还是登录不了的时候,去修改一个文件用root才能修改, 然后在最后添加上改用户的名字,例如 原本是只有user的,现在我加上了lsy了&a…...
【项目管理】第11章 项目成本管理-- 知识点整理
相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 (二)知识笔记 第11章 项目成本管理 1.管理基础…...
Python中的strip()
文章目录 基本语法:示例:1. 默认移除空白字符:2. 移除指定字符:3. 不修改原字符串: 相关方法:示例: 注意事项: 在 Python 中, strip() 是一个字符串方法,用于…...
设计模式 Day 9:命令模式(Command Pattern)完整讲解与实战应用
🔄 回顾 Day 8:策略模式 在 Day 8 中我们讲解了策略模式: 用于封装多个可切换的算法逻辑,让调用者在运行时选择合适的策略。它强调的是“行为选择”,是针对“算法或行为差异”而设计。通过 PaymentStrategy、路径规划…...
【正点原子】STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战
在嵌入式系统中,ADC模拟电压的读取是常见的需求。如何高效、并发、且可控地完成数据采集与处理?本篇文章通过双线程分别绑定在 Linux 系统的不同 CPU 核心上,采集 /sys/bus/iio 接口的 ADC 原始值与缩放系数 scale,并在另一个核上…...
区块链从专家到小白
文章目录 含义应用场景典型特征 含义 以非对称加密算法为基础。 每个**区块(Block)**包含: 交易数据(如转账记录、合约内容)。 时间戳(记录生成时间)。 哈希值(当前区…...
记录centos8安装宝塔过程(两个脚本)
1、切换系统源(方便使用宝塔安装脚本下载) bash <(curl -sSL https://linuxmirrors.cn/main.sh) 2、宝塔安装脚本在宝塔的官网 宝塔面板下载,免费全能的服务器运维软件 根据自己的系统选择相应的脚本 urlhttps://download.bt.cn/insta…...
DAY 42 leetcode 151--哈希表.反转字符串中的单词
题号151 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 我的解法 暴力解法,先将String转为字…...
[VTK] 四元素实现旋转平移
VTK 实现旋转,有四元数的方案,也有 vtkTransform 的方案;主要示例代码如下: //构造旋转四元数vtkQuaterniond rotation;rotation.SetRotationAngleAndAxis(vtkMath::RadiansFromDegrees(90.0),0.0, 1.0, 0.0);//构造旋转点四元数v…...
AI大模型:(二)2.2 分词器Tokenizer
目录 1.分词技术的发展 2.分词器原理 2.1.基于词分词 2.2.基于字符分词 2.3.基于子词分词 3.手搓Byte-Pair Encoding (BPE)分词及训练 3.1.Byte-Pair Encoding (BPE)分词原理 3.2.手搓Byte-Pair Encoding (BPE)分词器 4.如何选择已有的分词器 1. 常见子词分词器及特点…...
codeforces A. Simple Palindrome
目录 题面 代码 题面 A. 简单回文串 每个测试用例时间限制:1 秒 每个测试用例内存限制:256 兆字节 纳雷克要在幼儿园陪一些两岁的孩子度过两个小时。他想教孩子们竞技编程,他们的第一堂课是关于回文串的。 纳雷克发现孩子们只认识英文字母…...
Linux 进程基础(一):冯诺依曼结构
文章目录 一、冯诺依曼体系结构是什么?🧠二、冯诺依曼体系为何成为计算机组成的最终选择?(一)三大核心优势奠定主流地位(二)对比其他架构的不可替代性 三、存储分级:速度与容量的平衡…...
向量存储(VectorStore)详解
一、向量存储的核心概念 向量存储(VectorStore)是一种用于存储和检索高维向量数据的数据库或存储解决方案,特别适用于处理经过嵌入模型转化后的数据。与传统关系数据库不同,VectorStore 执行的是相似性搜索,而非精确匹…...
HCIP(网络类型)
网络类型概述 网络类型主要基于数据链路层使用的协议不同,导致数据包封装方式不同,工作方式也有所区别。根据这些特点,网络可以被分类为以下几种类型: MA网络(多点接入网络):允许同时接入多台…...
MTCNN 人脸识别
前言 此处介绍强大的 MTCNN 模块,给出demo,展示MTCNN 的 OOP, 以及ROS利用 C 节点,命令行调用脚本执行实际工作的思路。 MTCNN Script import argparse import cv2 from mtcnn import MTCNN import osclass MTCNNProcessor:def…...
一文解析DeepSeek R1模型
1. DeepSeek R1-Zero 在训练DeepSeek R1之前,深度求索团队尝试做了一个DeepSeek R1-Zero的模型,只进行强化学习而不需要监督微调,以此来强化模型自我推理的能力。 通过下图回顾下ChatGPT的做法:首先SFT,然后训练奖励…...
SpringMVC基础三(json)
乱码处理 编写一个表单: 编写EncodingController控制类 测试: 此乱码是在从前端传送到test方法时就已经乱了。 采用过滤器解决乱码 在web.xml中配置SpringMVC的乱码过滤器 <filter><filter-name>encoding</filter-name><filter…...
spring boot大文件与多文件下载
一、简单大文件下载: /*** 下载大文件* param path 路径* param fileName 文件名* return* throws IOException*/ public static ResponseEntity<InputStreamResource> downloadFile(String path, String fileName) throws IOException {Path filePath Path…...
事务隔离级别和MVCC
事务隔离级别 mysql是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有多个客户端与之连接。每个客户端与服务器连接后就形成了一个会话。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分…...
Ubuntu 系统深度清理:彻底卸载 Redis 服务及残留配置
Ubuntu 系统深度清理:彻底卸载 Redis 服务及残留配置 在Ubuntu系统中,Redis是一种广泛使用的内存数据存储系统,用于缓存和消息传递等场景。然而,有时候我们需要彻底卸载Redis,以清理系统资源或为其他应用腾出空间。本…...
关于群晖安装tailscale后无法直链的问题
问题是我局域网的ipv6无法正确获取到ip, 通过命令可以看到ipv6没有ip tailscale netcheck C:\Users\Administrator>tailscale netcheck 2025/04/12 23:43:34 attempting to fetch a DERPMap from https://controlplane.tailscale.comReport:* Time: 2025-04-12T15:43:38.27…...
第十二章:FreeRTOS多任务创建与删除
FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法,主要涉及两个核心函数: 任务创建:xTaskCreate()任务删除:vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…...
JavaScript数组方法:`some()`的全面解析与应用
文章目录 JavaScript数组方法:some()的全面解析与应用一、some()方法的基本概念语法参数说明返回值 二、some()方法的核心特点三、基础用法示例示例1:检查数组中是否有大于10的元素示例2:检查字符串数组中是否包含特定子串 四、实际应用场景1…...