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

Spring Data 2027 动态查询详解

Spring Data 2027 动态查询详解别叫我大神叫我 Alex 就好Spring Data 2027 带来了强大的动态查询功能让开发者能够更灵活地构建复杂的查询语句。动态查询是一种根据运行时条件构建查询的能力它在处理复杂的业务场景时非常有用。本文将详细介绍 Spring Data 2027 中的动态查询功能及其实践。1. 动态查询概述1.1 什么是动态查询动态查询是指在运行时根据不同的条件动态构建查询语句的过程。与静态查询不同动态查询的条件和结构可以根据用户输入、业务逻辑或其他因素在运行时发生变化。在 Spring Data 中动态查询通常用于以下场景多条件搜索用户可以根据多个条件组合进行搜索复杂过滤根据不同的业务规则进行复杂的过滤动态排序根据用户选择的字段进行排序条件聚合根据不同的条件进行数据聚合1.2 Spring Data 2027 的动态查询支持Spring Data 2027 提供了多种动态查询的实现方式Query By Example (QBE)基于示例对象构建查询Specification使用 JPA Criteria API 构建复杂查询QueryDSL使用类型安全的查询构建器Criteria API直接使用 JPA Criteria API动态 JPQL运行时构建 JPQL 查询2. Query By Example (QBE)2.1 原理Query By Example 是一种简单直观的动态查询方式它允许开发者通过创建一个示例对象来构建查询。Spring Data 会根据示例对象的非空属性生成查询条件。2.2 实践使用 Query By Example 实现动态查询// 实体类 Entity public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; private String name; private String email; private int age; private String department; // getters and setters } // Repository 接口 public interface UserRepository extends JpaRepositoryUser, Long, QueryByExampleExecutorUser { } // 服务层 Service public class UserService { private final UserRepository userRepository; Autowired public UserService(UserRepository userRepository) { this.userRepository userRepository; } public ListUser searchUsers(String name, String email, Integer age, String department) { // 创建示例对象 User user new User(); if (name ! null) { user.setName(name); } if (email ! null) { user.setEmail(email); } if (age ! null) { user.setAge(age); } if (department ! null) { user.setDepartment(department); } // 创建 Example 对象 ExampleUser example Example.of(user); // 执行查询 return userRepository.findAll(example); } public ListUser searchUsersWithMatcher(String name, String email) { // 创建示例对象 User user new User(); if (name ! null) { user.setName(name); } if (email ! null) { user.setEmail(email); } // 创建匹配器 ExampleMatcher matcher ExampleMatcher.matching() .withIgnoreCase() // 忽略大小写 .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING); // 包含匹配 // 创建 Example 对象 ExampleUser example Example.of(user, matcher); // 执行查询 return userRepository.findAll(example); } }3. Specification3.1 原理Specification 是 Spring Data JPA 提供的一种更灵活的动态查询方式它基于 JPA Criteria API 构建查询。通过实现Specification接口开发者可以构建复杂的查询条件。3.2 实践使用 Specification 实现动态查询// Repository 接口 public interface UserRepository extends JpaRepositoryUser, Long, JpaSpecificationExecutorUser { } // Specification 工具类 public class UserSpecifications { public static SpecificationUser hasName(String name) { return (root, query, criteriaBuilder) - { if (name null) { return null; } return criteriaBuilder.like(root.get(name), % name %); }; } public static SpecificationUser hasEmail(String email) { return (root, query, criteriaBuilder) - { if (email null) { return null; } return criteriaBuilder.like(root.get(email), % email %); }; } public static SpecificationUser hasAgeGreaterThan(Integer age) { return (root, query, criteriaBuilder) - { if (age null) { return null; } return criteriaBuilder.greaterThan(root.get(age), age); }; } public static SpecificationUser hasDepartment(String department) { return (root, query, criteriaBuilder) - { if (department null) { return null; } return criteriaBuilder.equal(root.get(department), department); }; } } // 服务层 Service public class UserService { private final UserRepository userRepository; Autowired public UserService(UserRepository userRepository) { this.userRepository userRepository; } public ListUser searchUsers(String name, String email, Integer age, String department) { SpecificationUser spec Specification.where(UserSpecifications.hasName(name)) .and(UserSpecifications.hasEmail(email)) .and(UserSpecifications.hasAgeGreaterThan(age)) .and(UserSpecifications.hasDepartment(department)); return userRepository.findAll(spec); } public ListUser searchUsersWithSorting(String name, String email, String sortBy, Sort.Direction direction) { SpecificationUser spec Specification.where(UserSpecifications.hasName(name)) .and(UserSpecifications.hasEmail(email)); Sort sort Sort.by(direction, sortBy); return userRepository.findAll(spec, sort); } }4. QueryDSL4.1 原理QueryDSL 是一种类型安全的查询构建器它可以生成类型安全的查询代码。Spring Data 2027 对 QueryDSL 提供了很好的支持使得开发者可以更安全、更直观地构建查询。4.2 实践使用 QueryDSL 实现动态查询// 1. 添加依赖 // dependency // groupIdcom.querydsl/groupId // artifactIdquerydsl-jpa/artifactId // version5.0.0/version // /dependency // dependency // groupIdcom.querydsl/groupId // artifactIdquerydsl-apt/artifactId // version5.0.0/version // scopeprovided/scope // /dependency // 2. 生成 Q 类 // 运行 mvn compile 生成 QUser 类 // 3. Repository 接口 public interface UserRepository extends JpaRepositoryUser, Long, QuerydslPredicateExecutorUser { } // 服务层 Service public class UserService { private final UserRepository userRepository; private final QUser qUser QUser.user; Autowired public UserService(UserRepository userRepository) { this.userRepository userRepository; } public ListUser searchUsers(String name, String email, Integer age, String department) { BooleanBuilder builder new BooleanBuilder(); if (name ! null) { builder.and(qUser.name.containsIgnoreCase(name)); } if (email ! null) { builder.and(qUser.email.containsIgnoreCase(email)); } if (age ! null) { builder.and(qUser.age.gt(age)); } if (department ! null) { builder.and(qUser.department.eq(department)); } return userRepository.findAll(builder); } public ListUser searchUsersWithSorting(String name, String email, String sortBy, Direction direction) { BooleanBuilder builder new BooleanBuilder(); if (name ! null) { builder.and(qUser.name.containsIgnoreCase(name)); } if (email ! null) { builder.and(qUser.email.containsIgnoreCase(email)); } // 动态排序 PathBuilderUser pathBuilder new PathBuilder(User.class, user); OrderSpecifier? orderSpecifier; if (direction Direction.ASC) { orderSpecifier pathBuilder.getString(sortBy).asc(); } else { orderSpecifier pathBuilder.getString(sortBy).desc(); } return userRepository.findAll(builder, orderSpecifier); } }5. Criteria API5.1 原理JPA Criteria API 是一种编程式的查询构建方式它允许开发者通过代码构建查询而不是使用字符串形式的 JPQL。Spring Data 2027 支持直接使用 Criteria API 构建动态查询。5.2 实践使用 Criteria API 实现动态查询// 服务层 Service public class UserService { private final EntityManager entityManager; Autowired public UserService(EntityManager entityManager) { this.entityManager entityManager; } public ListUser searchUsers(String name, String email, Integer age, String department) { // 创建 CriteriaBuilder CriteriaBuilder cb entityManager.getCriteriaBuilder(); // 创建 CriteriaQuery CriteriaQueryUser cq cb.createQuery(User.class); // 创建 Root RootUser root cq.from(User.class); // 构建查询条件 ListPredicate predicates new ArrayList(); if (name ! null) { predicates.add(cb.like(root.get(name), % name %)); } if (email ! null) { predicates.add(cb.like(root.get(email), % email %)); } if (age ! null) { predicates.add(cb.greaterThan(root.get(age), age)); } if (department ! null) { predicates.add(cb.equal(root.get(department), department)); } // 添加查询条件 if (!predicates.isEmpty()) { cq.where(cb.and(predicates.toArray(new Predicate[0]))); } // 执行查询 TypedQueryUser query entityManager.createQuery(cq); return query.getResultList(); } public ListUser searchUsersWithSorting(String name, String email, String sortBy, Sort.Direction direction) { // 创建 CriteriaBuilder CriteriaBuilder cb entityManager.getCriteriaBuilder(); // 创建 CriteriaQuery CriteriaQueryUser cq cb.createQuery(User.class); // 创建 Root RootUser root cq.from(User.class); // 构建查询条件 ListPredicate predicates new ArrayList(); if (name ! null) { predicates.add(cb.like(root.get(name), % name %)); } if (email ! null) { predicates.add(cb.like(root.get(email), % email %)); } // 添加查询条件 if (!predicates.isEmpty()) { cq.where(cb.and(predicates.toArray(new Predicate[0]))); } // 添加排序 if (sortBy ! null) { if (direction Sort.Direction.ASC) { cq.orderBy(cb.asc(root.get(sortBy))); } else { cq.orderBy(cb.desc(root.get(sortBy))); } } // 执行查询 TypedQueryUser query entityManager.createQuery(cq); return query.getResultList(); } }6. 动态 JPQL6.1 原理动态 JPQL 是指在运行时根据条件动态构建 JPQL 查询语句。这种方式虽然灵活但需要注意 SQL 注入的风险。6.2 实践使用动态 JPQL 实现动态查询// 服务层 Service public class UserService { private final EntityManager entityManager; Autowired public UserService(EntityManager entityManager) { this.entityManager entityManager; } public ListUser searchUsers(String name, String email, Integer age, String department) { // 构建 JPQL 查询 StringBuilder jpql new StringBuilder(SELECT u FROM User u WHERE 11); ListObject parameters new ArrayList(); int paramIndex 1; if (name ! null) { jpql.append( AND u.name LIKE ?).append(paramIndex); parameters.add(% name %); } if (email ! null) { jpql.append( AND u.email LIKE ?).append(paramIndex); parameters.add(% email %); } if (age ! null) { jpql.append( AND u.age ?).append(paramIndex); parameters.add(age); } if (department ! null) { jpql.append( AND u.department ?).append(paramIndex); parameters.add(department); } // 创建查询 TypedQueryUser query entityManager.createQuery(jpql.toString(), User.class); // 设置参数 for (int i 0; i parameters.size(); i) { query.setParameter(i 1, parameters.get(i)); } // 执行查询 return query.getResultList(); } public ListUser searchUsersWithSorting(String name, String email, String sortBy, Sort.Direction direction) { // 构建 JPQL 查询 StringBuilder jpql new StringBuilder(SELECT u FROM User u WHERE 11); ListObject parameters new ArrayList(); int paramIndex 1; if (name ! null) { jpql.append( AND u.name LIKE ?).append(paramIndex); parameters.add(% name %); } if (email ! null) { jpql.append( AND u.email LIKE ?).append(paramIndex); parameters.add(% email %); } // 添加排序 if (sortBy ! null) { jpql.append( ORDER BY u.).append(sortBy); if (direction Sort.Direction.DESC) { jpql.append( DESC); } else { jpql.append( ASC); } } // 创建查询 TypedQueryUser query entityManager.createQuery(jpql.toString(), User.class); // 设置参数 for (int i 0; i parameters.size(); i) { query.setParameter(i 1, parameters.get(i)); } // 执行查询 return query.getResultList(); } }7. 综合实践7.1 组合使用多种动态查询方式在实际应用中我们可以根据具体场景选择合适的动态查询方式甚至组合使用多种方式Service public class UserService { private final UserRepository userRepository; private final EntityManager entityManager; private final QUser qUser QUser.user; Autowired public UserService(UserRepository userRepository, EntityManager entityManager) { this.userRepository userRepository; this.entityManager entityManager; } // 使用 Query By Example public ListUser searchUsersByExample(String name, String email) { User user new User(); if (name ! null) { user.setName(name); } if (email ! null) { user.setEmail(email); } ExampleMatcher matcher ExampleMatcher.matching() .withIgnoreCase() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING); ExampleUser example Example.of(user, matcher); return userRepository.findAll(example); } // 使用 Specification public ListUser searchUsersBySpecification(String name, Integer age) { SpecificationUser spec Specification.where(UserSpecifications.hasName(name)) .and(UserSpecifications.hasAgeGreaterThan(age)); return userRepository.findAll(spec); } // 使用 QueryDSL public ListUser searchUsersByQueryDSL(String name, String department) { BooleanBuilder builder new BooleanBuilder(); if (name ! null) { builder.and(qUser.name.containsIgnoreCase(name)); } if (department ! null) { builder.and(qUser.department.eq(department)); } return userRepository.findAll(builder); } // 使用 Criteria API public ListUser searchUsersByCriteriaAPI(String email, Integer age) { CriteriaBuilder cb entityManager.getCriteriaBuilder(); CriteriaQueryUser cq cb.createQuery(User.class); RootUser root cq.from(User.class); ListPredicate predicates new ArrayList(); if (email ! null) { predicates.add(cb.like(root.get(email), % email %)); } if (age ! null) { predicates.add(cb.greaterThan(root.get(age), age)); } if (!predicates.isEmpty()) { cq.where(cb.and(predicates.toArray(new Predicate[0]))); } TypedQueryUser query entityManager.createQuery(cq); return query.getResultList(); } }7.2 实际应用场景7.2.1 电商系统在电商系统中动态查询可以用于商品搜索Service public class ProductService { private final ProductRepository productRepository; private final QProduct qProduct QProduct.product; Autowired public ProductService(ProductRepository productRepository) { this.productRepository productRepository; } public ListProduct searchProducts(String name, BigDecimal minPrice, BigDecimal maxPrice, String category, String brand, Sort.Direction direction) { BooleanBuilder builder new BooleanBuilder(); if (name ! null) { builder.and(qProduct.name.containsIgnoreCase(name)); } if (minPrice ! null) { builder.and(qProduct.price.goe(minPrice)); } if (maxPrice ! null) { builder.and(qProduct.price.loe(maxPrice)); } if (category ! null) { builder.and(qProduct.category.eq(category)); } if (brand ! null) { builder.and(qProduct.brand.eq(brand)); } // 排序 OrderSpecifier? orderSpecifier; if (direction Sort.Direction.ASC) { orderSpecifier qProduct.price.asc(); } else { orderSpecifier qProduct.price.desc(); } return productRepository.findAll(builder, orderSpecifier); } }7.2.2 人力资源系统在人力资源系统中动态查询可以用于员工信息查询Service public class EmployeeService { private final EmployeeRepository employeeRepository; Autowired public EmployeeService(EmployeeRepository employeeRepository) { this.employeeRepository employeeRepository; } public ListEmployee searchEmployees(String name, String department, LocalDate startDateFrom, LocalDate startDateTo, Integer minSalary, Integer maxSalary) { SpecificationEmployee spec Specification.where(EmployeeSpecifications.hasName(name)) .and(EmployeeSpecifications.hasDepartment(department)) .and(EmployeeSpecifications.hasStartDateBetween(startDateFrom, startDateTo)) .and(EmployeeSpecifications.hasSalaryBetween(minSalary, maxSalary)); return employeeRepository.findAll(spec); } }8. 性能优化8.1 动态查询性能优化使用索引为经常用于查询的字段创建索引限制结果集使用分页和限制返回的记录数优化查询条件避免使用复杂的查询条件特别是在大型表上使用缓存对于频繁执行的查询结果进行缓存批量操作对于批量查询使用批量操作减少数据库交互8.2 代码示例// 使用分页 public PageUser searchUsersWithPagination(String name, String email, Pageable pageable) { SpecificationUser spec Specification.where(UserSpecifications.hasName(name)) .and(UserSpecifications.hasEmail(email)); return userRepository.findAll(spec, pageable); } // 使用缓存 Cacheable(value users, key #name #email) public ListUser searchUsersWithCache(String name, String email) { ExampleUser example Example.of(new User(name, email)); return userRepository.findAll(example); } // 批量查询 public ListUser batchSearchUsers(ListLong ids) { return userRepository.findAllById(ids); }9. 监控与调试9.1 监控动态查询使用 Spring Boot Actuator 监控动态查询的执行情况RestController RequestMapping(/actuator/queries) public class QueryActuatorController { private final EntityManager entityManager; Autowired public QueryActuatorController(EntityManager entityManager) { this.entityManager entityManager; } GetMapping(/statistics) public MapString, Object getQueryStatistics() { MapString, Object stats new HashMap(); // 获取查询执行统计信息 Session session entityManager.unwrap(Session.class); Statistics statistics session.getSessionFactory().getStatistics(); stats.put(queryCount, statistics.getQueryExecutionCount()); stats.put(queryExecutionTime, statistics.getQueryExecutionTotalTime()); stats.put(entityLoadCount, statistics.getEntityLoadCount()); stats.put(collectionLoadCount, statistics.getCollectionLoadCount()); return stats; } }9.2 调试动态查询调试动态查询的技巧启用 SQL 日志在 application.properties 中设置spring.jpa.show-sqltrue使用 QueryLog使用 Hibernate 的 QueryLog 记录查询执行情况使用断点在查询构建过程中设置断点查看生成的查询语句使用数据库工具使用数据库工具如 MySQL Workbench分析查询执行计划10. 最佳实践10.1 选择合适的动态查询方式场景推荐方式原因简单条件查询Query By Example简单直观代码量少复杂条件查询Specification 或 QueryDSL更灵活支持复杂条件类型安全查询QueryDSL编译时检查避免拼写错误原生 SQL 查询动态 JPQL 或 Criteria API支持复杂的原生 SQL 功能10.2 代码最佳实践// 最佳实践 1使用工厂方法创建查询条件 public class UserQueryBuilder { public static SpecificationUser buildQuery(String name, String email, Integer age, String department) { return Specification.where(hasName(name)) .and(hasEmail(email)) .and(hasAgeGreaterThan(age)) .and(hasDepartment(department)); } private static SpecificationUser hasName(String name) { return (root, query, cb) - name ! null ? cb.like(root.get(name), % name %) : null; } // 其他条件方法... } // 最佳实践 2使用建造者模式构建查询 public class QueryBuilderT { private final ClassT entityClass; private final ListPredicate predicates new ArrayList(); private final CriteriaBuilder cb; private final CriteriaQueryT cq; private final RootT root; public QueryBuilder(EntityManager entityManager, ClassT entityClass) { this.entityClass entityClass; this.cb entityManager.getCriteriaBuilder(); this.cq cb.createQuery(entityClass); this.root cq.from(entityClass); } public QueryBuilderT eq(String field, Object value) { if (value ! null) { predicates.add(cb.equal(root.get(field), value)); } return this; } public QueryBuilderT like(String field, String value) { if (value ! null) { predicates.add(cb.like(root.get(field), % value %)); } return this; } public QueryBuilderT gt(String field, Comparable value) { if (value ! null) { predicates.add(cb.greaterThan(root.get(field), value)); } return this; } public ListT build(EntityManager entityManager) { if (!predicates.isEmpty()) { cq.where(cb.and(predicates.toArray(new Predicate[0]))); } return entityManager.createQuery(cq).getResultList(); } } // 最佳实践 3使用方法引用和 lambda 表达式 public ListUser searchUsers(String name, String email) { return userRepository.findAll((root, query, cb) - { ListPredicate predicates new ArrayList(); if (name ! null) { predicates.add(cb.like(root.get(name), % name %)); } if (email ! null) { predicates.add(cb.like(root.get(email), % email %)); } return predicates.isEmpty() ? null : cb.and(predicates.toArray(new Predicate[0])); }); }这其实可以更优雅一点Spring Data 2027 的动态查询功能让数据查询变得更加优雅代码更简洁使用声明式的方式构建查询类型更安全QueryDSL 提供编译时类型检查灵活性更高支持复杂的查询条件可维护性更好清晰的代码结构和逻辑性能更优优化的查询执行11. 未来发展趋势Spring Data 2027 的动态查询功能正在不断演进更智能的查询构建基于 AI 的智能查询构建更强大的类型安全增强的 QueryDSL 功能更高效的查询执行优化的查询执行计划更丰富的查询功能支持更多的查询类型和操作更集成的生态系统与其他 Spring 生态系统组件的深度集成12. 总结Spring Data 2027 的动态查询功能是构建灵活、高效数据访问层的关键。通过合理选择和使用 Query By Example、Specification、QueryDSL、Criteria API 和动态 JPQL 等方式我们可以构建复杂的查询条件满足各种业务场景的需求提高代码的可维护性清晰的代码结构和逻辑增强系统的性能优化的查询执行减少开发工作量简化查询构建的过程记住选择合适的动态查询方式取决于具体的业务场景和需求。在实际应用中我们应该根据查询的复杂度、性能要求和代码可维护性等因素选择最适合的动态查询方式。

