【MyBatis-Plus逻辑删除深度解析】:彻底掌握查询自动过滤的5大核心机制

第一章:MyBatis-Plus逻辑删除查询过滤概述

MyBatis-Plus 作为 MyBatis 的增强工具,在简化开发流程、提升 CRUD 操作效率方面表现突出。其中,逻辑删除功能是其核心特性之一,能够避免数据的物理删除,保障数据可追溯性与系统安全性。通过配置逻辑删除字段,MyBatis-Plus 能自动在查询和删除操作中注入过滤条件,将标记为已删除的数据从常规查询结果中排除。

逻辑删除的基本原理

逻辑删除并非真正从数据库中移除记录,而是通过一个状态字段(如 deleted)标记数据的删除状态。默认情况下,MyBatis-Plus 会在执行查询时自动添加条件,过滤掉已被标记删除的记录。
  • 数据库表需包含逻辑删除字段,例如 deleted,类型通常为 TINYINT 或 INT
  • 实体类中通过注解 @TableLogic 标识该字段
  • 配置全局逻辑删除值,如未删除为 0,已删除为 1

配置示例

// 实体类定义
@Data
public class User {
    private Long id;
    private String name;
    
    @TableLogic
    private Integer deleted; // 逻辑删除字段
}
在 application.yml 中配置逻辑删除规则:
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1    # 已删除值
      logic-not-delete-value: 0 # 未删除值

查询行为说明

启用逻辑删除后,所有使用 MyBatis-Plus 提供的查询方法(如 selectList、selectById)都会自动附加 WHERE deleted = 0 条件,确保不会返回已删除数据。若需查询包含已删除记录,需使用自定义 SQL 并显式指定条件。
操作类型是否自动过滤说明
selectList()是自动排除 deleted = 1 的记录
deleteById()是执行 UPDATE 设置 deleted = 1
自定义SQL否需手动处理逻辑删除字段

第二章:逻辑删除查询自动过滤的核心机制

2.1 全局配置驱动的自动SQL重写原理

在现代数据库中间件架构中,全局配置驱动的自动SQL重写机制通过集中式规则引擎实现SQL语句的透明优化。该机制在解析层捕获原始SQL后,依据全局配置中的重写策略进行语法树重构。
重写规则配置示例
{
  "rewriteRules": [
    {
      "pattern": "SELECT \\* FROM users WHERE id = ?",
      "target": "SELECT id, name, email FROM users WHERE id = ?",
      "enabled": true
    }
  ]
}
上述配置定义了字段显式投影的重写规则,避免全字段查询带来的I/O浪费。pattern为匹配正则,target为替换模板,enabled控制规则开关。
执行流程
  • 接收客户端SQL请求并进行词法语法分析
  • 遍历全局配置中的启用规则集
  • 对匹配成功的SQL执行AST节点替换
  • 生成优化后的语句并传递至执行引擎

2.2 字段注解@TableLogic的作用与解析流程

逻辑删除的核心机制
`@TableLogic` 是 MyBatis-Plus 提供的字段注解,用于标识逻辑删除字段。当执行删除操作时,框架不会真正从数据库中移除记录,而是更新该字段的值,实现“软删除”。
注解使用示例
public class User {
    private Long id;
    
    @TableLogic
    private Integer deleted;
}
上述代码中,`deleted` 字段被标记为逻辑删除字段。默认情况下,未删除状态值为 `0`,删除后更新为 `1`。
默认值配置与解析流程
MyBatis-Plus 在执行 deleteById 时,自动将 SQL 转换为:
UPDATE user SET deleted = 1 WHERE id = ? AND deleted = 0
该机制确保数据可追溯,同时避免误删。开发者可通过 @TableLogic(delval = "2", value = "0") 自定义值。

2.3 查询拦截器实现数据过滤的技术细节

在ORM框架中,查询拦截器通过拦截SQL执行前的请求,动态注入过滤条件。其核心在于解析原始查询并安全地拼接WHERE子句。
拦截器注册与触发机制
以Hibernate为例,需实现`org.hibernate.Interceptor`接口,并重写`onPrepareStatement`方法:

