mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现

在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis-plus的自动填充功能是如何进行操作的。

文章目录

  • mybatis-plus自动填充时间的配置类实现
    • 1. 目标
    • 2. 上代码
      • 2.1. 代码目录
      • 2.2. pom文件
      • 2.4. MyMetaObjectHandler(重点)
      • 2.5. MybatisAutoConfiguration
      • 2.6. UserContextHolder
      • 2.7. BaseEntity
      • 2.8. User
    • 3. 测试
      • 3.1. insert(User)
      • 3.2. update(User)
      • 3.3. updateUpdateWrapper()更新失败
      • 3.4. updateUpdateWrapper()更新失败
      • 3.5. userServiceUpdateUpdateWrapper() 更新失败
      • 3.6. userServiceUpdateLambdaUpdateWrapper() 更新失败
    • 4. 改造上面测试更新失败的
      • 4.1. 增加UpdateWapperAspect切面(重点)
      • 4.2. 测试updateUpdateWrapper()更新成功
      • 4.3. 测试updateUpdateWrapper()更新成功
      • 4.4. userServiceUpdateUpdateWrapper() 更新成功
      • 3.6. userServiceUpdateLambdaUpdateWrapper() 更新成功
    • 5.总结

1. 目标

  • 实现默认设置创建者id,创建者用户名,更新者id,更新者用户名,创建时间,更新时间
  • 实现自定义字段birth_day 没有设置值的时候设置当前时间
  • 实现自定义字段login_time没有设置值的时候更新设置当前时间

sql信息如下

