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

Mybatis-Plus使用Wrapper自定义SQL

文章目录

  • 准备工作
  • Mybatis-Plus使用Wrapper自定义SQL
    • 注意事项
    • 目录结构如下所示
    • domain层
    • Controller层
    • Service层
    • ServiceImpl
    • Mapper层
    • UserMapper.xml
  • 结果如下所示:
    • 单表查询条件构造器
    • 单表查询,Mybatis-Plus使用Wrapper自定义SQL
    • 联表查询不用,Mybatis-Plus的条件构造器时
    • 联表查询,Mybatis-Plus使用Wrapper自定义SQL
    • 总结

简要说明:Mybatis-Plus使用Wrapper自定义SQL,主要的代码说明,详情可以往后看。
假设有三张表(这三张表在: SpringBoot整合mybatis-plus-CSDN博客,有 )的关系如图所示
在这里插入图片描述
对应的UserMapper.java的主要代码如下

public interface UserMapper extends BaseMapper<User> {// 下面的currentPage, pageSize,userId, roleName都是Controller层传入,或者自己看着填写,这里只是说明一下UserMapper.java的参数来源// LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();// 动态SQL,这是真的方便// lqw.like(StringUtils.isNotEmpty(name), User::getName, name);//lqw.eq(age != null && age != 0, User::getAge, age);/*** 假设联表查询,语句是这样的。* # 如根据用户姓名、年龄查询用户具有的角色列表。* select sr.role_name* from sys_user su*          left join sys_user_role sur on su.id = sur.user_id*          left join sys_role sr on sur.role_id = sr.id* where su.name like '%张%' and su.age = 98;QueryWrapper qw = new QueryWrapper<>();// 动态SQLqw.like(StringUtils.isNotEmpty(name), "su.name", name);qw.eq(age != null && age != 0, "su.age", age);*//*** 单表查询,Mybatis-Plus使用Wrapper自定义SQL* 这个是为了下面联表查询铺垫,这个主要是了解,* Mybatis-Plus使用Wrapper自定义SQL如何使用*/@Select("select * from sys_user ${ew.customSqlSegment}")// 这里需要注意了@Param("ew")这里面只能是ewList<User> getAllWrapperSql(@Param("ew") LambdaQueryWrapper<User> wrapper);// 使用下面这个方法也行,使用Mp内置的枚举类,Constants.WRAPPER 这个就是 ew// List<User> getAllWrapperSql(@Param(Constants.WRAPPER) LambdaQueryWrapper wrapper);/*** 联表查询,Mybatis-Plus使用Wrapper自定义SQL,在xml中使用* 根据用户姓名、年龄获取对应用户具有的角色列表*/// 注意这里,只能是ewList<RoleVo> getRoleListByUserNameMulTable(@Param(Constants.WRAPPER) QueryWrapper qw);// 像下面这样写也可以// List<RoleVo> getRoleListByUserNameMulTable(@Param("ew") LambdaQueryWrapper lqw);
}

对应的UserMapper.xml如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ygy.mapper.UserMapper"><!--联表查询,Mybatis-Plus使用Wrapper自定义SQL,在xml中使用根据用户姓名、年龄获取对应用户具有的角色列表--><select id="getRoleListByUserNameMulTable" resultType="com.ygy.domain.vo.RoleVo">select sr.role_namefrom sys_user suleft join sys_user_role sur on su.id = sur.user_idleft join sys_role sr on sur.role_id = sr.id ${ew.customSqlSegment}</select>
</mapper>

大概结果如下所示:
联表查询,Mybatis-Plus使用Wrapper自定义SQL,结果如下所示:
在这里插入图片描述

IDEA控制台中打印的SQL语句为

在这里插入图片描述

下面有详细的说明,感兴趣的可以往下看。下面有详细的说明,感兴趣的可以往下看。下面有详细的说明,感兴趣的可以往下看。

准备工作

SpringBoot2.7.10 + JDK17 + MySQL8…30社区版 + Mybatis-Plus3.5.3,SpringBoot整合Mybatis-Plus看这篇文章:SpringBoot整合mybatis-plus-CSDN博客 这里有说明SpringBoot + Mybatis-Plus的整合和下文需要用到的数据库表数据,这里需要用到这篇文章中的三张表,实现联表查询,以及对应的Maven依赖,都有说明。直接从这篇文章中导入即可。

Mybatis-Plus使用Wrapper自定义SQL

注意事项

具体看官网,条件构造器 | MyBatis-Plus (baomidou.com)

