MyBatis多表查询实战:从一对一、一对多到多对多关系映射详解
1. 项目概述从单表到多表的跨越如果你用过Mybatis那对单表的增删改查肯定不陌生。但项目做到后面总会遇到一个绕不开的坎怎么优雅地把几张表的数据关联起来查比如查一个订单要带上用户信息查一个部门要列出所有员工。这就是多表查询的典型场景。很多朋友一开始会用多个查询拼凑或者干脆在业务层写一堆循环结果代码又臭又长性能还上不去。其实Mybatis早就为我们准备好了“关系映射”这个利器专门用来处理一对一、一对多、多对多这些复杂关系。今天我就结合自己踩过的坑和总结的经验把Mybatis多表查询的几种核心玩法从配置到原理再到实战避坑给你一次性讲透。无论你是刚接触Mybatis的新手还是想深化理解的老鸟这篇内容都能让你对“如何用Mybatis处理数据关系”有一个系统性的掌握。2. 核心关系模型与设计思路拆解在动手写代码之前我们必须先搞清楚数据库里几种基本的关系模型以及Mybatis是如何看待和映射这些关系的。这决定了我们后续的实体类设计和Mapper配置。2.1 三种核心关系模型解析数据库表之间的关系本质上可以归纳为三种一对一、一对多、多对多。理解它们的业务含义是正确映射的前提。一对一One-to-One 指A表中的一条记录在B表中有且仅有一条记录与之对应反之亦然。这种关系在业务中不算最常见但有其特定场景。一个典型的例子是用户表和用户详情表。出于性能或设计规范考虑我们可能把核心登录信息用户名、密码放在user表而把个人资料头像、简介、联系方式放在user_profile表。一个用户对应一份详情一份详情也只属于一个用户。在Mybatis中处理这种关系通常有两种思路一是使用association标签进行嵌套结果映射或嵌套查询二是干脆在查询时使用JOIN将两张表的结果合并到一个更复杂的实体对象中。选择哪种取决于你对性能、清晰度和复用性的权衡。一对多One-to-Many 这是业务开发中最常见的关系。指A表中的一条记录在B表中可以对应多条记录但B表中的一条记录只属于A表中的一条记录。经典的例子是部门与员工。一个部门如“研发部”下可以有多个员工但一个员工在某一时刻通常只属于一个部门。在Java对象层面这体现为“一”的一方如Department类会包含一个“多”的集合属性如ListEmployee employees。Mybatis通过collection标签来映射这种集合关系。这里有个关键点当查询一个部门及其所有员工时如果使用简单的JOIN会导致“一对多”连接产生数据冗余部门信息被重复多次Mybatis的嵌套结果映射能很好地解决这个问题将重复的“一”的数据合并。多对多Many-to-Many 指A表的一条记录可以关联B表的多条记录同时B表的一条记录也可以关联A表的多条记录。这种关系无法直接在两张表间通过外键实现必须借助一个中间表关联表。学生选课是教科书级的例子一个学生可以选择多门课程一门课程也可以被多个学生选择。数据库设计上会有student表、course表以及student_course中间表至少包含student_id和course_id两个外键。在Mybatis中处理多对多本质上需要拆解成两个“一对多”来看待。比如从学生角度可以认为学生与选课记录中间表是一对多而每条选课记录与课程又是一对一通过课程ID关联。因此我们会在Student实体中定义一个ListCourse courses集合并通过collection标签进行多层嵌套映射来实现。2.2 Mybatis关系映射的核心思想ResultMapMybatis不像JPA那样在实体类上用注解声明关系它的核心映射配置都在XML的resultMap标签里。resultMap的强大之处在于它能将一条复杂的、可能来自多表JOIN的SQL查询结果按照你定义的规则组装成一个嵌套的对象树。这里最重要的两个子标签就是association和collection。association 用于映射“有一个”的单一对象属性对应一对一或“多对一”关系中的“一”。例如订单对象里有一个用户对象属性。collection 用于映射“有一个集合”的属性对应一对多或多对多关系中的“多”。例如用户对象里有一个订单列表属性。理解这个思想至关重要Mybatis的映射是“结果集”到“对象树”的映射而不是主动的关联查询。它默认不帮你做额外的查询除非你配置成嵌套查询模式而是期望你通过一条SQL把所需数据都查出来然后它来帮你完成“装配”工作。这种设计给了开发者极大的灵活性但也要求我们对SQL和结果集结构有清晰的认识。3. 一对一关系映射实战让我们从一个具体的“订单-用户”例子开始。假设有order表和user表一个订单属于一个用户。3.1 实体类设计首先设计实体类。在订单类中我们直接引用用户对象。// 订单实体 public class Order { private Long id; private String orderNo; private BigDecimal amount; // 一对一关系一个订单对应一个用户 private User user; // ... getters and setters } // 用户实体 public class User { private Long id; private String username; private String email; // ... getters and setters }3.2 Mapper XML 配置嵌套结果映射推荐这是最常用、性能也通常最好的方式。我们写一条LEFT JOIN的SQL一次性获取订单和用户的所有字段然后在resultMap中定义如何装配。!-- OrderMapper.xml -- resultMap idOrderWithUserResultMap typeOrder !-- 先映射Order自身的字段 -- id propertyid columnorder_id/ result propertyorderNo columnorder_no/ result propertyamount columnamount/ !-- 使用 association 映射 user 属性 -- !-- property: Order类中的属性名javaType: 该属性的Java类型 -- association propertyuser javaTypeUser !-- 在 association 内部映射 User 的字段 -- !-- 注意column 前缀是为了避免和Order字段名冲突这里用了别名 -- id propertyid columnuser_id/ result propertyusername columnusername/ result propertyemail columnemail/ /association /resultMap select idselectOrderWithUser resultMapOrderWithUserResultMap SELECT o.id as order_id, o.order_no, o.amount, u.id as user_id, u.username, u.email FROM order o LEFT JOIN user u ON o.user_id u.id WHERE o.id #{id} /select关键点与避坑指南列别名Alias是必须的当多表JOIN时不同表可能有相同名称的列如id。在SQL中必须使用别名o.id as order_id,u.id as user_id来区分否则在映射时会发生覆盖导致数据错乱。id标签的重要性在resultMap和association内部都应该使用id标签来标记主键字段。这能帮助Mybatis识别对象身份在嵌套集合映射时用于合并重复数据提升性能。javaType通常可省略Mybatis通常能自动推断出javaType但显式写明可以让配置更清晰尤其在复杂映射中。3.3 另一种方式嵌套查询Nested Select这种方式会执行两条SQL先查订单再根据订单中的用户ID去查用户。在association中使用select属性指定另一个Mapper方法的全限定名。resultMap idOrderWithUserNestedResultMap typeOrder id propertyid columnid/ result propertyorderNo columnorder_no/ result propertyamount columnamount/ !-- columnuser_id 是将当前结果集中的user_id值传递给select指定的查询方法作为参数 -- association propertyuser columnuser_id selectcom.example.mapper.UserMapper.selectById/ /resultMap select idselectOrderWithUserNested resultMapOrderWithUserNestedResultMap SELECT id, order_no, amount, user_id FROM order WHERE id #{id} /select什么情况下用嵌套查询延迟加载懒加载这是嵌套查询最大的优势。只有当代码真正访问order.getUser()时第二条查询才会执行。这在某些场景下可以节省不必要的数据库开销。需要在Mybatis全局配置中开启lazyLoadingEnabled。查询逻辑复用如果UserMapper.selectById这个方法在其他地方已经被定义和充分复用那么这里直接引用它避免了重复编写JOINSQL。缺点容易引发“N1查询问题”。如果你查询一个订单列表N条每条订单都关联用户那么就会产生1查订单 N查N个用户条SQL对数据库压力巨大。在列表查询中务必谨慎使用嵌套查询优先考虑嵌套结果映射单条SQL JOIN。4. 一对多关系映射实战现在我们看更常见的“部门-员工”例子。一个部门有多个员工。4.1 实体类设计在“一”的一方部门持有“多”的集合。// 部门实体 public class Department { private Long id; private String name; // 一对多关系一个部门有多个员工 private ListEmployee employees; // ... getters and setters } // 员工实体 public class Employee { private Long id; private String empName; private String title; private Long deptId; // 外键字段在映射中可能用到 // ... getters and setters }4.2 Mapper XML 配置处理结果集重复这是核心难点。当我们使用SELECT d.*, e.* FROM department d LEFT JOIN employee e ON d.id e.dept_id查询一个部门及其所有员工时如果该部门有3个员工查询结果会是3条记录每条记录都包含相同的部门信息id, name和不同的员工信息。Mybatis的collection标签配合正确的id声明可以智能地合并这些重复的部门数据将其组装成一个Department对象其内部的employees列表则包含3个Employee对象。!-- DepartmentMapper.xml -- resultMap idDepartmentWithEmployeesResultMap typeDepartment !-- 映射部门自身字段id标签至关重要 -- id propertyid columndept_id/ result propertyname columndept_name/ !-- 使用 collection 映射 employees 集合 -- !-- ofType: 指定集合中元素的Java类型 -- collection propertyemployees ofTypeEmployee !-- 映射员工字段 -- id propertyid columnemp_id/ result propertyempName columnemp_name/ result propertytitle columntitle/ !-- 注意这里通常不需要再映射 dept_id除非实体类里需要 -- /collection /resultMap select idselectDeptWithEmployees resultMapDepartmentWithEmployeesResultMap SELECT d.id as dept_id, d.name as dept_name, e.id as emp_id, e.emp_name, e.title FROM department d LEFT JOIN employee e ON d.id e.dept_id WHERE d.id #{id} /select实操心得id是合并数据的钥匙Mybatis通过resultMap顶层的id此处是dept_id来识别哪些行属于同一个部门对象。如果省略idMybatis会认为每一行都是一个新部门从而创建多个重复的Department对象每个对象内部只有一个员工。这是新手最容易出错的地方之一。列别名避免歧义和一对一一样必须为所有可能冲突的列名尤其是id设置清晰的别名。性能考量虽然一条JOINSQL解决了问题但当关联数据量极大时比如一个部门有上万个员工结果集会非常庞大存在内存和网络传输压力。对于这种极端情况可以考虑分页查询员工或者使用嵌套查询懒加载但需要精细控制以避免N1问题。4.3 嵌套查询在一对多中的应用同样一对多也可以使用嵌套查询通过collection的select属性实现。resultMap idDepartmentWithEmployeesNestedResultMap typeDepartment id propertyid columnid/ result propertyname columnname/ !-- 将当前部门的id传递给selectEmployeeByDeptId方法 -- collection propertyemployees columnid selectcom.example.mapper.EmployeeMapper.selectByDeptId/ /resultMap select idselectDeptWithEmployeesNested resultMapDepartmentWithEmployeesNestedResultMap SELECT id, name FROM department WHERE id #{id} /select使用场景与警告嵌套查询在一对多中引发N1问题的风险比一对一更大。因为查询一个部门列表M个每个部门再查一次员工就会产生1 M条SQL。除非你确信这是小数据量且需要懒加载否则在列表查询中应坚决避免这种写法。对于单个对象的详细查询可以根据复杂度权衡使用。5. 多对多关系映射实战我们以“学生-选课-课程”这个经典模型为例。多对多需要中间表student_course。5.1 实体类与数据库设计CREATE TABLE student ( id BIGINT PRIMARY KEY, name VARCHAR(100) ); CREATE TABLE course ( id BIGINT PRIMARY KEY, course_name VARCHAR(100) ); CREATE TABLE student_course ( student_id BIGINT, course_id BIGINT, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id) );实体类设计上我们在学生类中直接包含课程集合忽略中间表的实体化除非中间表有额外业务属性如选课时间、成绩。// 学生实体 public class Student { private Long id; private String name; // 多对多关系学生选修的课程集合 private ListCourse courses; // ... getters and setters } // 课程实体 public class Course { private Long id; private String courseName; // ... getters and setters }5.2 Mapper XML 配置双层关联映射多对多的映射可以看作是通过中间表连接的两个一对多。我们需要在SQL中JOIN三张表。!-- StudentMapper.xml -- resultMap idStudentWithCoursesResultMap typeStudent id propertyid columnstudent_id/ result propertyname columnstudent_name/ !-- 映射课程集合 -- collection propertycourses ofTypeCourse !-- 注意这里映射的是Course对象的字段 -- id propertyid columncourse_id/ result propertycourseName columncourse_name/ /collection /resultMap select idselectStudentWithCourses resultMapStudentWithCoursesResultMap SELECT s.id as student_id, s.name as student_name, c.id as course_id, c.course_name FROM student s LEFT JOIN student_course sc ON s.id sc.student_id LEFT JOIN course c ON sc.course_id c.id WHERE s.id #{id} /select配置解析与技巧SQL思路查询的起点是学生表s通过中间表sc关联到课程表c。这是一条标准的双LEFT JOIN语句。映射逻辑Mybatis的collection标签会处理结果集的重复。因为一个学生选多门课结果集会返回多行每行学生信息相同课程信息不同。通过顶层的id propertyid columnstudent_id/Mybatis能识别出这些行属于同一个学生对象并将其课程信息收集到ListCourse中。中间表字段处理在这个映射中我们完全不需要关心中间表student_course的具体字段如student_id,course_id它们仅在SQL的ON子句中起作用。这是一种简洁的映射方式。如果你的业务需要中间表的额外属性比如score成绩那么你就需要创建一个StudentCourse中间实体并将多对多拆解为两个明确的一对多关系Student一对多StudentCourseStudentCourse多对一Course来映射。5.3 逆向查询查询课程及其选课学生多对多是双向的。同样我们也可以轻松查询一门课程有哪些学生选修。!-- CourseMapper.xml -- resultMap idCourseWithStudentsResultMap typeCourse id propertyid columncourse_id/ result propertycourseName columncourse_name/ collection propertystudents ofTypeStudent !-- 假设Course类里加了ListStudent students属性 -- id propertyid columnstudent_id/ result propertyname columnstudent_name/ /collection /resultMapSQL语句与之前类似只是FROM的主表换成了course。6. 高级技巧与性能优化掌握了基本映射后一些高级技巧和优化手段能让你的应用更健壮、高效。6.1 延迟加载懒加载的配置与陷阱延迟加载是嵌套查询模式的灵魂。在Mybatis全局配置mybatis-config.xml或Spring Boot配置项中开启settings !-- 开启延迟加载 -- setting namelazyLoadingEnabled valuetrue/ !-- 将积极加载改为按需加载3.4.1版本后默认是false按需加载 -- setting nameaggressiveLazyLoading valuefalse/ /settings开启后只有当程序真正访问关联对象如调用order.getUser().getName()时Mybatis才会执行嵌套的SQL去加载用户数据。踩坑实录序列化问题延迟加载对象通常被包装为代理对象。如果你将包含懒加载属性的实体对象直接进行JSON序列化如通过Spring MVC返回给前端序列化工具如Jackson在遍历对象属性时会触发懒加载可能导致预期之外的数据库查询甚至循环引用导致栈溢出。解决方案使用专门的DTOData Transfer Object来返回数据或者在查询时就使用嵌套结果映射一次性加载所需数据。Session生命周期懒加载查询必须在同一个SqlSession生命周期内执行。在Web应用中通常通过“Open Session in View”模式或将Session生命周期与请求绑定来解决。但在异步编程或手动管理Session时容易出现在Session关闭后触发懒加载导致报错。6.2 使用resultMap的继承与复用当多个查询返回相似的对象结构时可以使用resultMap的extends属性来继承和复用避免重复配置。resultMap idBaseOrderResultMap typeOrder id propertyid columnid/ result propertyorderNo columnorder_no/ result propertyamount columnamount/ /resultMap !-- 继承BaseOrderResultMap并添加关联映射 -- resultMap idOrderWithUserResultMap extendsBaseOrderResultMap typeOrder association propertyuser resultMapcom.example.mapper.UserMapper.BaseUserResultMap/ !-- 或者直接内联配置 -- /resultMap这样BaseOrderResultMap可以用于简单的订单查询而OrderWithUserResultMap在其基础上增加了用户关联维护起来更清晰。6.3 分页查询下的关联映射陷阱在使用分页插件如PageHelper进行分页时如果查询语句包含collection映射一对多分页查询的总数可能会出错。问题根源分页插件会在你的SQL外面自动包裹一层COUNT(*)子查询来计算总数。当SQL是JOIN一对多时一个主表记录会对应多条从表记录这会导致COUNT(*)的结果是连接后的行数而不是主表记录的唯一数量。例如一个部门有5个员工COUNT(*)结果是5但你实际想分页的是部门应该为1。解决方案使用子查询将主表的分页查询和关联查询分开。先分页查询出主表ID再根据ID列表去关联查询详细信息。-- 第一步分页查询部门ID SELECT id FROM department LIMIT 0, 10; -- 第二步根据ID列表查询部门及员工 SELECT d.*, e.* FROM department d LEFT JOIN employee e ON d.id e.dept_id WHERE d.id IN (1, 2, 3...);使用分页插件的count查询优化一些分页插件允许你单独指定一个用于计算总数的查询。你可以将COUNT查询重写为对主表的COUNT(DISTINCT id)。在业务层做分页对于数据量不是特别大的情况可以一次性查询所有关联数据到内存中在业务层Java代码进行手动分页。但这只适用于小数据量场景。7. 常见问题排查与调试技巧在实际开发中你肯定会遇到各种映射失败、数据不对的问题。这里分享几个实用的排查技巧。7.1 问题排查清单问题现象可能原因排查步骤与解决方案关联对象为null1. SQL查询结果中缺少关联表的数据列。2.association或collection的property名称写错。3. 列别名与result中的column不匹配。4. 嵌套查询模式下column传递的参数名错误或类型不匹配。1. 打印或调试查看Mybatis实际执行的SQL和返回的结果集确认关联字段是否被正确查询出来。2. 检查实体类属性名与resultMap中的property是否完全一致大小写敏感。3. 核对SQL中的别名与resultMap中的column值。4. 对于嵌套查询检查column指定的字段是否存在于父查询的结果中且能作为参数传递给子查询。一对多映射结果重复多个主对象主对象的id标签未配置或配置错误。确保在resultMap的顶层为主对象正确配置了id标签并且其column值在SQL结果集中是唯一的通常是主表的主键。延迟加载不生效1. 全局配置lazyLoadingEnabled未开启。2. 在同一个方法内访问了关联对象如打印日志触发了加载。3. 使用了eager加载的注解或配置。1. 确认Mybatis配置文件中lazyLoadingEnabledtrue。2. 检查代码确保在事务/会话关闭前没有无意中调用getter方法。3. 检查是否在局部映射中通过fetchTypeeager覆盖了全局懒加载设置。分页总数不正确在一对多JOIN查询上直接使用分页导致COUNT统计了连接后的行数。参考6.3节采用子查询分页或优化COUNT语句。性能极差N1问题在列表查询中使用了嵌套查询select属性。立即重构将嵌套查询改为嵌套结果映射单条JOINSQL。对于无法用一条JOIN解决的复杂查询考虑使用批量查询如WHERE id IN (...)来替代循环单条查询。7.2 调试利器打印Mybatis执行SQL与参数在application.yml或配置文件中开启Mybatis的日志输出是调试映射问题最直接的方法。# Spring Boot 配置示例 logging: level: com.example.mapper: debug # 将你的Mapper接口包路径设置为debug级别这样控制台会打印出每条SQL的执行语句、参数和结果集概要。通过对比实际SQL结果和你的resultMap配置能快速定位是SQL写错了还是映射配错了。7.3 复杂映射的编写建议对于涉及多层级、多种关联的复杂映射不要试图在一个巨大的resultMap和一条复杂的SQL中解决所有问题。这会导致SQL难以维护性能也难以优化。我的经验是分解查询将一次复杂的查询分解为多次简单的查询在服务层进行组装。虽然可能增加数据库往返次数但代码清晰度和可维护性会大幅提升也更容易利用缓存。使用DTO/VO不要强求用一个庞大的实体类对应所有查询场景。为不同的接口或业务场景创建专用的Data Transfer Object或View Object。查询时直接映射到简单的DTO比映射到带有复杂关联的实体再转换要高效、清晰得多。善用MyBatis-Plus等增强工具对于单表操作MyBatis-Plus能极大提升效率。但对于复杂关联查询它提供的TableField注解等能力有限核心的resultMap映射仍然需要你亲手编写和理解。不要试图用工具完全避开对Mybatis核心概念的学习。