相关文章:

Spring Data 2027 动态查询详解

Spring Data 2027 动态查询详解 别叫我大神,叫我 Alex 就好 Spring Data 2027 带来了强大的动态查询功能,让开发者能够更灵活地构建复杂的查询语句。动态查询是一种根据运行时条件构建查询的能力,它在处理复杂的业务场景时非常有用。本文将详…...

DreamCAD:多模态参数化CAD生成框架解析

1. DreamCAD框架概述DreamCAD是一个革命性的多模态参数化CAD生成框架,它从根本上改变了传统CAD设计流程。这个系统最核心的创新点在于实现了从非结构化输入(点云、图像、文本)到可编辑CAD模型的端到端转换。传统CAD设计需要工程师手动创建控制…...

2026 最新 ReAct 框架详解!搞懂 AI Agent 核心底层原理,小白也能学明白

2026 年 AI 大模型高速迭代,AI Agent 已经成为当下程序员转行、技术进阶的核心风口。而想要吃透 Agent 开发、玩转智能体落地应用,ReAct 框架是必须掌握的底层核心知识点。 本文深度拆解 ReAct 运行逻辑,结合 2026 年全新一代大模型特性&…...

抖音批量下载完整指南:快速掌握高效下载技巧

抖音批量下载完整指南:快速掌握高效下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…...