需要mybatis-plus版本 >= 3.0.7 param 参数名要么叫ew,要么加上注解@Param(Constants.WRAPPER) 使用${ew.customSqlSegment} 不支持 Wrapper 内的entity生成where语句

对于单表查询操作,Mybatis-Plus的Wrapper条件构造器,很方便。特别是LambdaQueryWrapper,我用着感觉很好用,这个动态SQL条件构造还是很好用的。但是在联表查询的时候,如果还想用LambdaQueryWrapper这条件构造器,就需要使用Mybatis-Plus使用Wrapper自定义SQL了。

目录结构如下所示

在这里插入图片描述

可以直接复制下面的代码,或者参考SpringBoot整合mybatis-plus-CSDN博客,中代码生成器生成对应的文件,然后在对应的文件中写代码方法。

domain层

User.java

package com.ygy.domain;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;/*** <p>* 用户表* </p>** @author ygy* @since 2023-11-05*/
@Getter
@Setter
@TableName("sys_user")
@ApiModel(value = "User对象", description = "用户表")
public class User implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("用户ID")@TableId(value = "id", type = IdType.AUTO)private Long id;@ApiModelProperty("姓名")private String name;@ApiModelProperty("年龄")private Integer age;@ApiModelProperty("性别(0,女,1,男)")private Integer sex;
}

RoleVo.java

package com.ygy.domain.vo;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel(value = "RoleVo对象", description = "角色表")
public class RoleVo {@ApiModelProperty("角色名称")private String RoleName;
}

Controller层

UserController.java

package com.ygy.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ygy.domain.User;
import com.ygy.domain.vo.PageVo;
import com.ygy.domain.vo.RoleVo;
import com.ygy.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** <p>* 用户表 前端控制器* </p>*其中 @ApiParam("当前页码数")、@ApiParam("每页显示条数")、@ApiOperation("分页获取用户列表")是swagger的注解* @author ygy* @since 2023-11-05*/
@Api(tags = "用户管理模块") // 这个是swagger的注解
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate IUserService userService;@GetMapping@ApiOperation("单表查询条件构造器")public List<User> getAll(@ApiParam("姓名") String name, @ApiParam("年龄") Integer age) {// 从这里可以看出,单表查询结合LambdaQueryWrapper这条件构造器还是挺好用的// 什么都不用写,直接调用MP内置的方法,简单方便LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();// 动态SQL,这是真的方便lqw.like(StringUtils.isNotEmpty(name), User::getName, name);lqw.eq(age != null && age != 0, User::getAge, age);List<User> userList = userService.list(lqw);return userList;}/*** 单表查询,Mybatis-Plus使用Wrapper自定义SQL* 这个是为了下面联表查询铺垫,这个主要是了解,* Mybatis-Plus使用Wrapper自定义SQL如何使用*/@GetMapping("/getAllWrapperSql")@ApiOperation("单表查询,Mybatis-Plus使用Wrapper自定义SQL")public List<User> getAllWrapperSql(@ApiParam("姓名") String name, @ApiParam("年龄") Integer age) {LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();lqw.like(StringUtils.isNotEmpty(name), User::getName, name);lqw.eq(age != null && age != 0, User::getAge, age);List<User> userList = userService.getAllWrapperSql(lqw);return userList;}/*** 联表查询不用,Mybatis-Plus的条件构造器时* 根据用户姓名、年龄获取对应用户具有的角色列表*/@GetMapping("/getRoleListByUserName")@ApiOperation("联表查询,不用Mybatis-Plus的条件构造器时")public List<RoleVo> getRoleListByUserName(@ApiParam("姓名") String name, @ApiParam("年龄") Integer age) {List<RoleVo> roleVoList = userService.getRoleListByUserName(name, age);return roleVoList;}/*** 联表查询,Mybatis-Plus使用Wrapper自定义SQL* 根据用户姓名、年龄获取对应用户具有的角色列表*/@GetMapping("/getRoleListByUserNameMulTable")@ApiOperation("联表查询,Mybatis-Plus使用Wrapper自定义SQL")public List<RoleVo> getRoleListByUserNameMulTable(@ApiParam("姓名") String name, @ApiParam("年龄") Integer age) {/*** 假设联表查询,语句是这样的。* # 如根据用户姓名、年龄查询用户具有的角色列表。* select sr.role_name* from sys_user su*          left join sys_user_role sur on su.id = sur.user_id*          left join sys_role sr on sur.role_id = sr.id* where su.name like '%张%' and su.age = 98;*/QueryWrapper qw = new QueryWrapper<>();// 动态SQLqw.like(StringUtils.isNotEmpty(name), "su.name", name);qw.eq(age != null && age != 0, "su.age", age);List<RoleVo> roleVoList = userService.getRoleListByUserNameMulTable(qw);return roleVoList;}
}