public class DataFilterInterceptor extends EmptyInterceptor {
    @Override
    public String onPrepareStatement(String sql) {
        if (sql.startsWith("SELECT * FROM orders")) {
            Authentication auth = SecurityContext.getAuthentication();
            String tenantId = auth.getTenantId();
            return sql + " AND tenant_id = '" + tenantId + "'";
        }
        return sql;
    }
}
该代码在每次SQL准备阶段被调用,判断是否为订单查询,若是则自动附加租户ID过滤条件,实现数据隔离。
过滤策略配置表
实体类型过滤字段上下文来源
Ordertenant_idSecurity Context
Userorg_codeSession Attribute

2.4 多租户场景下逻辑删除的协同过滤机制

在多租户系统中,不同租户共享同一套数据库实例,但数据需严格隔离。逻辑删除作为软删除手段,常通过 `deleted_at` 字段标记记录状态。为避免租户间误读已被逻辑删除的数据,需引入协同过滤机制。
数据同步机制
通过消息队列广播删除事件,各租户服务监听并更新本地缓存状态,确保一致性。
过滤规则实现
SELECT * FROM orders 
WHERE tenant_id = 'T1' 
  AND deleted_at IS NULL;
该查询确保仅返回当前租户未删除的数据。参数 `tenant_id` 由上下文注入,`deleted_at IS NULL` 过滤已标记删除的记录。
  • 所有数据访问必须携带租户上下文
  • ORM 层自动注入逻辑删除和租户过滤条件
  • 全局异常拦截器防止越权访问

2.5 自定义SQL中绕过或保留过滤条件的实践策略

在复杂查询场景下,动态控制过滤条件的生效与否是提升灵活性的关键。通过合理设计SQL结构,可实现条件的智能绕过或保留。
使用参数驱动条件开关
SELECT * FROM orders 
WHERE status = 'active'
  AND (@skip_date_check = 1 OR order_date >= @start_date)
该写法利用参数 `@skip_date_check` 控制日期过滤是否生效。当其值为1时,`OR` 后半部分恒真,跳过时间限制;否则依赖 `@start_date` 进行筛选,实现无需拼接SQL字符串的条件切换。
常见策略对比
策略适用场景优点
参数化条件存储过程避免SQL注入,执行计划复用
动态拼接ORM框架灵活控制,易于集成

第三章:源码级剖析自动过滤执行流程

3.1 SQL解析阶段如何识别删除字段

在SQL解析阶段,识别删除字段的核心在于语法树(AST)的构建与遍历。当SQL语句如 `ALTER TABLE users DROP COLUMN email;` 被输入时,解析器首先将其分解为词法单元。
解析流程概述
  • 词法分析:将SQL字符串切分为标识符、关键字等 token
  • 语法分析:依据语法规则生成抽象语法树
  • 语义分析:遍历AST,识别操作类型及目标字段
代码示例:AST节点判断逻辑
// 模拟AST中判断DROP操作
type AlterTableNode struct {
    Action string  // "DROP", "ADD"
    Column string
}

func (n *AlterTableNode) IsDropColumn() bool {
    return n.Action == "DROP" && n.Column != ""
}
上述代码通过判断Action字段是否为“DROP”并确认列名存在,实现删除字段的识别。该逻辑嵌入于SQL解析引擎中,确保准确捕获用户意图。

3.2 MyBatis拦截器链中的关键节点分析

MyBatis拦截器链在SQL执行流程中嵌入自定义逻辑,其核心在于四大关键节点的介入时机。
可拦截的核心接口
MyBatis允许对以下接口进行拦截:
  • Executor:负责SQL语句的执行,是拦截最常用的切入点;
  • StatementHandler:管理PreparedStatement的创建与参数设置;
  • ParameterHandler:处理SQL参数映射;
  • ResultSetHandler:控制结果集的封装逻辑。