数据科学代理评估与DSAEval基准测试实践

1. 数据科学代理的现状与评估挑战数据科学代理(Data Science Agents)正在重塑传统数据分析的工作范式。这类基于大型语言模型(LLMs)的自动化工具,能够执行从数据清洗到模型训练的全流程任务。2025年的行业实践表明&…...

WeChatMsg:3步永久保存微信聊天记录,打造你的个人AI记忆库

WeChatMsg:3步永久保存微信聊天记录,打造你的个人AI记忆库 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tr…...

AI数据代理:企业数据分析的革新与挑战

1. AI数据代理:企业数据分析的新范式 在当今数据驱动的商业环境中,企业面临着前所未有的数据管理挑战。根据行业调研,72%的组织数据分散在多个孤立的系统中,82%的企业表示这种碎片化严重影响了关键业务流程的决策效率。传统的数据…...

农业AI评估框架Garden V1:精准农业的模型性能测试

1. 项目概述:IFAD AI Benchmark (Garden V1) 的定位与价值IFAD AI Benchmark (Garden V1) 是一个面向农业智能化场景的AI模型性能评估框架。这个项目最初源于我们在精准农业项目中遇到的实际需求——当我们需要比较不同计算机视觉模型在农作物生长监测任务中的表现时…...

XUnity自动翻译器:Unity游戏汉化终极解决方案