相关新闻

C#集成Bartender实现自动化标签打印:从原理到实战避坑指南

C#集成Bartender实现自动化标签打印:从原理到实战避坑指南

1. 项目概述:为什么选择C#与Bartender进行打印开发? 如果你正在开发一个需要与硬件打交道的上位机系统,比如仓库管理、生产线工位机或者资产标签管理,那么“打印”这个功能大概率是你绕不开的一个坎。尤其是涉及到条码、二维码、R…

2026/8/1 6:19:06 阅读更多 →
图论算法:拓扑排序与最短路径实战指南

图论算法:拓扑排序与最短路径实战指南

1. 图论算法核心概念与应用场景图论作为计算机科学中最重要的数学基础之一,广泛应用于路径规划、任务调度、网络分析等领域。在实际工程中,掌握几种核心图算法往往能解决80%以上的相关问题。本文将重点解析拓扑排序的原理实现,并给出四大经典…

2026/8/1 6:19:06 阅读更多 →
PDF 文档翻译的工程化挑战:从 PDF 解析、版面还原到 LLM 翻译的完整技术链路

PDF 文档翻译的工程化挑战:从 PDF 解析、版面还原到 LLM 翻译的完整技术链路

引子:为什么 PDF 翻译比想象难十倍 去年我接手一个文档翻译平台的重构项目,原以为"上传 PDF → 调用 GPT → 输出 PDF"就完事了。真正动手才发现,PDF 翻译是一个横跨文档解析、OCR、神经翻译、版面重建四大领域的系统工程。单个 P…