drop table if exists liu_user;
CREATE TABLE `liu_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(255) DEFAULT NULL COMMENT '名字',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`phone` varchar(255) DEFAULT NULL COMMENT '电话号码',
`birth_day` timestamp NULL COMMENT '出生时间',
`login_time` timestamp NULL COMMENT '登录时间',
`create_by` varchar(20) DEFAULT NULL COMMENT '创建者id',
`create_by_name` varchar(100) DEFAULT NULL COMMENT '创建者账号名',
`update_by` varchar(20) DEFAULT NULL COMMENT '更新者id',
`update_by_name` varchar(100) DEFAULT NULL COMMENT '更新者账号名',
`create_time` timestamp NULL COMMENT '创建时间',
`update_time` timestamp NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) COMMENT='用户表';

2. 上代码

2.1. 代码目录

在这里插入图片描述

2.2. pom文件

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Tag-单元测试 junit--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- aop切面 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.14.3</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.14.3</version></dependency><!-- Tag-单元测试 junit--><!-- Tag-mybatis plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><!-- Tag-mybatis plus--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>

2.3. yml配置

spring:datasource:# mysqldriver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://192.168.0.154:3306/bigdata_src1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
mybatis-plus:mapper-locations: classpath*:com/liuhm/dao/mysqlmapper/*Mapper.xml# 实体扫描,多个package用逗号或者分号分隔type-aliases-package: com.liuhm.entityglobal-config:db-config:id-type: autofield-strategy: not_nulllogic-delete-value: 0logic-not-delete-value: 0banner: falseconfiguration:#sql日志打印log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: truecache-enabled: falseserver:port: 9099

2.4. MyMetaObjectHandler(重点)

常规实现MetaObjectHandler

package com.liuhm.config;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.liuhm.config.context.UserContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;
import java.util.*;/*** @ClassName:SmMetaObjectHandler* @Description: 全局处理基本字段* @Author: liuhaomin* @Date: 2023/11/29 15:25*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {private final List<String> userIdFieldList = new ArrayList<>(Arrays.asList("createBy", "updateBy"));private final List<String> userNameFieldList = new ArrayList<>(Arrays.asList("createByName", "updateByName"));private final String updateBy = "updateBy";private final String updateByName = "updateByName";private final static String JAVA_LANG_OBJECT = "java.lang.object";@Overridepublic void insertFill(MetaObject metaObject){try {setDefaultValue(metaObject, Arrays.asList(FieldFill.INSERT, FieldFill.INSERT_UPDATE));} catch (Exception e) {log.warn("设置默认参数失败 {}");}}@Overridepublic void updateFill(MetaObject metaObject){try {setDefaultValue(metaObject, Arrays.asList(FieldFill.INSERT_UPDATE, FieldFill.UPDATE));} catch (Exception e) {log.warn("设置默认参数失败 {}");}}public void setDefaultValue(MetaObject metaObject, List<FieldFill> fieldFills){List<Field> declaredFields = new ArrayList<>();Class tempClass = metaObject.getOriginalObject().getClass();while(tempClass != null && !tempClass.getName().toLowerCase().equals(JAVA_LANG_OBJECT)){declaredFields.addAll(Arrays.asList(tempClass.getDeclaredFields()));tempClass = tempClass.getSuperclass();}String userId = UserContextHolder.getUserId();String userName = UserContextHolder.getUserName();Date date = new Date();String fieldName = null;Object val = null;for(Field declaredField : declaredFields){fieldName = declaredField.getName();val = getFieldValByName(fieldName, metaObject);TableField annotation = declaredField.getAnnotation(TableField.class);if (Objects.nonNull(annotation) && (fieldFills.contains(annotation.fill()))) {if (Objects.isNull(val)) {if (userIdFieldList.contains(fieldName) && Objects.nonNull(userId)) {val = userId;}if (userNameFieldList.contains(fieldName) && Objects.nonNull(userName)) {val = userName;}// 插入的时候符合条件的 为空设置值// 设置符合条件的默认时间if ("Date".equals(declaredField.getType().getSimpleName())) {val = date;}} else {// 更新if (updateBy.equals(fieldName) && Objects.nonNull(userId)) {val = userId;}if (updateByName.equals(fieldName) && Objects.nonNull(userName)) {val = userName;}}if(fieldFills.contains(FieldFill.INSERT_UPDATE) && fieldFills.contains(FieldFill.UPDATE)){// 设置符合条件的默认时间if ("Date".equals(declaredField.getType().getSimpleName())) {val = date;}}setFieldValByName(fieldName, val, metaObject);}}}}

2.5. MybatisAutoConfiguration

package com.liuhm.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;/*** mybatis 自动配置类** @author liuhaomin* @date  2023.11.16*/
@Configuration
@MapperScan("com.liuhm.dao.mapper*")
public class MybatisAutoConfiguration {
}

2.6. UserContextHolder

package com.liuhm.config.context;import com.alibaba.ttl.TransmittableThreadLocal;/*** 模拟用户获取用户名和用户信息 上下文 Holder*/
public class UserContextHolder {/*** 当前用户编号*/private static final ThreadLocal<String> USER_ID = new TransmittableThreadLocal<>();private static final ThreadLocal<String> USER_NAME = new TransmittableThreadLocal<>();/*** 获得用户编号。** @return 用户编号*/public static String getUserId() {return USER_ID.get();}public static void setUserId(String userId) {USER_ID.set(userId);}public static void clear() {USER_ID.remove();USER_NAME.remove();}public static String getUserName() {return USER_NAME.get();}public static void setUserName(String userName) {USER_NAME.set(userName);}
}

2.7. BaseEntity

package com.liuhm.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** @ClassName:BaseEntity* @Description: 基础的类* @Author: liuhaomin* @Date: 2023/11/29 15:17*/@Data
public class BaseEntity implements Serializable {private static final long serialVersionUID = -995832545980280226L;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新时间*/@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;/*** 创建者,目前使用 User 的 id 编号*/@TableField(fill = FieldFill.INSERT)private String createBy;@TableField(fill = FieldFill.INSERT)private String createByName;/*** 更新者,目前使用 User 的 id 编号*/@TableField(fill = FieldFill.INSERT_UPDATE)private String updateBy;@TableField(fill = FieldFill.INSERT_UPDATE)private String updateByName;/*** 是否删除*/// @TableLogic// private Boolean deleted;}

2.8. User

package com.liuhm.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @ClassName:User* @Description: User* @Author: liuhaomin* @Date: 2024/12/23 13:50*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "liu_user")
public class User extends BaseEntity {private static final long serialVersionUID = -1L;private Integer id;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 电话号码*/private String phone;/*** 出生时间*/@TableField(fill = FieldFill.INSERT)private Date birthDay;/*** 登录时间*/@TableField(fill = FieldFill.UPDATE)private Date loginTime;
}

2.9. 其余简单的类

public interface UserService extends IService<User>
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService
public interface UserMapper extends BaseMapper<User>

3. 测试

3.1. insert(User)

  • 实现默认设置创建者id,创建者用户名,更新者id,更新者用户名,创建时间,更新时间,birth_day 默认有数据
	@Testpublic void insert(){String userId = "1";String userName = "admin";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);User user = new User();user.setUsername("admin");user.setPassword("123456");user.setPhone("15723219655");userMapper.insert(user);List<User> users = userMapper.selectList(null);log.info("users:{}", users);}

在这里插入图片描述

在这里插入图片描述

3.2. update(User)

  • 更新者id,更新者用户名,更新时间,login_time 默认有数据
	@Testpublic void update(){String userId = "2";String userName = "admin2";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUsername, "admin"));user.setPassword("123456789");userMapper.updateById(user);List<User> users = userMapper.selectList(null);log.info("users:{}", users);}

在这里插入图片描述

在这里插入图片描述

3.3. updateUpdateWrapper()更新失败

  • 更新者id,更新者用户名,更新时间,Password
  • 更新失败
	@Testpublic void updateUpdateWrapper(){String userId = "3";String userName = "admin3";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userMapper.update(null, new UpdateWrapper<User>().lambda().set(User::getPassword,"963852741").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("updateUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

3.4. updateUpdateWrapper()更新失败

  • 更新者id,更新者用户名,更新时间,Password
  • 更新失败
	@Testpublic void updateLambdaUpdateWrapper(){String userId = "4";String userName = "admin4";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userMapper.update(null, new LambdaUpdateWrapper<User>().set(User::getPassword,"963852741123465").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("updateLambdaUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

3.5. userServiceUpdateUpdateWrapper() 更新失败

  • 更新者id,更新者用户名,更新时间,Password
  • 更新失败
	@Testpublic void userServiceUpdateUpdateWrapper(){String userId = "5";String userName = "admin5";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userService.update( new UpdateWrapper<User>().lambda().set(User::getPassword,"963852741").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("userServiceUpdateUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

3.6. userServiceUpdateLambdaUpdateWrapper() 更新失败

  • 更新者id,更新者用户名,更新时间,Password
  • 更新失败
@Testpublic void userServiceUpdateLambdaUpdateWrapper(){String userId = "6";String userName = "admin6";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userService.update( new LambdaUpdateWrapper<User>().set(User::getPassword,"963852741123465").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("userServiceUpdateLambdaUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

4. 改造上面测试更新失败的

4.1. 增加UpdateWapperAspect切面(重点)

package com.liuhm.config.acpect;import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.liuhm.config.context.UserContextHolder;
import com.liuhm.entity.BaseEntity;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Objects;/*** @ClassName:UpdateWapperAspect* @Description: 解决update(Wrapper updateWrapper),自动填充不生效问题* @Author: liuhaomin* @Date: 2024/2/19 9:19*/
@Aspect
@Component
@Slf4j
public class UpdateWapperAspect{@Pointcut("execution(* com.baomidou.mybatisplus.core.mapper.BaseMapper.update(..))")public void pointcut(){}@Around(value = "pointcut()")public Object around(ProceedingJoinPoint pjp){updateEntity(pjp);try {return pjp.proceed();} catch (Throwable e) {throw new RuntimeException(e);}}/*** 重写update(Wrapper<T> updateWrapper), 更新时自动填充不生效问题** @param pjp** @return*/private void updateEntity(ProceedingJoinPoint pjp){Object[] args = pjp.getArgs();if (args != null && args.length == 2) {if(args[0] != null){return;}Object arg = args[1];String userId = UserContextHolder.getUserId();String userName = UserContextHolder.getUserName();if (arg instanceof UpdateWrapper) {UpdateWrapper updateWrapper = (UpdateWrapper) arg;String sqlSet = updateWrapper.getSqlSet();if(!sqlSet.contains("update_time")){updateWrapper.set("update_time", new Date());}if (Objects.nonNull(userId) && !sqlSet.contains("update_by")) {updateWrapper.set("update_by", userId);}if (Objects.nonNull(userName) && !sqlSet.contains("update_by_name")) {updateWrapper.set("update_by_name", userName);}}if (arg instanceof LambdaUpdateWrapper) {LambdaUpdateWrapper<BaseEntity> updateWrapper = (LambdaUpdateWrapper) arg;String sqlSet = updateWrapper.getSqlSet();if(!sqlSet.contains("update_time")){updateWrapper.set(BaseEntity::getUpdateTime, new Date());}if (Objects.nonNull(userId) && !sqlSet.contains("update_by")) {updateWrapper.set(BaseEntity::getUpdateBy, userId);}if (Objects.nonNull(userName) && !sqlSet.contains("update_by_name")) {updateWrapper.set(BaseEntity::getUpdateByName, userName);}}}}
}

4.2. 测试updateUpdateWrapper()更新成功

  • 更新者id,更新者用户名,更新时间,Password
	@Testpublic void updateUpdateWrapper(){String userId = "3";String userName = "admin3";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userMapper.update(null, new UpdateWrapper<User>().lambda().set(User::getPassword,"963852741").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("updateUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

4.3. 测试updateUpdateWrapper()更新成功

  • 更新者id,更新者用户名,更新时间,Password
	@Testpublic void updateLambdaUpdateWrapper(){String userId = "4";String userName = "admin4";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userMapper.update(null, new LambdaUpdateWrapper<User>().set(User::getPassword,"963852741123465").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("updateLambdaUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

4.4. userServiceUpdateUpdateWrapper() 更新成功

  • 更新者id,更新者用户名,更新时间,Password
	@Testpublic void userServiceUpdateUpdateWrapper(){String userId = "5";String userName = "admin5";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userService.update( new UpdateWrapper<User>().lambda().set(User::getPassword,"963852741").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("userServiceUpdateUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

3.6. userServiceUpdateLambdaUpdateWrapper() 更新成功

  • 更新者id,更新者用户名,更新时间,Password
	@Testpublic void userServiceUpdateLambdaUpdateWrapper(){String userId = "6";String userName = "admin6";// 设置上下文模拟请求中的用户信息UserContextHolder.setUserId(userId);UserContextHolder.setUserName(userName);userService.update( new LambdaUpdateWrapper<User>().set(User::getPassword,"963852741123465").eq(User::getUsername, "admin"));List<User> users = userMapper.selectList(null);log.info("userServiceUpdateLambdaUpdateWrapper:{}", users);}

在这里插入图片描述

在这里插入图片描述

5.总结

实现默认设置创建者id,创建者用户名,更新者id,更新者用户名,创建时间,更新时间

自定义mapperXml sql暂时不会默认更新上述字段

博客地址

代码下载

下面的mybatis-plus-fieldfill

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件工程】十万字知识点梳理 | 期末复习专用

原创文章,禁止转载。 文章目录 图CRC卡片用例图类图状态图活动图泳道图软件质量因素自顶向下集成自底向上集成人员与工作量之间的关系时序图关键路径软件结构基本路径测试判定表数据流图(DFD)体系结构设计问题数据字典挣值分析等价划分程序流程图PAD | N-S燃尽图甘特图对象模…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册&#xff0c;可以看到我们只要完成下面函数的实现&#xff0c;就可以完成移植。我们这里只移植前5个函数&#xff0c;获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义&#xff1a;令牌&#xff0c;访问资源接口&#xff08;API&#xff09;时所需要的资源凭证 一、Access Token 定义&#xff1a;访问资源接口&#xff08;API&#xff09;时所需要的资源凭证&#xff0c;存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

软体机器人研究报告:设计方法、材料与驱动、感知与控制

软体机器人因其出色的可变形性和高适应性受到了广泛关注&#xff0c;这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究&#xff0c;取得了一系列成果。 本文汇…

imgproxy图像处理的高效与安全

摘要 imgproxy作为一个高效且安全的独立服务器,为图像处理提供了全新的解决方案。它不仅简化了图像调整和转换的过程,还极大地提升了处理速度,确保了整个流程的安全性。通过集成imgproxy,用户可以轻松优化网页上的图像,提高加载速度,改善用户体验。本文将深入探讨imgpro…

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …

RTMW:实时多人2D和3D 全人体姿态估计

单位&#xff1a;上海AI实验室 代码&#xff1a;mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…

香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443

一、问题 如图&#xff1a; 接上调试串口&#xff0c;每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅&#xff0c;有一位博主提到&#xff0c;但是没有细说解决方案&#xff1a; spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…

【KLEE】源码阅读笔记----KLEE执行流程

本文架构 1. 动机2.KLEE简介3.KLEE的代码工程结构4. 从KLEE主函数入手main函数step1: 初始化step2&#xff1a;加载.bc文件进行符号执行 读取测试用例输出日志信息 1. 动机 最近准备对KLEE进行修改使其符合我的需要&#xff0c;因此免不了需要对源码进行修改。读懂源码是对在其…

CS 144 check7: putting it all together

Exercises 经验&#xff1a;两边的TCP连接建立得尽快&#xff0c;如果服务器端启动了&#xff0c;客户端没有紧接着启动就连不上。 这是什么神奇的bug呢&#xff1f; 和我之前给域控刷SOC的版本一样。如果域控启动了&#xff0c;在我本地的电脑没有马上和域控的SOC通上信&…

Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇

历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件&#xff0c;模…

【YOLO】(基础篇一)YOLO介绍

YOLO YOLO&#xff08;You Only Look Once&#xff09;是一种用于实时物体检测的算法&#xff0c;由Joseph Redmon等人提出。它能够同时进行物体分类和定位&#xff0c;并且因其速度和效率而广受赞誉。 工作原理 假设我们要对这张猫的图片完成目标检测&#xff0c;需要框选出…

Linux-----进程处理(文件IO资源使用)

下面代码是通过父进程和子进程对同一个文件IO资源进行操作&#xff0c;父进程和子进程都对这个进程进行写入操作&#xff0c;我们都知道这两个进程实际上是并发的&#xff0c;所以需要一个同步机制来去操作同一个资源&#xff08;后面再深入去说明同步的api&#xff0c;这里使用…

golang标准库SSH操作示例

文章目录 前言一、了解SSH二、重要知识点1.安装ssh库2.ssh库重要知识牢记 三、模拟连接远程服务器并执行命令四、SSH与os/exec标准库下执行命令的几种方式对比五、SSH库下三种执行命令方式演示5.1. session.CombinedOutput()示例5.2. session.Run()示例5.3. session.Start()、s…

替代传统FTP传输,镭速大数据传输系统实现安全高效数据流转!

信息技术的快速进步让大数据成为了企业决策的关键支撑&#xff0c;但同时也带来了巨大的挑战。企业在运营过程中产生的数据量急剧增加&#xff0c;这对数据传输的速度、安全性和效率提出了更高的要求。然而&#xff0c;传统的FTP传输方式在处理大规模数据时显得力不从心&#x…

MyBatis如何处理延迟加载?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis如何处理延迟加载&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis如何处理延迟加载&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 支持 延迟加载&#xff08;Lazy Loading&am…

Matlab环形柱状图

数据准备&#xff1a; 名称 数值 Aa 21 Bb 23 Cc 35 Dd 47 保存为Excel文件后&#xff1a; % Load data from Excel file filename data.xlsx; % Ensure the file is in the current folder or provide full path dataTable readtable(filena…

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名&#xff1a;AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块&#xff1a; 视频域适应…