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…...
Fish Speech-1.5开发者手册:WebUI界面操作+参数调优+文本提示技巧
Fish Speech-1.5开发者手册:WebUI界面操作参数调优文本提示技巧 1. 快速上手:环境准备与界面概览 Fish Speech V1.5 是一个功能强大的文本转语音模型,基于超过100万小时的多语言音频数据训练而成。它支持包括中文、英文、日语在内的12种语言…...
GitHub 6.6k 星!让 Claude 瞬间读懂整个代码库的神器
在 AI 辅助编程日益普及的今天,我们似乎正处于一个矛盾的时刻:大模型越来越聪明,能写出的代码越来越复杂,但作为开发者,我们却常常感到一种“无力感”。这种无力感,往往源于 AI 的“失忆”。 今天ÿ…...
【生产环境零事故日志架构】:基于127个微服务节点验证的Docker日志分级采集方案(含logrotate+rsyslog+Loki无缝迁移路径)
第一章:Docker 日志优化Docker 容器默认将应用 stdout/stderr 输出重定向为 JSON 格式日志,长期运行易导致磁盘空间耗尽、查询效率低下及日志轮转缺失。优化日志行为需从驱动配置、大小限制与外部集成三方面协同治理。配置日志驱动与轮转策略 通过 --log…...
logo抠图背景去不掉?PS 4种方法一键搞定
抠图是设计师必备的基础技能,但很多新手在处理logo抠图时,总会遇到各种问题:复杂背景的logo抠半天,边缘留灰边、丢失细节;面对PS众多工具,无从下手、反复试错。今天就给大家分享3种PS logo抠图去背景的实用…...
万象视界灵坛代码实例:Python调用Omni-Vision Sanctuary API实现批量图像语义评分
万象视界灵坛代码实例:Python调用Omni-Vision Sanctuary API实现批量图像语义评分 1. 平台概览与技术背景 万象视界灵坛(Omni-Vision Sanctuary)是一款基于OpenAI CLIP模型的高级多模态智能感知平台。它通过创新的像素风格界面,…...
CTF Pwn新手必看:用ROPgadget找pop rdi地址的保姆级教程(附常见坑点)
CTF Pwn实战指南:ROPgadget高效定位pop rdi的五大核心技巧 引言:为什么pop rdi是ROP链的黄金钥匙 在x64架构的CTF Pwn挑战中,pop rdi这条看似简单的指令往往成为解题的关键转折点。不同于x86时代通过栈传递参数的简单粗暴,x64体系…...
Element-UI中el-switch的@change事件传参踩坑记:如何同时获取开关状态和自定义标识
Element-UI中el-switch事件传参实战:多开关场景下的精准控制方案 在Vue.jsElement-UI的中后台系统开发中,el-switch组件因其简洁直观的交互体验而广受欢迎。但当页面出现多个开关组件需要共享同一个回调函数时,开发者往往会陷入一个典型困境—…...
RISC-V汇编避坑指南:新手常犯的5个错误及如何用QEMU调试
RISC-V汇编避坑指南:新手常犯的5个错误及如何用QEMU调试 刚接触RISC-V汇编时,很多开发者都会遇到程序运行结果不符合预期的情况。这些错误往往源于对指令细节的理解不足或调试方法不当。本文将剖析五个最常见的陷阱,并演示如何利用QEMU的调试…...
YOLOv8优化:注意力机制实战 | ECA模块轻量化集成与性能对比分析
1. 为什么需要给YOLOv8加注意力机制? 在目标检测领域,YOLOv8已经展现出强大的性能,但实际应用中我们经常会遇到一些棘手问题。比如在复杂场景下,模型可能会把路边的消防栓误检为行人,或者在夜间检测时对远处车辆的识别…...
量子纠错技术:从比特到高维系统的演进与实践
1. 量子纠错基础:从比特到高维系统的范式演进量子计算的核心挑战在于量子态的脆弱性——环境噪声和操作误差会迅速破坏量子信息。我在IBM量子云平台上的实验数据显示,未经保护的量子比特在100次门操作后保真度就会降至50%以下。量子纠错码(QE…...