2026/8/1 6:19:06 阅读更多 →

最新新闻

网口与串口本质差异解析:从物理层到协议栈的嵌入式通信选型指南

网口与串口本质差异解析:从物理层到协议栈的嵌入式通信选型指南

1. 从物理接口到数据通道:网口与串口的本质差异聊到嵌入式开发、工业控制或者网络调试,网口和串口是两个绕不开的物理接口。很多刚入行的朋友,甚至一些有经验的工程师,在项目选型或者问题排查时,对这两者的理解可能还停…

2026/8/1 7:03:28 阅读更多 →
C++引用与临时对象:深入理解生命周期延长与性能优化

C++引用与临时对象:深入理解生命周期延长与性能优化

1. 项目概述:为什么我们还要深挖C引用?干了这么多年C,引用(Reference)这个语法糖,大家肯定都用得滚瓜烂熟了。不就是给变量起个别名嘛,初始化后不能改绑,用起来像指针但更安全。这几…

2026/8/1 7:03:28 阅读更多 →
电感核心公式解析:从V=L*(di/dt)到工程选型实战

电感核心公式解析:从V=L*(di/dt)到工程选型实战

1. 从“电感”到“电感公式”:一个被误解的起点在电子工程和电路设计的日常工作中,“电感”这个词几乎每天都会出现。无论是调试一个开关电源,还是分析一个射频电路的稳定性,我们总离不开它。然而,我发现一个有趣的现象…