XUnity自动翻译器:Unity游戏汉化终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语Unity游戏中的生涩文本而烦恼吗?XUnity.AutoTranslator是一个功能强大的开…...

LM Evaluation Harness:语言模型评估的标准化实践

1. 项目背景与核心价值在语言模型(LM)评估领域,基准测试(benchmarks)的整合一直是个既基础又关键的课题。去年我在为团队选型评估框架时,发现大多数开源方案都存在"评估孤岛"问题——每个benchmark就像一座数据孤岛,需要单独准备数…...

Stich接入Codex教程

Stich接入Codex教程 大家好,我是彪哥。 今天这期视频教大家,如何通过MCP协议将stich接入code X。 1.打开stich 打开stich,点击mcp点击设置mcp选择codex点击复制,复制到别的地方,大概是这样的 [mcp_servers.stitch] url “https:/…...

Python海龟绘图之画笔属性

在海龟绘图中,可以通过pensize()、pencolor()等函数设置画笔的粗细和颜色等属性。但是,以上提到的函数一次只能设置画笔的一个属性。可以通过pen()函数批量获取和设置海龟的多个属性。1 海龟属性的获取通过图1所示的代码获取海龟画笔的属性。图1 获取海龟…...

Google账号登录无标题-配置文件1

重启电脑之后发现需要谷歌登录的poner和chatGPT都是Google一直转圈圈,科学上网是没问题的,不然都不会到这一步 有搜到可能是DNS修改出现的问题,也贴上帖主解决问题的过程,不过我的问题不在这里(99 封私信 / 8 条消息) 谷歌账号登…...

5个技巧掌握After Effects动画导出:Bodymovin插件完全指南

5个技巧掌握After Effects动画导出:Bodymovin插件完全指南 【免费下载链接】bodymovin-extension Bodymovin UI extension panel 项目地址: https://gitcode.com/gh_mirrors/bod/bodymovin-extension 作为一名动画设计师或前端开发者,你是否曾为A…...

明日方舟游戏素材完整开源资源库:8000+高清美术资源一键获取指南

明日方舟游戏素材完整开源资源库:8000高清美术资源一键获取指南 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 还在为寻找明日方舟高质量游戏素材而烦恼吗?&am…...

告别离线分析!用Wireshark+Lua脚本实时解析航天测控PDXP数据包(附插件开发实战)

航天测控PDXP协议实时解析实战:WiresharkLua插件开发指南 航天测控系统的稳定运行离不开高效的数据传输协议,而PDXP(Packet Data Exchange Protocol)作为现代航天测控网络的核心协议,承载着各类关键任务数据的实时交换…...

Mermaid.js饼图与柱状图:告别数据可视化困扰的3步解决方案

Mermaid.js饼图与柱状图:告别数据可视化困扰的3步解决方案 【免费下载链接】mermaid Generation of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid …...

《等保2.0系列(三):定级方法与第二级详解——从“影响一群人”到“S和A”》

在上一章中我们了解了等保2.0第一级别的划分详情,在这篇文章中我们来了解一下等保2.0的划分条件和详情。等保2.0中对于第二级别的定级原则是会对公民、法人和其他组织的合法权益造成严重损害或特别严重损害;或者对社会秩序和公共利益造成危害&#xff0c…...

在Windows上用MSYS2编译旧版FFmpeg,遇到`shr`汇编错误?手把手教你改两行代码搞定

在Windows上用MSYS2编译旧版FFmpeg的shr汇编错误解决方案 当你在Windows平台上使用MSYS2环境编译较老版本的FFmpeg时,可能会遇到一个令人困惑的汇编错误:"Error: operand type mismatch for shr"。这个问题通常出现在使用新版本的GCC工具链&am…...

【AI面试临阵磨枪-27】CoT、ToT、Plan-and-Solve、Plan-and-Execute 分别是什么?适用场景?

一、面试题目请你分别说明 CoT、ToT、Plan-and-Solve、Plan-and-Execute 四种大模型推理范式的核心定义,并对比各自的适用业务场景。二、知识储备1. CoT(Chain-of-Thought 思维链)核心定义最简单的线性推理范式,引导模型不直接给出…...

Spring Batch 中的异步处理与多线程策略

在使用Spring Batch进行大规模数据处理时,性能优化是一个关键问题。特别是当我们面对大量数据需要处理时,如何有效利用系统资源来提高批处理速度变得尤为重要。本文将深入探讨Spring Batch中的异步处理和多线程策略,通过实例说明如何在实际项目中应用这些技术。 异步处理的…...

