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 结果如下所示:单表查询条件构造器单表查询,Mybatis-Plus使用Wrapper自定义SQL联表查询不用,My…...
仿mudou库one thread one loop式并发服务器
目录 1.实现目标 2.HTTP服务器 实现高性能服务器-Reactor模型 模块划分 SERVER模块: HTTP协议模块: 3.项目中的子功能 秒级定时任务实现 时间轮实现 正则库的简单使用 通⽤类型any类型的实现 4.SERVER服务器实现 日志宏的封装 缓冲区Buffer…...
二十三种设计模式全面解析-组合模式与装饰器模式的结合:实现动态功能扩展
在前文中,我们介绍了组合模式的基本原理和应用,以及它在构建对象结构中的价值和潜力。然而,组合模式的魅力远不止于此。在本文中,我们将继续探索组合模式的进阶应用,并展示它与其他设计模式的结合使用,以构…...
智慧城市建设解决方案分享【完整】
文章目录 第1章 前言第2章 智慧城市建设的背景2.1 智慧城市的发展现状2.2 智慧城市的发展趋势 第3章 智慧城市“十二五”规划要点3.1 国民经济和社会发展“十二五”规划要点3.2 “十二五”信息化发展规划要点 第4章 大数据:智慧城市的智慧引擎4.1 大数据技术—智慧城…...
unity - Blend Shape - 变形器 - 实践
文章目录 目的Blend Shape 逐顶点 多个混合思路Blender3Ds maxUnity 中使用Project 目的 拾遗,备份 Blend Shape 逐顶点 多个混合思路 blend shape 基于: vertex number, vertex sn 相同,才能正常混合、播放 也就是 vertex buffer 的顶点数…...
asp.net core mvc之路由
一、默认路由 (Startup.cs文件) routes.MapRoute(name: "default",template: "{controllerHome}/{actionIndex}/{id?}" ); 默认访问可以匹配到 https://localhost:44302/home/index/1 https://localhost:44302/home/index https:…...
前端设计模式之【访问者模式】
文章目录 前言介绍实现优缺点应用场景后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端设计模式 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&#…...
通过docker-compose部署elk日志系统,并使用springboot整合
ELK是一种强大的分布式日志管理解决方案,它由三个核心组件组成: Elasticsearch:作为分布式搜索和分析引擎,Elasticsearch能够快速地存储、搜索和分析大量的日志数据,帮助用户轻松地找到所需的信息。 Logstash…...
【NLP】特征提取: 广泛指南和 3 个操作教程 [Python、CNN、BERT]
什么是机器学习中的特征提取? 特征提取是数据分析和机器学习中的基本概念,是将原始数据转换为更适合分析或建模的格式过程中的关键步骤。特征,也称为变量或属性,是我们用来进行预测、对对象进行分类或从数据中获取见解的数据点的…...
数据结构-单链表
1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 从以上图片可以看出: 1.链式结构在逻辑上是连续的,但在物理上不一定是连续的。 2.现实中的节…...
红队系列-IOT安全深入浅出
红队专题 设备安全概述物联网设备层次模型设备通信模型 渗透测试信息收集工具 实战分析漏洞切入点D-link 850L 未授权访问 2017 认证绕过认证绕过 D-link DCS-2530Ltenda 系列 路由器 前台未授权RTSP 服务未授权 访问 弱口令命令注入思科 路由器 固件二进制 漏洞 IoT漏洞-D-Lin…...
亚数受邀参加“长三角G60科创走廊量子密码应用创新联盟(中心)”启动仪式
11月8日,在第六届中国国际进口博览会2023长三角G60科创走廊高质量发展要素对接大会上,亚数信息科技(上海)有限公司CEO翟新元作为密码企业代表之一受邀参加“长三角G60科创走廊量子密码应用创新联盟(中心)”…...
直方图学习
直方图均衡化(Histogram Equalization)是一种用于增强图像对比度的图像处理技术,通过重新分配图像的像素值,使图像中的亮度级别更加均匀,以改善图像的视觉质量。下面是进行直方图均衡化的一般步骤: 计算原始…...
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、按键年月日时分秒,心率报警上下限。 4、红外对接管传感器采集心率送到液晶1602显示。 5、心率低于下限或高于上限,蜂鸣器报警。 二、硬件设计 原理图如…...
【ARFoundation学习笔记】点云与参考点
写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏,更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 点云新建点云 参考点参考点的工作原理何时使用参考点使用参考点…...
uni-app:js实现数组中的相关处理-数组复制
一、slice方法-浅拷贝 使用分析 创建一个原数组的浅拷贝,对新数组的修改不会影响到原数组slice() 方法创建了一个原数组的浅拷贝,这意味着新数组和原数组中的对象引用是相同的。因此,当你修改新数组中的对象时,原数组中相应位置的…...
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( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子…...
国际腾讯云:云服务器疑似被病毒入侵问题解决方案!!!
云服务器可能由于弱密码、开源组件漏洞的问题被黑客入侵,本文介绍如何判断云服务器是否被病毒入侵,及其解决方法。 问题定位 使用 SSH 方式 或 使用 VNC 方式 登录实例后,通过以下方式进行判断云服务器是否被病毒入侵: rc.loca…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 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操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