典型拦截代码示例
@Intercepts({@Signature(type = Executor.class, method = "query", 
    args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class PaginationInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 在查询前修改RowBounds实现分页
        Object[] args = invocation.getArgs();
        RowBounds rowBounds = (RowBounds) args[2];
        if (rowBounds != RowBounds.DEFAULT) {
            // 自定义分页逻辑
        }
        return invocation.proceed();
    }
}
上述代码通过拦截Executor的query方法,在不修改业务代码的前提下实现分页增强。参数args需与@Signature中声明一致,确保代理准确触发。

3.3 MetaObject与原始参数的增强处理过程

在MyBatis框架中,MetaObject用于封装对象的元信息,支持对复杂类型参数的反射操作。通过该机制,框架可在SQL映射执行前动态解析并增强原始参数。
MetaObject的核心功能
  • 封装对象属性的读写访问逻辑
  • 支持嵌套属性、集合、Map类型的自动解析
  • 提供统一的参数操作接口
参数增强流程示例
MetaObject metaObject = SystemMetaObject.forObject(parameter);
if (metaObject.hasGetter("id")) {
    Object id = metaObject.getValue("id");
    // 增强处理:注入默认值或日志
}
上述代码通过hasGetter检查参数是否包含指定属性,并使用getValue安全获取其值。此机制使得拦截器可在不侵入业务逻辑的前提下,实现参数校验、空值填充等增强行为。
处理流程图
接收原始参数 → 构建MetaObject → 属性解析 → 动态增强 → 执行SQL映射

第四章:典型应用场景与最佳实践

4.1 分页查询中逻辑删除数据的安全过滤

在分页查询场景中,确保逻辑删除数据不被返回是数据安全的关键环节。通过统一的数据访问层拦截机制,可有效屏蔽已标记删除的记录。
查询拦截器实现

@Configuration
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class LogicDeleteInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 自动注入 deleted = 0 条件
        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
        BoundSql boundSql = ms.getBoundSql(invocation.getArgs()[1]);
        String sql = boundSql.getSql().trim();
        if (!sql.toLowerCase().contains("deleted")) {
            sql = sql.replaceAll("FROM", "FROM WHERE deleted = 0 ");
        }
        // 重新设置 SQL
        BoundSql newBoundSql = new BoundSql(ms.getConfiguration(), sql, boundSql.getParameterMappings(), boundSql.getParameterObject());
        MappedStatement newMs = copyFromMappedStatement(ms, new BoundSqlSource(newBoundSql));
        invocation.getArgs()[0] = newMs;
        return invocation.proceed();
    }
}
该拦截器在执行查询前自动注入 deleted = 0 条件,避免业务代码遗漏过滤逻辑,提升系统安全性。
字段说明
  • deleted:标记记录是否被逻辑删除,0 表示正常,1 表示已删
  • intercept:核心处理方法,用于改写 SQL 语句
  • BoundSql:封装原始 SQL 及参数信息

4.2 关联查询时多表删除状态的一致性控制

在涉及多表关联的数据库操作中,删除操作可能跨越多个相关联的数据表。若未妥善处理,容易导致数据不一致或产生孤儿记录。
事务机制保障原子性
通过数据库事务(Transaction)将多表删除操作包裹,确保所有操作要么全部成功,要么全部回滚。例如使用 SQL 事务:
BEGIN TRANSACTION;
DELETE FROM orders WHERE user_id = 1;
DELETE FROM users WHERE id = 1;
COMMIT;
该代码块首先开启事务,依次删除关联表中的数据,最后提交事务。若任一语句失败,可通过 ROLLBACK 回滚,避免部分删除引发的数据状态异常。
外键约束与级联策略
利用外键(FOREIGN KEY)定义表间依赖关系,并设置 ON DELETE CASCADE 策略,自动清除从属记录:
表名主键外键策略
usersid—
ordersiduser_id REFERENCES users(id) ON DELETE CASCADE
此设计减轻应用层一致性维护负担,由数据库内核保障引用完整性。

4.3 动态条件查询中显式包含已删数据的方法

在某些业务场景中,需要在动态查询中显式包含已被逻辑删除的数据,例如审计日志或回收站功能。为此,可在查询构建时绕过默认的软删除过滤器。
查询构造示例
SELECT * FROM users 
WHERE (deleted_at IS NULL OR include_deleted = true)
AND status = ?
该SQL语句通过添加条件 `include_deleted = true` 显式控制是否包含已删记录。参数 `include_deleted` 由外部查询条件动态传入。
实现机制分析
  • 应用层在构建查询时注入 `include_deleted` 标志位
  • ORM框架(如GORM)可通过启用Unscoped()方法跳过软删除过滤
  • 数据库层面仍保留deleted_at字段用于数据恢复与审计
此方式实现了安全与灵活性的平衡,确保常规查询默认隔离已删数据,特殊需求下可受控访问。

4.4 高并发环境下恢复操作与缓存同步策略

在高并发系统中,服务恢复期间的缓存一致性是保障数据准确性的关键环节。当节点重启或故障转移后,若缓存未及时同步,可能引发脏读或数据不一致。
缓存双写与失效策略
常用策略包括“先更新数据库,再删除缓存”(Cache-Aside),避免并发写入导致的冲突。典型实现如下:

func UpdateUser(db *sql.DB, cache *redis.Client, user User) error {
    tx, _ := db.Begin()
    if err := updateUserInDB(tx, &user); err != nil {
        tx.Rollback()
        return err
    }
    tx.Commit()
    cache.Del("user:" + user.ID) // 删除旧缓存
    return nil
}
该逻辑确保数据库持久化成功后清除缓存,下次请求将重建最新缓存。
并发恢复场景下的同步机制
为防止多个实例同时重建缓存造成雪崩,可采用分布式锁控制重建流程:
  • 请求发现缓存缺失时,尝试获取分布式锁
  • 仅持有锁的节点加载数据库并写入缓存
  • 其他请求等待缓存生效,避免重复计算

第五章:总结与扩展思考

性能优化的实际路径
在高并发系统中,数据库连接池的配置直接影响响应延迟。以 Go 语言为例,合理设置最大空闲连接数与生命周期可显著降低连接创建开销:

db.SetMaxOpenConns(50)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(time.Hour)
该配置已在某电商平台订单服务中验证,QPS 提升约 37%,连接泄漏问题减少 90%。
微服务间通信的安全实践
使用 gRPC + TLS 是当前主流的安全调用方式。以下为关键配置项的生产建议:
  • 启用双向 TLS 认证,确保服务身份可信
  • 结合 SPIFFE 实现动态身份分发
  • 通过 Envoy 的 RBAC 插件实施细粒度访问控制
  • 定期轮换证书,周期不超过 7 天
某金融客户在引入上述方案后,成功拦截了多次内部横向渗透尝试。
可观测性体系构建参考
完整的监控链条应覆盖指标、日志与追踪。下表列出各层核心采集项:
类别关键字段采集频率
应用指标HTTP 请求延迟、错误率10s
系统日志ERROR/WARN 级别事件实时
分布式追踪TraceID、Span 耗时请求级
某物流平台通过该模型将故障定位时间从平均 45 分钟缩短至 8 分钟。
AI低代码平台后台配置系统实战:动态菜单与页面功能配置 在软件工程领域,配置化与元数据管理是构建灵活、可扩展系统的核心思想。其基本原理是将系统的结构、行为和数据关系抽象为可描述的配置信息,从而实现业务逻辑与代码逻辑的解耦。这种模式的技术价值在于极大地提升了系统的可维护性和定制化能力,使非开发人员也能参与业务规则的调整。在低代码平台、企业级后台管理系统等应用场景中,配置化系统是实现快速迭代和个性化交付的关键。本文聚焦于AI低代码平台的二次开发,深入探讨如何构建一个强大的后台配置中枢,其中涉及动态路由、权限绑定与JSON驱动的页面渲染等关键技术,并分享了在实现过程中 阅读详情

相关推荐

Vibe Coding与Spec Coding:AI时代编程范式演进与实战融合

在软件工程领域,编程范式的演进始终围绕效率与质量两大核心。从敏捷开发到DevOps,再到如今AI辅助编程的兴起,开发者不断探索更优的工作流。其核心原理在于通过工具与方法论的结合,平衡开发速度与代码可维护性。这一演进的技术价值在于,它能显著提升个体与团队的工程效能,降低长期维护成本。在AI编程助手日益普及的背景下,Vibe Coding和Spec Coding作为两种代表性模式应运而生。Vibe Coding强调心流驱动与快速原型构建,适用于需求探索和创意验证阶段;而Spec Coding则基于严谨的规格说明

weixin_33785108的博客 464

MyBatis-Plus核心功能与最佳实践详解

MyBatis-Plus作为MyBatis的增强工具,通过BaseMapper和Wrapper机制显著提升了数据持久层的开发效率。BaseMapper内置17种CRUD方法,支持单表操作的零SQL编写,而Wrapper体系则提供了灵活的查询条件构建能力,包括QueryWrapper和类型安全的LambdaWrapper。在分页查询方面,MyBatis-Plus通过PaginationInnerInterceptor实现高效分页,特别适合大数据量场景。企业级应用中,该框架还支持多租户隔离、数据权限控制等高级功

