MyBatis关联查询(对象嵌套对象)

本文介绍了MyBatis中处理对象嵌套对象的关联查询方法,包括使用resultMap的方式以及联合查询(一对一)的方式。尽管联合查询可能导致'N+1'问题,但在特定场景下仍具实用性。
部署运行你感兴趣的模型镜像

    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> 

    以上就是两种对象内嵌套对象查询的实现。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### MyBatis嵌套查询嵌套集合的用法及区别 #### 一、嵌套查询 嵌套查询是指在一个 `resultMap` 的定义中,通过 `<association>` 或者 `<collection>` 标签中的 `select` 属性来指定另一个查询语句。这种方式会触发额外的一次数据库查询操作。 - **实现方式** 在 `resultMap` 定义中使用 `<association select="..." />` 或 `<collection select="...">...</collection>` 来执行子查询[^1]。例如: ```xml <resultMap type="com.example.MyBatis.dao.model.Person" id="personResultMap"> <id property="id" column="id"/> <result property="name" column="name"/> <!-- 关联查询 --> <association property="address" column="address_id" select="selectAddressById"/> </resultMap> <select id="selectPersonById" resultMap="personResultMap"> SELECT * FROM person WHERE id = #{id} </select> <select id="selectAddressById" resultType="com.example.MyBatis.dao.model.Address"> SELECT * FROM address WHERE id = #{id} </select> ``` - **特点** - 数据库会被多次访问,因为每次都需要单独发起子查询。 - 更适合用于复杂逻辑处理或者当父表和子表之间存在一对多关系时,且子表的数据量较小时[^4]。 --- #### 二、嵌套集合 嵌套集合则是指在同一个 SQL 查询中完成所有的数据获取工作,并利用 `JOIN` 将多个表的数据组合在一起。之后,在 `resultMap` 中通过 `<collection>` 和 `<association>` 映射这些联合查询的结果。 - **实现方式** 使用单条 SQL 进行联合查询并映射到复杂的对象结构中[^3]。例如: ```xml <resultMap type="com.example.MyBatis.dao.model.Course" id="courseWithSectionsAndLessons"> <id property="uuid" column="course_uuid"/> <result property="title" column="course_title"/> <!-- 节点集合 --> <collection property="sections" ofType="com.example.MyBatis.dao.model.Section"> <id property="uuid" column="section_uuid"/> <result property="name" column="section_name"/> <!-- 子节点集合 --> <collection property="lessons" ofType="com.example.MyBatis.dao.model.Lesson"> <id property="uuid" column="lesson_uuid"/> <result property="title" column="lesson_title"/> </collection> </collection> </resultMap> <select id="getCourseDetail" resultMap="courseWithSectionsAndLessons"> SELECT * FROM course c LEFT JOIN section s ON c.uuid = s.course_uuid LEFT JOIN lesson l ON s.uuid = l.section_uuid WHERE c.uuid = #{courseId} </select> ``` - **特点** - 只需一次数据库查询即可完成所有数据加载。 - 对于大数据量的情况可能更高效,但也可能导致 SQL 复杂度增加以及性能瓶颈(如笛卡尔积等问题)[^3]。 --- #### 三、两者的对比分析 | 特性 | 嵌套查询 | 嵌套集合 | |-------------------|----------------------------------|----------------------------------| | **数据库交互次数** | 多次 | 单次 | | **适用场景** | 父子表间一对一或多对一时,子表数据较少 | 当需要一次性获取大量父子关联数据时 | | **SQL 编写难度** | 较低 | 较高(涉及多表连接) | | **性能影响因素** | 如果子查询过多可能会降低效率 | 若返回记录数过大,则内存占用较高 | --- #### 四、总结 如果希望减少 SQL 的复杂性和提高可读性,可以选择嵌套查询;而如果追求更高的查询效率并且能够接受一定的开发成本提升,则可以考虑采用嵌套集合的方式[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值