2026/8/1 7:03:28 阅读更多 →
fastjson 1245-jdk8u342 yakit测试

fastjson 1245-jdk8u342 yakit测试

JDK8u191以后的JNDI就没那么轮椅了,得吃点操作 这周挺忙的,也是闲下来了打一打靶场 0x00 信息收集 重复操作就不一一列举了,看我往期文章。检查不在黑名单的类,858个 探测fastjson版本,1.2.45 探测能否出网&#x…

2026/8/1 7:03:28 阅读更多 →
运维转型网安的五大核心技能与职业发展路径

运维转型网安的五大核心技能与职业发展路径

1. 运维工程师转型网安的核心优势分析作为在IT基础设施领域摸爬滚打多年的运维老兵,转型网络安全领域有着天然的优势基础。运维人员日常接触的服务器、网络设备、系统架构等,恰恰构成了网络安全防护的第一道防线。我们积累的排障经验、系统优化技巧、日志…

2026/8/1 7:03:28 阅读更多 →
Orca大模型安装实战:从环境配置到训练部署全流程解析

Orca大模型安装实战:从环境配置到训练部署全流程解析

1. 项目概述:为什么我们需要关注Orca的安装? 如果你最近在关注大语言模型(LLM)的微调领域,那么“Orca”这个名字大概率已经出现在你的视野里了。它不是一个新发现的海洋生物,而是微软研究院在2023年发布的…

2026/8/1 7:02:28 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →