当前位置: 首页 > news >正文

Spring Boot生态中ORM对数据治理的支持有哪些?

有哪些ORM框架可用?

在这里插入图片描述
在 Spring Boot 生态中,ORM(对象关系映射)框架的选择丰富多样,主要分为 JPA 规范实现半自动化 ORM代码生成型 ORM扩展工具 等类型。以下是主流 ORM 框架的详细介绍,包括其特点、适用场景及与 Spring Boot 的集成方式:

在这里插入图片描述

一、JPA 规范实现(标准 ORM)

JPA(Java Persistence API)是 Java 官方定义的 ORM 规范,Spring Boot 主流实现包括 HibernateEclipseLink,二者均通过 spring-boot-starter-data-jpa 快速集成。

1. Hibernate
  • 定位:最流行的 JPA 实现,功能全面,支持自动 Schema 生成、二级缓存、延迟加载等高级特性。
  • 特点
    • 高度抽象:通过注解(如 @Entity@OneToMany)定义实体与表的映射,自动处理对象-关系转换。
    • 自动 DDL:支持 hibernate.hbm2ddl.auto 配置(如 updatecreate),自动生成或更新数据库表结构(开发环境友好)。
    • 缓存机制:内置一级缓存(Session 级)和二级缓存(应用级),提升查询性能。
    • 数据库兼容性:支持主流数据库(MySQL、PostgreSQL、Oracle 等),并提供方言适配。
  • 适用场景:快速开发、需要自动化管理数据库 Schema、对 ORM 抽象要求高的项目(如企业级后台管理系统)。
  • Spring Boot 集成
    <!-- pom.xml -->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
    </dependency>
    
    配置 application.yml
    spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456jpa:hibernate:ddl-auto: update  # 开发环境自动生成表结构show-sql: true      # 打印 SQL 日志
    
2. EclipseLink
  • 定位:另一个主流 JPA 实现,由 Oracle 维护(原 TopLink),功能与 Hibernate 类似,但在某些特性(如缓存、查询优化)上有差异。
  • 特点
    • 轻量高效:内存占用较低,适合资源受限的环境。
    • 高级查询优化:支持更复杂的 JPQL 查询转换,对某些数据库(如 Oracle)的优化更深入。
    • 与 Spring 集成:需手动配置 LocalContainerEntityManagerFactoryBean,但 Spring Boot 提供自动配置支持。
  • 适用场景:需要替代 Hibernate、对特定数据库(如 Oracle)有深度优化需求的项目。
  • Spring Boot 集成
    需排除 Hibernate 依赖,引入 EclipseLink:
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><exclusions><exclusion><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId></exclusion></exclusions>
    </dependency>
    <dependency><groupId>org.eclipse.persistence</groupId><artifactId>eclipselink</artifactId><version>4.0.2</version> <!-- 需匹配 Spring Boot 版本 -->
    </dependency>
    

二、半自动化 ORM:MyBatis 系列

MyBatis 是半自动化 ORM框架,强调 SQL 控制,通过 XML 或注解定义 SQL 语句,适合需要手动优化 SQL 性能的场景。

1. MyBatis
  • 定位:通过 Mapper 接口与 XML/注解绑定 SQL,开发者需手动编写 SQL 语句,灵活性高。
  • 特点
    • SQL 可控:直接编写 SQL,便于性能调优和数据库方言适配。
    • 灵活映射:支持复杂结果集映射(如多表关联、动态 SQL)。
    • 插件扩展:支持自定义插件(如分页插件 PageHelper)。
  • 适用场景:对 SQL 性能要求高、需要精细控制数据库操作的场景(如高并发交易系统、大数据量查询)。
  • Spring Boot 集成
    <!-- pom.xml -->
    <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version> <!-- 匹配 Spring Boot 版本 -->
    </dependency>
    <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
    </dependency>
    
    配置 application.yml
    mybatis:mapper-locations: classpath:mapper/*.xml  # XML 映射文件路径configuration:map-underscore-to-camel-case: true      # 自动驼峰命名转换(如 user_name → userName)
    
2. MyBatis-Plus(MP)
  • 定位:MyBatis 的增强工具(国产),通过 BaseMapper 接口提供通用 CRUD 方法,大幅减少重复代码。
  • 特点
    • 无侵入性:完全兼容原生 MyBatis,仅通过注解或接口扩展功能。
    • 通用 CRUD:内置 insertselectByIdupdateById 等方法,无需编写 XML。
    • 条件构造器:通过 QueryWrapper 动态构建查询条件(替代复杂 XML)。
    • 分页支持:内置分页插件,简化分页查询。
  • 适用场景:需要快速开发 CRUD 功能,同时保留 MyBatis SQL 灵活性的项目(如中后台管理系统)。
  • Spring Boot 集成
    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
    </dependency>
    
    使用示例:
    // 实体类(继承 Model)
    @Data
    public class User extends Model<User> {@TableId(type = IdType.AUTO)private Long id;private String username;
    }// Mapper 接口(继承 BaseMapper)
    public interface UserMapper extends BaseMapper<User> {}// Service 中直接使用通用方法
    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getById(Long id) {return userMapper.selectById(id); // 无需编写 SQL}
    }
    

三、代码生成型 ORM:jOOQ

  • 定位:基于数据库 Schema 生成类型安全的 Java 代码,通过流畅的 API 构建 SQL,避免手写字符串拼接。
  • 特点
    • 类型安全:编译期检查 SQL 字段、表名,避免运行时错误。
    • SQL 可控:生成的代码与数据库 Schema 严格一致,适合复杂查询(如多表 JOIN)。
    • 支持多种数据库:自动生成适配不同数据库的 SQL 方言。
  • 缺点:商业许可(社区版免费但功能受限),学习成本较高。
  • 适用场景:对 SQL 正确性要求极高、需要类型安全的项目(如金融系统、高可靠性服务)。
  • Spring Boot 集成
    <dependency><groupId>org.jooq</groupId><artifactId>jooq</artifactId><version>3.18.7</version>
    </dependency>
    <dependency><groupId>org.jooq</groupId><artifactId>jooq-meta</artifactId><version>3.18.7</version>
    </dependency>
    <dependency><groupId>org.jooq</groupId><artifactId>jooq-codegen</artifactId><version>3.18.7</version>
    </dependency>
    
    配置代码生成(jooq-config.xml):
    <configuration><jdbc><driver>com.mysql.cj.jdbc.Driver</driver><url>jdbc:mysql://localhost:3306/mydb</url><user>root</user><password>123456</password></jdbc><generator><database><name>org.jooq.meta.mysql.MySQLDatabase</name><includes>.*</includes><inputSchema>mydb</inputSchema></database><generate><pojos>true</pojos>       <!-- 生成 POJO --><daos>true</daos>         <!-- 生成 DAO --></generate><target><packageName>com.example.jooq</packageName><directory>src/main/java</directory></target></generator>
    </configuration>
    
    通过 Maven 插件生成代码后,使用生成的 DAO 操作数据库:
    // 生成的 DAO
    UserDao userDao = new UserDao(configuration);
    UserRecord user = userDao.fetchOne(USERS.ID, 1L); // 类型安全查询
    

四、扩展工具与框架

除上述主流 ORM 外,Spring Boot 生态还有一些辅助工具,可结合 ORM 框架提升开发效率:

1. Spring Data JPA
  • 定位:基于 JPA 规范的仓库抽象层,通过接口方法名自动生成 SQL(如 findByUsername(String username)),进一步简化 CRUD 操作。
  • 特点
    • 零代码 CRUD:仅需定义接口(如 UserRepository extends JpaRepository<User, Long>),自动生成基础方法。
    • 查询方法解析:支持方法名关键字(findByAndOrBetween)自动生成查询。
    • 自定义查询:通过 @Query 注解编写 JPQL 或原生 SQL。
  • 适用场景:快速开发简单 CRUD 功能,减少样板代码(如内部管理系统)。
  • 与 Hibernate 关系:底层默认使用 Hibernate 作为 JPA 实现。
2. Querydsl
  • 定位:类型安全的查询构建工具,支持 JPA、SQL、MongoDB 等多种数据源。
  • 特点
    • 类型安全:通过编译生成的 Q 类(如 QUser)构建查询,避免字符串拼接错误。
    • 流畅 API:链式调用构建复杂查询(如 query.from(user).where(user.username.eq("admin")).list(user))。
  • 适用场景:需要动态构建复杂查询(如多条件筛选)的项目。
  • Spring Boot 集成
    <dependency><groupId>com.querydsl</groupId><artifactId>querydsl-jpa</artifactId><version>6.0.0</version>
    </dependency>
    <dependency><groupId>com.querydsl</groupId><artifactId>querydsl-apt</artifactId><version>6.0.0</version><scope>provided</scope>
    </dependency>
    
    通过 Maven 插件生成 Q 类后使用:
    QUser user = QUser.user;
    List<User> result = queryFactory.selectFrom(user).where(user.username.eq("admin").and(user.age.gt(18))).fetch();
    

五、如何选择 ORM 框架?

根据项目需求和团队技术栈,可参考以下决策逻辑:

需求维度推荐框架
快速开发、减少样板代码Spring Data JPA(底层 Hibernate)
需要手动优化 SQLMyBatis 或 MyBatis-Plus
类型安全的 SQL 构建jOOQ(商业)或 Querydsl(开源)
高度自动化的 ORMHibernate
兼容旧系统 SQL 逻辑MyBatis(直接编写 SQL)

在这里插入图片描述

总结

Spring Boot 生态中的 ORM 框架覆盖了从高度抽象(Hibernate、Spring Data JPA)到手动控制 SQL(MyBatis)的全场景需求。选择时需结合项目对开发效率、SQL 可控性、类型安全的要求,以及团队对框架的熟悉度。对于大多数企业级应用,MyBatis-Plus(平衡开发效率与 SQL 控制)或 Spring Data JPA(快速开发)是最常用的选择;而对 SQL 要求极高的场景(如金融系统),则推荐 jOOQMyBatis

在这里插入图片描述

ORM框架对数据治理的支持

在 Spring Boot 体系中,ORM(对象关系映射)框架是连接业务对象与数据库的核心桥梁,其设计不仅关注数据持久化,还通过扩展能力支持企业级数据治理需求。数据治理结构通常涵盖数据模型定义、元数据管理、数据质量、数据安全、审计日志、多租户支持、事务管理等关键维度。以下从主流 ORM 框架(如 Hibernate、MyBatis、Spring Data JPA)出发,结合 Spring Boot 特性,详细说明其对数据治理的支持:
在这里插入图片描述
在 Spring Boot 体系中,ORM(对象关系映射)框架是连接业务对象与数据库的核心枢纽,其设计不仅关注数据持久化,还通过扩展能力深度支持企业级数据治理需求。数据治理涵盖数据模型定义、元数据管理、数据质量、数据安全、审计日志、多租户隔离、事务管理等关键维度。以下结合主流 ORM 框架(Hibernate、MyBatis、Spring Data JPA),详细说明其对数据治理的支持:

一、数据模型定义与标准化

ORM 框架通过声明式映射将 Java 对象与数据库表/视图关联,确保业务模型与数据模型的一致性,是数据治理的起点。

1. JPA 规范的标准化映射(Hibernate/Spring Data JPA)
  • 注解驱动定义:通过 JSR 338(JPA 2.2)标准注解(如 @Entity@Table@Column@Id@OneToMany)定义实体类与表的映射关系,明确字段约束(如 @Column(nullable=false, length=50))、主键生成策略(@GeneratedValue)、关联关系(一对一、一对多)。
    示例:
    @Entity
    @Table(name = "user", schema = "auth") // 指定表名和 Schema
    public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键private Long id;@Column(nullable = false, unique = true, length = 50) // 非空、唯一、长度限制private String username;@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) // 级联保存/删除private List<Role> roles;
    }
    
  • 自动 Schema 管理:通过 hibernate.hbm2ddl.auto 配置(如 updatecreate),自动生成或更新数据库表结构(开发环境友好),确保模型与数据库同步。
2. MyBatis 的灵活映射
  • XML/注解绑定 SQL:通过 resultMap 定义复杂字段映射(如多表关联、字段别名),或通过 @Result 注解简化映射。
    示例(XML):
    <resultMap id="userMap" type="User"><id id-column="user_id" property="id"/><result column="user_name" property="username"/><collection property="roles" column="user_id"ofType="Role"select="selectRolesByUserId"/>
    </resultMap>
    
  • 动态 SQL 支持:通过 <if><foreach> 等标签动态拼接 SQL,适应复杂查询场景(如多条件筛选),避免硬编码。

在这里插入图片描述

二、元数据管理

元数据(如实体字段描述、关联关系、约束规则)是数据治理的核心资产,ORM 框架通过内置或扩展机制支持元数据的提取与管理。

1. 内置元数据访问
  • Hibernate Metadata API:通过 SessionFactory 获取 Metadata 对象,动态查询实体类、字段、关联关系的元数据(如字段类型、是否可为空、外键目标表)。
    示例:
    Metadata metadata = sessionFactory.getMetadata();
    EntityPersister userPersister = metadata.getEntityPersister(User.class.getName());
    // 获取字段元数据(如 username 是否可为空)
    boolean isUsernameNullable = userPersister.getPropertyNullability()[0];
    
  • Spring Data JPA 审计元数据:通过 AuditingHandler 跟踪实体的创建/修改时间、操作人(@CreatedBy@LastModifiedBy),元数据可用于数据溯源。
2. 元数据扩展与集成
  • 自定义注解 + AOP:通过自定义注解(如 @DataOwner(department="HR") 标记数据归属部门)结合 AOP 扫描实体类,提取元数据并存储到治理平台(如 Apache Atlas)。
    示例:
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface DataOwner {String department();
    }// 在实体中使用
    public class User {@DataOwner(department = "HR")private String employeeId;
    }
    
  • 与 Apache Atlas 集成:通过自定义 MetadataCollector 扫描 JPA 实体或 MyBatis 映射文件,将表结构、字段描述、血缘关系同步到 Atlas 可视化管理。

在这里插入图片描述

三、数据质量保障

ORM 框架通过校验、约束、级联操作等机制保障数据完整性,避免脏数据流入数据库。

1. 声明式数据校验
  • JSR 380(Bean Validation)集成:Spring Boot 自动集成 Hibernate Validator,通过 @NotBlank@Email@Min 等注解在实体字段上定义校验规则,持久化前自动触发校验(结合 @Valid@Validated)。
    示例:
    public class User {@NotBlank(message = "用户名不能为空")@Email(message = "邮箱格式错误")private String email;
    }// Service 中触发校验
    @PostMapping("/users")
    public User createUser(@Valid @RequestBody User user) {return userRepository.save(user); // 校验失败抛 MethodArgumentNotValidException
    }
    
  • 自定义校验器:通过 @ConstraintConstraintValidator 实现复杂业务规则校验(如身份证号格式、手机号归属地)。
2. 数据一致性控制
  • 级联操作(Cascade):通过 @OneToMany(cascade = CascadeType.PERSIST) 定义级联保存/删除,避免因手动操作遗漏导致的数据不一致。
  • 乐观锁(Optimistic Locking):通过 @Version 注解标记版本字段,Hibernate 自动检测并发修改,防止脏写(适合高并发场景)。
    示例:
    @Entity
    public class Product {@Version // 乐观锁版本号private Long version;private Integer stock;
    }
    

在这里插入图片描述

四、数据安全与隐私保护

ORM 框架通过字段过滤、权限控制、加密存储等机制保护敏感数据,满足 GDPR、等保等合规要求。

1. 字段级访问控制
  • Spring Data JPA 投影(Projection):通过接口或类投影限制查询返回的字段,避免敏感信息(如密码、手机号)泄露。
    示例:
    public interface UserProjection {String getUsername(); // 仅返回用户名,隐藏密码等敏感字段
    }public interface UserRepository extends JpaRepository<User, Long> {UserProjection findByUsername(String username);
    }
    
  • Hibernate @Filter:通过动态过滤条件隐藏特定数据(如根据用户角色过滤可见的行)。
    示例:
    Session session = sessionFactory.openSession();
    Filter filter = session.enableFilter("departmentFilter").setParameter("deptId", currentUser.getDeptId());
    List<User> users = session.createQuery("FROM User").list(); // 仅返回当前部门用户
    
2. 敏感数据加密
  • 字段加密存储:通过 Hibernate @Type 自定义类型(如 AES 加密),在持久化时自动加密字段,读取时解密。
    示例:
    @Column
    @Type(type = "com.example.AesEncryptType") // 自定义加密类型
    private String phone;
    
  • MyBatis 插件加密:通过 Interceptor 拦截 SQL 执行,在参数设置或结果集映射时对敏感字段加解密。

在这里插入图片描述

五、审计与溯源

数据治理要求记录数据的变更历史(Who、When、What),ORM 框架通过内置或扩展工具支持审计日志。

1. Spring Data JPA 审计
  • 自动记录变更信息:通过 @CreatedDate@LastModifiedDate 标记时间字段,@CreatedBy@LastModifiedBy 标记操作人,配合 AuditorAware 接口动态获取当前用户。
    示例:
    @EntityListeners(AuditingEntityListener.class)
    public class User {@CreatedDateprivate LocalDateTime createTime;@CreatedByprivate String createdBy;
    }// 配置 AuditorAware 获取当前用户
    @Bean
    public AuditorAware<String> auditorAware() {return () -> Optional.ofNullable(SecurityContextHolder.getContext()).map(SecurityContext::getAuthentication).map(Authentication::getName);
    }
    

在这里插入图片描述

2. Hibernate Envers 深度审计
  • 全量变更记录:Hibernate Envers 是官方审计插件,通过监听 Hibernate 事件,自动将实体变更(增删改)记录到独立的审计表(如 User_AUD),包含修订号、时间戳、修改人、旧值/新值。
    配置:
    # application.properties
    spring.jpa.properties.hibernate.envers.audit_table_suffix=_AUD
    spring.jpa.properties.hibernate.envers.revision_field_name=rev
    spring.jpa.properties.hibernate.envers.revision_type_field_name=revtype
    

六、多租户数据隔离

针对 SaaS 场景,ORM 框架支持通过租户 ID 隔离不同租户的数据,确保数据安全。
在这里插入图片描述

1. Hibernate 多租户策略
  • 共享数据库(推荐):所有租户共享同一数据库,通过租户 ID 字段区分(hibernate.multiTenancy=DISCRIMINATOR),Hibernate 自动在 SQL 中添加 tenant_id = ? 条件。
    配置:
    spring.jpa.properties.hibernate.multiTenancy=DISCRIMINATOR
    spring.jpa.properties.hibernate.tenant_identifier_resolver=com.example.CurrentTenantIdentifierResolver
    spring.jpa.properties.hibernate.multi_tenant_connection_provider=com.example.MultiTenantConnectionProviderImpl
    
2. MyBatis 多租户实现
  • 插件拦截 SQL:通过 Interceptor 拦截所有 SQL 语句,自动添加租户 ID 条件(需配合租户上下文)。
    示例:
    @Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
    })
    public class TenantInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object parameter = invocation.getArgs()[1];Long tenantId = TenantContext.getCurrentTenantId();// 修改 SQL,添加 tenant_id = #{tenantId}return invocation.proceed();}
    }
    

七、事务与一致性保障

ORM 框架与 Spring 事务管理深度集成,通过声明式事务确保 ACID 特性,支持分布式事务扩展。

1. 声明式事务(Spring)
  • @Transactional 注解:通过 Spring AOP 为方法添加事务边界,支持传播行为(Propagation.REQUIRED)、隔离级别(Isolation.READ_COMMITTED)、回滚规则(rollbackFor=Exception.class)。
    示例:
    @Service
    public class OrderService {@Autowiredprivate OrderRepository orderRepo;@Autowiredprivate InventoryRepository inventoryRepo;@Transactional(rollbackFor = Exception.class) // 所有异常回滚public void createOrder(Order order) {orderRepo.save(order); // 保存订单inventoryRepo.decreaseStock(order.getProductId(), order.getCount()); // 扣减库存}
    }
    
2. 分布式事务(Seata 集成)
  • Spring Boot + Seata:针对跨微服务的分布式事务,通过 Seata 的 AT/TCC 模式,ORM 框架配合完成本地事务与全局事务的协调。
    流程:
    1. 全局事务协调器(TC)开启全局事务。
    2. 各微服务执行本地事务(通过 ORM 提交),并向 TC 报告状态。
    3. TC 根据所有分支事务状态决定提交或回滚。

八、扩展与集成能力

Spring Boot 的自动配置和扩展机制允许开发者结合 ORM 框架与其他数据治理工具,构建完整的治理体系。
在这里插入图片描述

1. 与数据库迁移工具集成
  • Flyway/Liquibase:Spring Boot 集成 Flyway 或 Liquibase,通过版本化的 SQL 脚本管理数据库 Schema 变更,确保开发、测试、生产环境的 Schema 一致性(与 ORM 实体定义解耦或对齐)。
2. 与数据治理平台集成
  • Apache Atlas:通过自定义元数据采集器扫描 JPA 实体或 MyBatis 映射文件,将表结构、字段描述、血缘关系同步到 Atlas 进行可视化管理。

在这里插入图片描述

总结

Spring Boot 体系下的 ORM 框架(Hibernate、MyBatis、Spring Data JPA)通过标准化模型定义、元数据管理、数据校验、安全控制、审计日志、多租户隔离、事务协调等核心能力,全面支持数据治理的关键需求。实际应用中,需根据业务场景(如高并发、合规性、灵活性)选择合适的 ORM 框架,并结合 Spring 生态工具(如 Spring Security、Seata、Flyway)扩展治理能力,最终实现数据的全生命周期管理。

http://www.dtcms.com/a/342866.html

相关文章:

  • Ubuntu22.04配置网络上网
  • linux-ubuntu里docker的容器portainer容器建立后如何打开?
  • Maven无法修改镜像,镜像在IDEA里不生效
  • 室外和室内 PoE 延长器有什么区别?
  • [CSP-J2020] 直播获奖
  • 集成学习:从原理到实战,一文掌握 Bagging、Boosting 与 Stacking
  • 集成学习:如何让多个 “弱模型” 变成 “强模型”?
  • demo 汽车之家(渲染-筛选-排序-模块抽离数据)
  • Linux之Ansible自动化运维(二)
  • Linux内核源码详解--缺页异常(Page Fault)处理的核心函数handle_pte_fault
  • Maven(三)
  • Class A 包含字段 x Class B 也包含字段 x,如果判断List<A> lista 和 List<B> listb 有相同的 x?
  • 基于websocket聊天室的基本点
  • SQL中的游标
  • html ajax前端页面
  • 51单片机-驱动直流电机模块教程
  • 单片机\物联网\51单片机\嵌入式开发\软硬件结合的基于STM32的电梯管理系统的设计/基于STM32的电梯运行系统的设计
  • 【华为OD-C卷-020 -关联端口组合并 100分(python、java、c++、js、c)】
  • 解决 uniapp 修改index.html文件不生效的问题
  • PCB文件怎么快速判断是通孔还是盲孔呢?
  • Git 2.15.0 64位安装步骤Windows详细教程从下载到验证(附安装包下载)
  • 14、外部中断
  • 【科普向-第三篇】汽车电子MCU操作系统详解:CP AUTOSAR与FreeRTOS
  • 1688电商商品大数据采集之路 技术篇
  • 嵌入式接口通识知识之PWM接口
  • 机器学习聚类与集成算法全解析:从 K-Means 到随机森林的实战指南
  • 从系统漏洞归零到候诊缩短20%:一个信创样本的效能革命
  • 播放器视频后处理实践(一)
  • 视频加水印 视频加水印软件 视频加动态水印
  • 音视频面试题集锦第 29 期