Service层

IUserService.java

package com.ygy.service;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ygy.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ygy.domain.vo.RoleVo;import java.util.List;/*** <p>* 用户表 服务类* </p>** @author ygy* @since 2023-11-05*/
public interface IUserService extends IService<User> {/*** 单表查询,Mybatis-Plus使用Wrapper自定义SQL* 这个是为了下面联表查询铺垫,这个主要是了解,* Mybatis-Plus使用Wrapper自定义SQL如何使用*/List<User> getAllWrapperSql(LambdaQueryWrapper<User> lqw);/*** 联表查询不用,Mybatis-Plus的条件构造器时* 根据用户姓名、年龄获取对应用户具有的角色列表*/List<RoleVo> getRoleListByUserName(String name, Integer age);/*** 联表查询,Mybatis-Plus使用Wrapper自定义SQL* 根据用户姓名、年龄获取对应用户具有的角色列表*/List<RoleVo> getRoleListByUserNameMulTable(QueryWrapper qw);
}

ServiceImpl

UserServiceImpl.java

package com.ygy.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ygy.domain.User;
import com.ygy.domain.vo.RoleVo;
import com.ygy.mapper.UserMapper;
import com.ygy.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** <p>* 用户表 服务实现类* </p>** @author ygy* @since 2023-11-05*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Autowiredprivate UserMapper userMapper;/*** 单表查询,Mybatis-Plus使用Wrapper自定义SQL* 这个是为了下面联表查询铺垫,这个主要是了解,* Mybatis-Plus使用Wrapper自定义SQL如何使用*/@Overridepublic List<User> getAllWrapperSql(LambdaQueryWrapper<User> lqw) {List<User> userList = userMapper.getAllWrapperSql(lqw);return userList;}/*** 联表查询不用,Mybatis-Plus的条件构造器时* 根据用户姓名、年龄获取对应用户具有的角色列表*/@Overridepublic List<RoleVo> getRoleListByUserName(String name, Integer age) {List<RoleVo> roleVoList = userMapper.getRoleListByUserName(name, age);return roleVoList;}/*** 联表查询,Mybatis-Plus使用Wrapper自定义SQL* 根据用户姓名、年龄获取对应用户具有的角色列表*/@Overridepublic List<RoleVo> getRoleListByUserNameMulTable(QueryWrapper qw) {List<RoleVo> roleVoList = userMapper.getRoleListByUserNameMulTable(qw);return roleVoList;}
}

Mapper层

UserMapper.java

