Mybatis 查询对象中嵌套其他对象的解决方法有两种,一种是用关联另一个resultMap的形式,如
<association property="office" javaType="Office" resultMap="officeMap"/>
<mapper namespace="com.dixn.oa.modules.sys.dao.RoleDao"> <resultMap type="Office" id="officeMap"> <id property="id" column="id" /> <result property="name" column="office.name" /> <result property="code" column="office.code" /> </resultMap> <resultMap id="roleResult" type="Role"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="enname" column="enname" /> <result property="roleType" column="roleType" /> <result property="dataScope" column="dataScope" /> <result property="remarks" column="remarks" /> <result property="useable" column="useable" /> <association property="office" javaType="Office" resultMap="officeMap"/> <collection property="menuList" ofType="Menu"> <id property="id" column="menuList.id" /> </collection> <collection property="officeList" ofType="Office"> <id property="id" column="officeList.id" /> </collection> </resultMap> <sql id="roleColumns"> a.id, a.office_id AS "office.id", a.name, a.enname, a.role_type AS roleType, a.data_scope AS dataScope, a.remarks, a.create_by AS "createBy.id", a.create_date, a.update_by AS "updateBy.id", a.update_date, a.del_flag, o.name AS "office.name", o.code AS "office.code", a.useable AS useable, a.is_sys AS sysData </sql> <select id="get" resultMap="roleResult"> SELECT <include refid="roleColumns"/> rm.menu_id AS "menuList.id", ro.office_id AS "officeList.id" FROM sys_role a JOIN sys_office o ON o.id = a.office_id LEFT JOIN sys_role_menu rm ON rm.role_id = a.id LEFT JOIN sys_role_office ro ON ro.role_id = a.id WHERE a.id = #{id} </select>
另一种联合查询 (一对一)的实现,但是这种方式有“N+1”的问题,不建议使用
<resultMap id="roleResult" type="Role"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="enname" column="enname" /> <result property="roleType" column="roleType" /> <result property="dataScope" column="dataScope" /> <result property="remarks" column="remarks" /> <result property="useable" column="useable" /> <association property="office" javaType="Office" column="id" select="getOfficeById"/> <collection property="menuList" ofType="Menu"> <id property="id" column="menuList.id" /> </collection> <collection property="officeList" ofType="Office"> <id property="id" column="officeList.id" /> </collection> </resultMap>
<select id="getOfficeById" resultType="Office"> select o.name AS "office.name",o.code AS "office.code" from sys_office o where o.id = #{id} </select> 以上就是两种对象内嵌套对象查询的实现。
相关推荐
本篇文章将详细探讨MyBatis在关联查询中的一对一和一对多关系映射,以及如何通过ResultMap配置来实现这些复杂的查询。 在数据库设计中,一对一和一对多的关系非常常见。一对一关系通常出现在两个表之间,其中一个表...
这样,MyBatis将根据配置自动执行相关联的查询,将多层级的数据结构填充到对应的Java对象中。 总结来说,MyBatis通过`<collection>`标签实现了对多层级数据结构的映射,使得我们可以方便地处理复杂的关联查询,避免...
1. **嵌套结果映射**(Nested Result Maps):在同一个ResultMap中定义一对一或一对多的子ResultMap,MyBatis会自动处理关联对象的填充。 2. **关联查询**(Association Queries):使用`<association>`和`...
这些注解告诉MyBatis如何处理中间表,并提供关联对象的映射。 3. **编写Service和DAO**:在Service层,我们需要编写逻辑来处理多对多的关联操作,如添加、删除和查找关联关系。在DAO层,对应的Mapper接口和XML文件...
通过本次实验的学习,我们深入了解了MyBatis关联映射的基本原理和技术要点,掌握了不同类型的关联查询方法及其应用场景。在实际开发过程中,合理运用关联映射技术能够显著提升系统的性能和可维护性。同时,通过实验...
这种映射允许我们在查询时自动处理关联对象,而无需手动编写复杂的SQL语句。关联映射分为嵌套查询(Nested Select)和嵌套结果(Nested ResultMap)两种方式。 1. 嵌套查询:在查询主表数据时,通过子查询来获取...
了解数据表之间以及对象之间的三种关联关系 2.熟悉关联关系中的嵌套查询和 嵌套结果 3.掌握一对一,一对多,和多对多关联映射作用
MyBatis 在映射文件中加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。 嵌套查询方式: ```xml select="com.ghl.mapper.ClassMapper.findStudentInClass"/> ``` 嵌套结果方式: ```xml ```...
- 使用 `lazyLoadingEnabled` 属性可实现延迟加载,只有当访问到关联对象时才执行子查询,提高初次加载速度。 - `fetchSize` 设置可以控制每次从数据库读取的数据量,避免一次性加载大量数据导致内存溢出。 - `...
MyBatis提供了两种处理关联对象的方法:嵌套查询和嵌套结果。嵌套查询会在主查询的基础上执行额外的SQL,而嵌套结果则是通过一次复杂的多表查询获取所有需要的数据。嵌套查询虽然简单,但可能导致大量额外的SQL语句...
本主题将详细探讨如何在Mybatis中实现一对一(1-1)的关联查询,以User用户表和User_Card身份证表为例。这两个表之间存在一对一的关系,意味着每个用户都对应一个且仅有一个身份证信息。 首先,我们需要理解Mybatis...
在这个“Mybatis关联练习”中,我们将深入探讨Mybatis中的一对一、一对多和多对一关系映射,以及如何通过接口实现数据查询,并结合分页插件提高查询效率。 首先,我们来看一下Mybatis中的一对一关联。一对一关系...
- 连接查询(JOIN):MyBatis 允许在 XML 映射文件中编写 SQL JOIN 语句,直接在一个查询中获取父对象和其关联的子对象。这种方式简单明了,但可能导致 SQL 查询性能下降。 - 嵌套查询:另一种方式是使用 `...
MyBatis 提供了两种方式来加载关联关系对象:嵌套查询和嵌套结果。嵌套查询时指通过执行另一条 SQL 映射语句来返回预期的复杂类型;嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。 例如,以下是使用嵌套...
为了解决这个问题,MyBatis提供延迟加载机制,通过在核心配置文件中开启`lazyLoadingEnabled`和关闭`aggressiveLazyLoading`,可以在需要时才加载关联对象,从而提高效率。 对于一对多的关系,例如一个部门有多名...
4. **嵌套的 select 语句**:如果不想在主查询中包含“多”的一方所有数据,可以在“一”的一方 ResultMap 中使用 `<collection>` 标签的 `select` 属性引用一个 SQL 查询,该查询将单独获取关联对象集合。...
MyBatis支持嵌套结果映射和关联映射来处理这些复杂的关系。比如,如果一个用户有多个订单,可以这样配置: ```xml SELECT u.*, o.* FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = #{id} ...
这样,当执行查询时,MyBatis会自动处理这种复杂的一对一关系,将查询结果组装成完整的`User`对象,其中包含了`UserDetail`对象。 总结一下,MyBatis中的一对一查询主要通过`resultMap`、`id`、`result`以及`...
4. **延迟加载**:MyBatis提供了延迟加载功能,当首次访问关联对象时才执行SQL查询,而不是在主对象加载时一次性加载所有关联数据。这可以避免内存占用过多,但需要开启MyBatis的二级缓存和懒加载特性。 5. **联合...
总结来说,Mybatis的关联查询处理有嵌套查询和嵌套结果两种策略,后者在性能上更优。同时,针对多对一的关系,我们可以利用`<association>`标签进行映射,并通过懒加载来优化数据加载时机。在实际开发中,合理运用...