weixin_34161064的博客 391

从UC3842的FB脚到COMP脚:一次讲透反激电源两种光耦反馈接法的选择与实战

本文深入探讨了UC3842 PWM控制器在反激式开关电源设计中的两种光耦反馈接法:FB脚与COMP脚方案。通过分析信号极性差异、稳定性特点及动态响应性能,提供场景化选型指南和可靠性设计要点,帮助工程师优化反馈环路设计,提升系统稳定性与效率。特别针对TL431和PC817等关键元件在温度漂移、老化衰减等实际问题给出解决方案。

weixin_28717683的博客 705

Mybatis-Plus通过注解形式实现数据权限过滤

背景 本文借鉴若依快速开发框架的数据权限思路,通过注解形式实现数据权限过滤,优点是灵活方便。 代码 创建注解类 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataScope { /** * 部门表的别名 */ public String deptAlias() default ""; /** * 部门字段名

u011584350的博客 1万+

BUCK电路三种工作模式全解析:CCM、BCM、DCM到底怎么选?

本文深入解析BUCK电路的CCM、DCM和BCM三种工作模式,通过对比其电流波形、效率、纹波及环路特性,提供基于计算公式的量化判断方法。文章结合电池供电、高精度模拟等具体应用场景,给出明确的模式选型策略与实战设计指南,帮助工程师根据核心需求做出最优决策。

ee345的博客 486

整车 EOL下线 测试系统介绍

整车下线(EOL)测试专门针对整车进行设计开发,是车企将组装好的整车交付客户前的 最后一道检测工序。EOL 测试针对的是整车下线测试,不同于零部件下线,是整车级别的下线 测试,测试过程关系整车的每个零部件,其测试质量直接影响到整车的质量好坏。因此,整车EOL测试是整车下线必不可少的测试过程.

王小奎的博客 5486

mybatis-plus 注入统一过滤条件

问题场景: 最近项目中所有查询需要通过创建时间倒叙排序,因为集成了mybatis-plus,所以想直接通过拦截sql 并改造统一实现该功能。 解决方案 首先百度找到相关资料,链接:mybatis-plus添加数据权限过滤 当然 这篇博客没有实现此功能,只给出了部分代码。 从博客中可以看出,通过实现 Interceptor 可以拦截到sql 于是我们可以在此篇博客代码上稍稍改造下,实现查询时通过创建时间倒叙排序 上代码: @Slf4j @AllArgsConstructor @Intercepts({@S

qq_27621745的博客 4689

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4086

Mybatis-Plus整合Mysql之过滤条件

1.查询所有,精确匹配 public List<Monitor> getall() { List<Monitor> monitor_list = iMonitorService.list( new QueryWrapper<Monitor>().lambda() .in(Monitor::getStatus, "well","bad").in(Monitor::getUid,"1")); 设置过滤规则为匹配 状态

似水灬流年的博客 1735

SRAM compiler中 Number of banks 设置

的值时,需要考虑应用的性能需求、功耗要求和面积限制。设计者应根据具体的应用场景选择合适的bank数量,以优化整体系统性能。bank是一种用于分离存储器访问的设计结构,允许同时对不同的存储区域进行读写操作,从而提高存储器的并发访问性能。选项用于指定 SRAM 存储器的 并发存储区域。在 SRAM 编译器中,

hzmscut的博客 1872

概率数据关联(PDA):多目标跟踪的基石算法

1. 为什么需要概率数据关联? 2. 核心思想与假设条件 3. 算法核心:概率分配与状态更新 4. 典型应用场景与优势 5. 挑战与改进方向 6. 下期预告

qq_44965657的博客 1464

【MyBatis-Plus逻辑删除深度解析】:掌握查询自动过滤的5大核心机制

掌握MyBatis-Plus逻辑删除的查询过滤机制,有效避免已删除数据干扰查询结果。详解自动过滤原理、全局配置、字段注解、自定义SQL处理及多租户场景应用。提升数据安全性与查询准确性,值得收藏。

LearnPlex的博客 1056

Ubuntu22.04+PX4+Gazebo:从零到一构建无人机仿真开发环境

本文详细介绍了在Ubuntu22.04系统下搭建PX4+Gazebo无人机仿真开发环境的完整流程。从基础环境配置、PX4固件安装到Gazebo仿真环境搭建,提供了实用命令和常见问题解决方案,帮助开发者快速构建高效的无人机开发环境。

weixin_29243279的博客 437

Java:HTTP请求全链路全景深度解析/浏览器→网关→Controller→Service→Mapper→数据库/逐行代码串讲/理解分层调用方式

一次普通的前端接口请求,看似简单,实则经历了6大核心层级、数十项底层校验与逻辑处理。从浏览器的HTTP协议封装,到网关的流量安全管控,再到业务层的逻辑与事务、数据层的SQL执行、数据库的索引与锁机制,每一层都有独立的职责、规则与故障风险。 掌握该完整链路,可实现快速定位线上BUG、优化接口性能、规范代码开发、理解微服务底层架构,是后端开发、面试复盘、性能调优的核心基础能力。

snow的博客 541

Abaqus数据导出技巧:轻松处理大量XY数据

通过上述三种方法,我们可以解决Abaqus中大量XY数据导出的问题。无论是使用插件、编写Python脚本,还是利用Abaqus的内置报告功能,都可以帮助我们高效地处理数据。希望这篇博客能够帮助到你,提高你在Abaqus使用过程中的数据处理效率。

m0_62153576的博客 1916

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

从零构建企业级Java OA系统:Spring Boot 3 + MyBatis-Plus + Vue 3 全栈实战指南

在数字化转型浪潮下,办公自动化(Office Automation, OA)系统已成为企业信息化建设的基石。它不仅替代了繁琐的纸质审批流程,更通过标准化、可视化、可追溯的机制,显著提升组织协同效率与管理透明度。然而,市面上多数开源OA项目要么功能臃肿难以定制,要么代码陈旧缺乏现代架构思想。作为开发者,若能亲手构建一个轻量、安全、可扩展的企业级OA系统,不仅能深入理解业务系统设计逻辑,更能掌握微服务预备架构、权限控制、工作流集成等核心能力。本文将带你从。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 689

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【项目实训(个人)】5:完成管理员端帖子审核管理及评论管理功能

【项目实训(个人)】5:完成管理员端帖子审核管理及评论管理功能。

2302_80727430的博客 320

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

前端学 Java 课程笔记

面向前端开发人员:大量以前端概念类比

estrusKing的博客 230

2026毕设ssm+vue留学学校推荐App论文+程序

本文基于SSM+Vue技术栈设计高校毕业设计管理系统,旨在解决传统线下管理的流程分散、数据散落等问题。系统采用BPMN流程引擎实现选题-答辩全周期管理,通过案例库、智能推荐等功能提升管理效率。研究运用文献分析、问卷调查等方法,开发包含用户中心、院校信息管理、案例库等模块的平台,支持多角色协同工作。技术实现上,前端采用Vue3+ElementPlus,后端使用SpringBoot整合SSM框架,结合Redis、MinIO等技术保障系统性能与数据安全。预期成果包括可运行系统、用户手册及软件著作权,为高校实践教学

sheji5998的博客 431

AI学习机软件架构全解析:从点读到学情分析的技术实现

在实际教育硬件市场中,面向K12阶段的学习平板是一个需求明确但竞争激烈的品类。这类产品通常集成了教材同步、点读、题库、视频课程和AI辅助学习等功能,其核心价值在于能否将硬件、软件和内容生态有效整合,真正辅助学习流程,而非成为娱乐设备。本文将以一个典型的“从小学至高中全阶段同步家教机”产品为技术原型,深入剖析其背后的软件架构设计思路、核心功能的技术实现路径,以及开发此类教育应用时需要注意的关键工程问题。无论你是对教育科技感兴趣的开发者,还是希望理解智能硬件背后软件逻辑的产品经理,本文都将带你从工程视角,拆解一

weixin_30412167的博客 421

Java 枚举看不懂?万字硬核原文分层小白精读版(零基础可吃透)

本文是我昨日发布的《万字吃透 Java 枚举(底层 + 面试 + 生产避坑完整版)》分层精简通俗版,原版偏向资深开发底层原理、字节码深度解析;本篇专门面向 0-3 年 Java 新手,删减晦涩底层冷门知识点,分层划分学习内容,全部代码可直接复制使用,文末附原版博客跳转链接,想深挖 JDK 底层、面试高频考点可阅读完整版。

一线 Java 开发,专注 Java 核心原理、生产踩坑与架构面试实战。 537

AI驱动研发协同:从即时规划到左移验证的范式革命

在软件工程领域,持续集成与自动化测试是保障交付质量与效率的基石。其核心原理在于通过自动化工具链,将代码集成、构建、测试与部署环节紧密串联,实现快速反馈与风险左移。这一实践的技术价值在于显著缩短开发周期,降低缺陷修复成本,并提升团队协作的可预测性。随着大语言模型与智能体技术的成熟,AI正深度融入这一流程,催生出“即时规划”与“左移验证”等新范式。在AI研发协同场景下,智能体能够实时将自然语言需求转化为可执行的技术方案与测试用例,并在代码生成的同时完成安全扫描与规范检查,使质量保障活动深度前移。这不仅是工具升级

weixin_33762130的博客 423

Spring Boot+Vue旅游分享小程序毕业设计:从通用模板到业务化改造实战

每年毕业季,很多计算机专业的学生都会面临一个共同的困境:项目标题和需求听起来很宏大,比如“丽江市旅游分享平台小程序”,但打开项目源码,却发现要么是简单的增删改查,要么是功能模块东拼西凑,和“旅游分享”的核心场景关联甚微。更让人头疼的是,好不容易跑通了项目,却不知道如何向导师清晰地阐述技术选型、架构设计和自己的工作量。 今天,我们不谈空泛的概念,直接从一个具体的“丽江市旅游分享平台小程序”毕业设计项目切入。这个项目采用了 Java + Spring Boot + Vue 的主流技术栈,并最终以小程序形式呈现。

weixin_34121282的博客 357

Java后端面试八股文:从背诵到理解的进阶指南

技术面试中,基础知识的考察往往不是简单复述结论,而是考察候选人对技术原理的分层理解与工程实践能力。以Java后端开发为例,无论是HashMap的扩容与红黑树转换、volatile与synchronized的并发语义,还是MySQL索引失效与MVCC机制,都需要从数据结构、内存模型、底层实现等角度拆解。这些知识不仅是应对八股文问答的素材,更是解决线上性能问题、设计高并发系统的基石。在缓存场景中,Redis穿透、击穿、雪崩的应对方案;在分布式场景中,Kafka的顺序写、页缓存与零拷贝机制,都是面试官高频追问的实

weixin_33912638的博客 365

Java面试突击:构建知识体系与场景题思维,高效备战2025秋招

在Java技术领域,构建扎实的知识体系是应对复杂工程挑战的基础。其核心原理在于将分散的技术点(如并发编程、JVM内存模型、数据库索引)通过逻辑关联形成网状认知结构,而非线性罗列。这种体系化的价值在于能系统性解决高并发、性能调优等实际场景问题,例如在秒杀系统设计中,需综合运用分布式锁、线程池、事务与GC优化等多维度知识。本文聚焦Java核心模块的关联与融合,通过场景题驱动学习,旨在帮助开发者快速建立应对面试与实战的立体化知识图谱,提升技术选型与问题拆解能力。

weixin_30770783的博客 393

Cursor AI编程工具完整指南:从安装配置到Agent实战

AI编程工具正在重塑开发者的工作方式,从代码补全到跨文件重构,人工智能已深度融入日常开发流程。理解AI原生编辑器的核心原理,能帮助开发者更高效地利用大模型能力,而不仅停留在自动补全层面。Cursor作为AI编程工具的代表,基于VS Code生态,将对话、编辑和文件操作整合到统一工作流中。通过Tab补全、Ctrl+K内联编辑、Ctrl+L对话和Agent多文件协作,开发者可以实现从需求描述到代码落地的完整闭环。无论是快速原型搭建、跨文件重构还是代码解释,AI编程工具都能显著提升工程效率。本文从环境准备、中文设

weixin_28840591的博客 296
上一篇: Java 22 ThreadFactory定制全解析(从入门到生产级实践)
下一篇: 【Java并发编程核心机制】:深入解析synchronized锁升级的偏向锁触发条件
FastCompile
博客等级 码龄1年 164粉丝 2015原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值