当前位置: 首页 > 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…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...