package com.ygy.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.ygy.domain.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ygy.domain.vo.RoleVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** <p>* 用户表 Mapper 接口* </p>** @author ygy* @since 2023-11-05*/
public interface UserMapper extends BaseMapper<User> {/*** 单表查询,Mybatis-Plus使用Wrapper自定义SQL* 这个是为了下面联表查询铺垫,这个主要是了解,* Mybatis-Plus使用Wrapper自定义SQL如何使用*/@Select("select * from sys_user ${ew.customSqlSegment}")// 这里需要注意了@Param("ew")这里面只能是ewList<User> getAllWrapperSql(@Param("ew") LambdaQueryWrapper<User> wrapper);// 使用下面这个方法也行,使用Mp内置的枚举类,Constants.WRAPPER 这个就是 ew// List<User> getAllWrapperSql(@Param(Constants.WRAPPER) LambdaQueryWrapper wrapper);/*** 联表查询不用,Mybatis-Plus的条件构造器时,在xml中使用* 根据用户姓名、年龄获取对应用户具有的角色列表*/List<RoleVo> getRoleListByUserName(String name, Integer age);/*** 联表查询,Mybatis-Plus使用Wrapper自定义SQL,在xml中使用* 根据用户姓名、年龄获取对应用户具有的角色列表*/// 注意这里,只能是ewList<RoleVo> getRoleListByUserNameMulTable(@Param(Constants.WRAPPER) QueryWrapper qw);// 像下面这样写也可以// List<RoleVo> getRoleListByUserNameMulTable(@Param("ew") LambdaQueryWrapper lqw);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ygy.mapper.UserMapper"><!--联表查询不用,Mybatis-Plus的条件构造器时根据用户姓名、年龄获取对应用户具有的角色列表--><select id="getRoleListByUserName" resultType="com.ygy.domain.vo.RoleVo">select sr.role_namefrom sys_user suleft join sys_user_role sur on su.id = sur.user_idleft join sys_role sr on sur.role_id = sr.id<where><if test="name != null and name != ''">AND su.name like concat('%', #{name}, '%')</if><if test="age != null and age != ''">AND su.age = #{age}</if></where></select><!--联表查询,Mybatis-Plus使用Wrapper自定义SQL,在xml中使用根据用户姓名、年龄获取对应用户具有的角色列表--><select id="getRoleListByUserNameMulTable" resultType="com.ygy.domain.vo.RoleVo">select sr.role_namefrom sys_user suleft join sys_user_role sur on su.id = sur.user_idleft join sys_role sr on sur.role_id = sr.id ${ew.customSqlSegment}</select></mapper>

结果如下所示:

单表查询条件构造器

单表查询条件构造器,结果如下所示:

在这里插入图片描述

IDEA控制台中打印的SQL语句为

在这里插入图片描述

单表查询,Mybatis-Plus使用Wrapper自定义SQL

单表查询,Mybatis-Plus使用Wrapper自定义SQL的结果如下所示

在这里插入图片描述

IDEA控制台中打印的SQL语句为

在这里插入图片描述

联表查询不用,Mybatis-Plus的条件构造器时

联表查询不用,Mybatis-Plus的条件构造器时结果如下所示

在这里插入图片描述

IDEA控制台中打印的SQL语句为

在这里插入图片描述

联表查询,Mybatis-Plus使用Wrapper自定义SQL

联表查询,Mybatis-Plus使用Wrapper自定义SQL,结果如下所示:
在这里插入图片描述

IDEA控制台中打印的SQL语句为

在这里插入图片描述

总结

这么一看,还不如像(联表查询不用,Mybatis-Plus的条件构造器)时这里的方法呢,可读性也不是很好。不过也有它的用处,它的动态SQL强啊,类似与select * from sys_user where id in(1,2,3); 语句,当然不是单表(联表使用或者复杂的SQL查询语句,这个或许会方便一些),如果使用Mybatis的写法,在xml需要使用foreach标签等,但是使用这个Mp的自定义SQL,可以直接传入选择in方法,然后根据对应的要求传入参数即可。

相关文章:

Mybatis-Plus使用Wrapper自定义SQL

文章目录 准备工作Mybatis-Plus使用Wrapper自定义SQL注意事项目录结构如下所示domain层Controller层Service层ServiceImplMapper层UserMapper.xml 结果如下所示&#xff1a;单表查询条件构造器单表查询&#xff0c;Mybatis-Plus使用Wrapper自定义SQL联表查询不用&#xff0c;My…...

仿mudou库one thread one loop式并发服务器

目录 1.实现目标 2.HTTP服务器 实现高性能服务器-Reactor模型 模块划分 SERVER模块&#xff1a; HTTP协议模块&#xff1a; 3.项目中的子功能 秒级定时任务实现 时间轮实现 正则库的简单使用 通⽤类型any类型的实现 4.SERVER服务器实现 日志宏的封装 缓冲区Buffer…...

二十三种设计模式全面解析-组合模式与装饰器模式的结合:实现动态功能扩展

在前文中&#xff0c;我们介绍了组合模式的基本原理和应用&#xff0c;以及它在构建对象结构中的价值和潜力。然而&#xff0c;组合模式的魅力远不止于此。在本文中&#xff0c;我们将继续探索组合模式的进阶应用&#xff0c;并展示它与其他设计模式的结合使用&#xff0c;以构…...

智慧城市建设解决方案分享【完整】

文章目录 第1章 前言第2章 智慧城市建设的背景2.1 智慧城市的发展现状2.2 智慧城市的发展趋势 第3章 智慧城市“十二五”规划要点3.1 国民经济和社会发展“十二五”规划要点3.2 “十二五”信息化发展规划要点 第4章 大数据&#xff1a;智慧城市的智慧引擎4.1 大数据技术—智慧城…...

unity - Blend Shape - 变形器 - 实践

文章目录 目的Blend Shape 逐顶点 多个混合思路Blender3Ds maxUnity 中使用Project 目的 拾遗&#xff0c;备份 Blend Shape 逐顶点 多个混合思路 blend shape 基于&#xff1a; vertex number, vertex sn 相同&#xff0c;才能正常混合、播放 也就是 vertex buffer 的顶点数…...

asp.net core mvc之路由

一、默认路由 &#xff08;Startup.cs文件&#xff09; routes.MapRoute(name: "default",template: "{controllerHome}/{actionIndex}/{id?}" ); 默认访问可以匹配到 https://localhost:44302/home/index/1 https://localhost:44302/home/index https:…...

前端设计模式之【访问者模式】

文章目录 前言介绍实现优缺点应用场景后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端设计模式 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#…...

通过docker-compose部署elk日志系统,并使用springboot整合

ELK是一种强大的分布式日志管理解决方案&#xff0c;它由三个核心组件组成&#xff1a; Elasticsearch&#xff1a;作为分布式搜索和分析引擎&#xff0c;Elasticsearch能够快速地存储、搜索和分析大量的日志数据&#xff0c;帮助用户轻松地找到所需的信息。 Logstash&#xf…...

【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]

什么是机器学习中的特征提取&#xff1f; 特征提取是数据分析和机器学习中的基本概念&#xff0c;是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征&#xff0c;也称为变量或属性&#xff0c;是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…...

数据结构-单链表

1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 从以上图片可以看出&#xff1a; 1.链式结构在逻辑上是连续的&#xff0c;但在物理上不一定是连续的。 2.现实中的节…...

红队系列-IOT安全深入浅出

红队专题 设备安全概述物联网设备层次模型设备通信模型 渗透测试信息收集工具 实战分析漏洞切入点D-link 850L 未授权访问 2017 认证绕过认证绕过 D-link DCS-2530Ltenda 系列 路由器 前台未授权RTSP 服务未授权 访问 弱口令命令注入思科 路由器 固件二进制 漏洞 IoT漏洞-D-Lin…...

亚数受邀参加“长三角G60科创走廊量子密码应用创新联盟(中心)”启动仪式

11月8日&#xff0c;在第六届中国国际进口博览会2023长三角G60科创走廊高质量发展要素对接大会上&#xff0c;亚数信息科技&#xff08;上海&#xff09;有限公司CEO翟新元作为密码企业代表之一受邀参加“长三角G60科创走廊量子密码应用创新联盟&#xff08;中心&#xff09;”…...

直方图学习

直方图均衡化&#xff08;Histogram Equalization&#xff09;是一种用于增强图像对比度的图像处理技术&#xff0c;通过重新分配图像的像素值&#xff0c;使图像中的亮度级别更加均匀&#xff0c;以改善图像的视觉质量。下面是进行直方图均衡化的一般步骤&#xff1a; 计算原始…...

Java / Android 多线程和 synchroized 锁

s AsyncTask 在Android R中标注了废弃 synchronized 同步 Thread: thread.start() public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionali…...

基于51单片机的万年历-脉搏计仿真及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302采集年月日时分秒送到液晶1602显示。 3、按键年月日时分秒&#xff0c;心率报警上下限。 4、红外对接管传感器采集心率送到液晶1602显示。 5、心率低于下限或高于上限&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如…...

【ARFoundation学习笔记】点云与参考点

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏&#xff0c;更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 点云新建点云 参考点参考点的工作原理何时使用参考点使用参考点…...

uni-app:js实现数组中的相关处理-数组复制

一、slice方法-浅拷贝 使用分析 创建一个原数组的浅拷贝&#xff0c;对新数组的修改不会影响到原数组slice() 方法创建了一个原数组的浅拷贝&#xff0c;这意味着新数组和原数组中的对象引用是相同的。因此&#xff0c;当你修改新数组中的对象时&#xff0c;原数组中相应位置的…...

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用 1. 图片有格式2 文字无格式二、RTC库函数固件库函数预览2.1 函数RTC_ITConfig2.2 函数RTC_EnterConfigMode2.3 函数RTC_ExitConfigMode2.4 函数RTC_GetCounter.2.5 函数RTC_SetCounter2.6 函数RTC_SetPrescaler2.7 函…...

ARMday04(开发版简介、LED点灯)

开发版简介 开发板为stm32MP157AAA,附加一个拓展版 硬件相关基础知识 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c;是重要的电子部件&#xff0c;是电子元器件的支撑体&#xff0c;是电子…...

国际腾讯云:云服务器疑似被病毒入侵问题解决方案!!!

云服务器可能由于弱密码、开源组件漏洞的问题被黑客入侵&#xff0c;本文介绍如何判断云服务器是否被病毒入侵&#xff0c;及其解决方法。 问题定位 使用 SSH 方式 或 使用 VNC 方式 登录实例后&#xff0c;通过以下方式进行判断云服务器是否被病毒入侵&#xff1a; rc.loca…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...