周菜单生成器:基于规则引擎与约束优化的自动化饮食规划方案

1. 项目概述:从“今天吃什么”到自动化周菜单生成“今天吃什么?”这个问题,大概是每个需要自己动手解决三餐的人,每周都要面对的灵魂拷问。无论是为了健康饮食、控制预算,还是单纯想摆脱“外卖选择困难症”&#xff0c…...

架构解析:用C实现Nintendo Switch模拟器的完整技术路径

架构解析:用C#实现Nintendo Switch模拟器的完整技术路径 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一个使用C#编写的开源Nintendo Switch模拟器,…...

AI生成代码检测:方法与工程实践

1. 项目概述"Detecting Machine-Generated Code: Unveiling Patterns in AI-Generated Programming"这个项目直指当前软件开发领域最前沿的挑战之一——如何识别AI生成的代码。作为一名长期关注代码质量与工程实践的开发者,我亲眼见证了AI编程助手从简单的…...

【2026最新版】小白程序员必看!AI Agent从入门到实战全解析(建议收藏)

对于刚入门大模型的小白,或是想拓展技术边界、抢占职场先机的程序员来说,AI Agent绝对是2026年最值得重点深耕的核心方向——它彻底打破了传统大模型“只输出、不落地”的局限,真正实现了“思考决策执行”一体化,堪称未来职场最具…...

平面设计史:从印刷术到数字时代的视觉传达演变

1. 视觉传达的千年演化史当我在设计学院第一次翻开厚重的《平面设计史》教材时,被那些泛黄的老海报震撼得说不出话——原来今天我们认为理所当然的排版规则、色彩搭配甚至字体选择,都是无数先驱者用几十年时间摸索出的智慧结晶。从洞穴壁画到数字界面&am…...

答辩前知网AI率超标:比话降AI快速处理实测降幅2026

答辩前知网AI率超标:比话降AI快速处理实测降幅2026 答辩前一天,导师群里转发学校的最终送检结果——同学的稿件知网 AIGC 64.2%,要求 20% 以内,差着 44 个百分点。第二天上午十点就要答辩,现在是晚上九点。这种情况下&…...

投票小程序怎么做?支持礼物投票+视频投票,多用户开账号

温馨提示:文末有资源获取方式最近很多朋友在问投票小程序怎么搭建,尤其是想要支持礼物打赏、视频投票这类功能。我整理了一套比较实用的方案,分享给大家。源码获取方式在软媒源码阁。一、功能需求清单礼物投票:用户可购买虚拟礼物…...

基于深度学习残差网络的复杂工业过程故障识别【附源码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)多维度特征融合与深度重构残差的故障检测方法&…...

比话降AI知网实测:AI率从84.9%降到1.4%全程数据2026

比话降AI知网实测:AI率从84.9%降到1.4%全程数据2026 答辩前 36 小时,朋友的硕士论文知网 AIGC 跑出 84.9%,几乎是"全文标红"的级别。这种分数靠人工改根本来不及,最后用比话降AI 跑了一次完整流程,结果回到 …...