`
zhaojian0910
  • 浏览: 47562 次
社区版块
存档分类
最新评论

Mybatis 关联查询 collection 效率 分析

阅读更多

背景:

有一张评议人表(e_evaluator),一张参评企业表(attend_enterprise_info),一张评议人和参评企业关系表(er_evaluator_attend_enterprise),关系如下图

 


 目前e_evaluator表中有3800条数据,attend_enterprise_info表中有130条数据,er_evaluator_attend_enterprise表中有42000条数据

 

通过中间表er_evaluator_attend_enterprise,建立一个e_evaluator与多个e_attend_enterprise的一对多关系

 

java代码调用

long s1 = System.currentTimeMillis();
// 所有评议人
List<Evaluator> evaluatorLst = this.evaluatorMapper.queryEvaluators(evaluatorParam);
long s2 = System.currentTimeMillis();
log.info("用时:" + (s2 - s1))

 mybatis的xml文件用到了两种写法

 

第一种写法:

        第一步:配置返回的resultMap

<resultMap id="BaseResultMap" type="com.hhsoft.evaluation.model.dto.Evaluator" >
    	<id column="evaluator_id" property="evaluatorId" jdbcType="VARCHAR" />
	    <result column="evaluator_name" property="evaluatorName" jdbcType="VARCHAR" />
	    <result column="account" property="account" jdbcType="VARCHAR" />
	    <result column="password" property="password" jdbcType="VARCHAR" />
	    <result column="login_status" property="loginStatus" jdbcType="VARCHAR" />
	    <result column="gender" property="gender" jdbcType="VARCHAR" />
	    <result column="mobile" property="mobile" jdbcType="VARCHAR" />
	    <result column="administrative_area_code" property="administrativeAreaCode" jdbcType="VARCHAR" />
	    <result column="administrative_area_name" property="administrativeAreaName" jdbcType="VARCHAR" />
	    <result column="administrative_area_grade" property="administrativeAreaGrade" jdbcType="VARCHAR" />
	    <result column="questionnaire_id" property="questionnaireId" jdbcType="VARCHAR" />
	    <result column="evaluator_type" property="evaluatorType" jdbcType="VARCHAR" />
	    <result column="city_code" property="cityCode" jdbcType="VARCHAR" />
	    <result column="city_name" property="cityName" jdbcType="VARCHAR" />
	    <result column="county_code" property="countyCode" jdbcType="VARCHAR" />
	    <result column="county_name" property="countyName" jdbcType="VARCHAR" />
	    <result column="position_name" property="positionName" jdbcType="VARCHAR" />
	    <result column="organization_name" property="organizationName" jdbcType="VARCHAR" />
	    <result column="create_user_id" property="createUserId" jdbcType="VARCHAR" />
	    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
	    <result column="update_user_id" property="updateUserId" jdbcType="VARCHAR" />
	    <result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
	    <result column="order_no" property="orderNo" jdbcType="FLOAT" />
	    <result column="status" property="status" jdbcType="INTEGER" />
	    <result column="office_people_id" property="officePeopleId" jdbcType="VARCHAR" />
	    <result column="work_unit" property="workUnit" jdbcType="VARCHAR" />
	    <result column="office_id" property="officeId" jdbcType="VARCHAR" />
	    <result column="answer_status" property="answerStatus" jdbcType="INTEGER" />
	    
	    <collection property="attendEnterpriseLst" ofType="com.hhsoft.evaluation.model.dto.AttendEnterprise" >
	    	<id column="attend_enterprise_id" property="attendEnterpriseId"/>
	    	<result column="attend_enterprise_name" property="attendEnterpriseName"/>
	    </collection>
  </resultMap>

 其中,重点在collection

<collection property="attendEnterpriseLst" ofType="com.hhsoft.evaluation.model.dto.AttendEnterprise" >
	    	<id column="attend_enterprise_id" property="attendEnterpriseId"/>
	    	<result column="attend_enterprise_name" property="attendEnterpriseName"/>
	    </collection>

 查询的sql

<select id="queryEvaluators" resultMap="BaseResultMap" parameterType="com.hhsoft.evaluation.model.dto.Evaluator" >

SELECT eei.evaluator_id, 
	eei.evaluator_name, 
	eei.account, 
	eei.password, 
	eei.login_status, 
	eei.gender, 
	eei.mobile, 
	eei.administrative_area_code, 
	eei.administrative_area_grade, 
	eei.questionnaire_id, 
	eei.evaluator_type, 
	eei.city_code, 
	eei.county_code, 
	eei.position_name, 
	eei.organization_name, 
	eei.create_user_id, 
	eei.create_time, 
	eei.update_user_id, 
	eei.update_time, 
	eei.order_no, 
	eei.status,
	eei.office_people_id,
	eei.work_unit,
	eei.office_id,
	b1.area_name administrative_area_name,
	b2.area_name city_name, 
	b3.area_name county_name,
	eeae.attend_enterprise_id,
	eae.attend_enterprise_name
	 
	FROM 
	e_evaluator eei
	
	LEFT JOIN b_area b1 ON b1.area_code = eei.administrative_area_code
	LEFT JOIN b_area b2 ON b2.area_code = eei.city_code
	LEFT JOIN b_area b3 ON b3.area_code = eei.county_code
	LEFT JOIN e_office_info eoi ON eoi.office_id = eei.office_id
	LEFT JOIN e_office_people_info eopi ON eopi.office_people_id = eei.office_people_id
	LEFT JOIN er_evaluator_attend_enterprise eeae ON eei.evaluator_id = eeae.evaluator_id
	LEFT JOIN e_attend_enterprise eae ON eeae.attend_enterprise_id = eae.attend_enterprise_id
	where eei.status = 0 and eeae.status = 0

    ORDER BY eei.city_code, eei.county_code, eoi.order_no,eopi.order_no, eei.order_no
    <!-- 分页 -->
	<include refid="pagerB"></include>
  </select>

 用时:10463ms

第二种写法:

        第一步:配置返回的resultMap

<resultMap id="BaseResultMap" type="com.hhsoft.evaluation.model.dto.Evaluator" >
    	<id column="evaluator_id" property="evaluatorId" jdbcType="VARCHAR" />
	    <result column="evaluator_name" property="evaluatorName" jdbcType="VARCHAR" />
	    <result column="account" property="account" jdbcType="VARCHAR" />
	    <result column="password" property="password" jdbcType="VARCHAR" />
	    <result column="login_status" property="loginStatus" jdbcType="VARCHAR" />
	    <result column="gender" property="gender" jdbcType="VARCHAR" />
	    <result column="mobile" property="mobile" jdbcType="VARCHAR" />
	    <result column="administrative_area_code" property="administrativeAreaCode" jdbcType="VARCHAR" />
	    <result column="administrative_area_name" property="administrativeAreaName" jdbcType="VARCHAR" />
	    <result column="administrative_area_grade" property="administrativeAreaGrade" jdbcType="VARCHAR" />
	    <result column="questionnaire_id" property="questionnaireId" jdbcType="VARCHAR" />
	    <result column="evaluator_type" property="evaluatorType" jdbcType="VARCHAR" />
	    <result column="city_code" property="cityCode" jdbcType="VARCHAR" />
	    <result column="city_name" property="cityName" jdbcType="VARCHAR" />
	    <result column="county_code" property="countyCode" jdbcType="VARCHAR" />
	    <result column="county_name" property="countyName" jdbcType="VARCHAR" />
	    <result column="position_name" property="positionName" jdbcType="VARCHAR" />
	    <result column="organization_name" property="organizationName" jdbcType="VARCHAR" />
	    <result column="create_user_id" property="createUserId" jdbcType="VARCHAR" />
	    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
	    <result column="update_user_id" property="updateUserId" jdbcType="VARCHAR" />
	    <result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
	    <result column="order_no" property="orderNo" jdbcType="FLOAT" />
	    <result column="status" property="status" jdbcType="INTEGER" />
	    <result column="office_people_id" property="officePeopleId" jdbcType="VARCHAR" />
	    <result column="work_unit" property="workUnit" jdbcType="VARCHAR" />
	    <result column="office_id" property="officeId" jdbcType="VARCHAR" />
	    <result column="answer_status" property="answerStatus" jdbcType="INTEGER" />
	    
	    <collection property="attendEnterpriseLst"  select="queryErAttendEnterpriseEvaluator" column="evaluator_id">
	    </collection>
  </resultMap>

 重点还是在collection

<collection property="attendEnterpriseLst"  select="queryErAttendEnterpriseEvaluator" column="evaluator_id">
	    </collection>

 sql语句

<select id="queryEvaluators" resultMap="BaseResultMap" parameterType="com.hhsoft.evaluation.model.dto.Evaluator" >

SELECT eei.evaluator_id, 
	eei.evaluator_name, 
	eei.account, 
	eei.password, 
	eei.login_status, 
	eei.gender, 
	eei.mobile, 
	eei.administrative_area_code, 
	eei.administrative_area_grade, 
	eei.questionnaire_id, 
	eei.evaluator_type, 
	eei.city_code, 
	eei.county_code, 
	eei.position_name, 
	eei.organization_name, 
	eei.create_user_id, 
	eei.create_time, 
	eei.update_user_id, 
	eei.update_time, 
	eei.order_no, 
	eei.status,
	eei.office_people_id,
	eei.work_unit,
	eei.office_id,
	b1.area_name administrative_area_name,
	b2.area_name city_name, 
	b3.area_name county_name
	 
	FROM 
	e_evaluator eei
	
	LEFT JOIN b_area b1 ON b1.area_code = eei.administrative_area_code
	LEFT JOIN b_area b2 ON b2.area_code = eei.city_code
	LEFT JOIN b_area b3 ON b3.area_code = eei.county_code
	LEFT JOIN e_office_info eoi ON eoi.office_id = eei.office_id
	LEFT JOIN e_office_people_info eopi ON eopi.office_people_id = eei.office_people_id
	where eei.status = 0

    ORDER BY eei.city_code, eei.county_code, eoi.order_no,eopi.order_no, eei.order_no
    <!-- 分页 -->
	<include refid="pagerB"></include>
  </select>

 关联关系select用到的sql语句

  <select id="queryErAttendEnterpriseEvaluator" parameterType="string" resultType="com.hhsoft.evaluation.model.dto.AttendEnterprise">
  	select eae.attend_enterprise_id attendEnterpriseId, eae.attend_enterprise_name attendEnterpriseName
  	from e_attend_enterprise eae
  	left join er_evaluator_attend_enterprise eeae on eeae.attend_enterprise_id = eae.attend_enterprise_id
  	where eeae.evaluator_id = #{evaluator_id}
  </select>

 用时:4862ms

效率提高一倍。具体原理待分析

 

  • 大小: 53.5 KB
分享到:
评论

相关推荐

    mybatis 多层级collection嵌套.docx

    总结来说,MyBatis通过`&lt;collection&gt;`标签实现了对多层级数据结构的映射,使得我们可以方便地处理复杂的关联查询,避免了繁琐的手动拼接和解析结果集的过程。在实际开发中,正确配置`&lt;collection&gt;`标签以及相关的`...

    mybatis 关联查询完整代码

    MyBatis通过ResultMap的association和collection元素,为一对一和一对多的关联查询提供了强大的支持。开发者可以根据具体需求灵活配置,实现数据库查询与Java对象之间的无缝转换。在实际开发中,熟练掌握这些配置,...

    基于mybatis的collection标签实现帖子评论多级回复以及关联用户信息查询

    在本场景中,我们探讨的是如何利用MyBatis的`collection`标签来实现帖子评论的多级回复以及与用户信息的关联查询。MyBatis是一个强大的Java持久层框架,它简化了数据库操作,使得开发者能更专注于SQL语句本身,而...

    mybatis 的高级关联查询源码

    这次我们将深入探讨 MyBatis 如何实现这种高级关联查询,并通过源码分析来理解其工作原理。 “一对多”关联通常指的是一个实体(如用户)可以拥有多个关联实体(如订单)。在 MyBatis 中,我们可以使用 `...

    mybatis collection 多条件查询的实现方法

    总之,MyBatis的`collection`标签是实现多条件查询的强大工具,它允许我们在一个查询中获取到复杂的关联数据结构,简化了代码,提高了效率。在使用时,需要根据实际业务需求灵活配置和优化,以达到最佳的查询效果。

    mybatis利用association或collection传递多参数子查询

    "MyBatis多参数子查询使用association或collection" MyBatis是一款流行的Java持久层框架,提供了多种方式来实现复杂的数据库查询操作。其中,使用association或collection来传递多参数子查询是一种常用的方法。本文...

    Mybatis关联映射Demo

    Mybatis关联映射是数据库操作中的一个重要概念,它允许我们在SQL查询中处理一对多、多对一、多对多等复杂关系。在这个"Mybatis关联映射Demo"中,我们将深入探讨如何在Mybatis框架中实现这些关系映射,以便更好地理解...

    mybatis关联查询问题(一对多、多对一)

    在这个场景中,"mybatis关联查询问题(一对多、多对一)"是核心关注点,这涉及到数据库设计中的关系映射以及在Mybatis中如何处理这些关系。 1. **一对多关联**: 在数据库设计中,一对多关联是指一个表中的记录可以...

    mybatis分布查询以及resulttype和resultmap的用法

    在实际开发中,我们经常需要进行分布查询,也就是多个表之间的联合查询,MyBatis提供了丰富的功能来处理这种情况。本篇文章将深入探讨MyBatis中的分布查询、`resultType`与`resultMap`的用法,并分享新手学习MyBatis...

    Mybatis关联映射

    通过本次实验的学习,我们深入了解了MyBatis关联映射的基本原理和技术要点,掌握了不同类型的关联查询方法及其应用场景。在实际开发过程中,合理运用关联映射技术能够显著提升系统的性能和可维护性。同时,通过实验...

    Mybatis实现多表联合查询和批量插入

    Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...

    Mybatis高级映射查询

    在 Mybatis 中,高级映射查询是其核心特性之一,它帮助开发者摆脱了传统 JDBC 中繁琐的代码编写,提高了开发效率和代码可维护性。下面我们将深入探讨 Mybatis 的高级映射查询及其相关知识点。 1. 动态 SQL:Mybatis...

    完整版 Java开发实训课程系列-MyBatis框架技术 03.MyBatis关联映射查询与缓存配置(共25页).pptx

    【MyBatis框架关联映射查询与缓存配置】 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java开发中,MyBatis简化了DAO(Data Access Object)层的开发工作,使得开发者能够更专注于...

    Mybatis关联练习

    在这个“Mybatis关联练习”中,我们将深入探讨Mybatis中的一对一、一对多和多对一关系映射,以及如何通过接口实现数据查询,并结合分页插件提高查询效率。 首先,我们来看一下Mybatis中的一对一关联。一对一关系...

    Mybatis查询方式

    总的来说,MyBatis提供了灵活的查询机制,可以方便地处理一对一、一对多和多对多的关联查询。在实际应用中,我们需要根据业务需求选择合适的方式,并结合MySQL数据库进行数据操作。理解并熟练运用这些查询方式,能...

    mybatis动态sql及关联查询项目示例

    通过学习和分析这个项目,开发者可以了解到如何在实际项目中应用MyBatis的动态SQL和关联查询,提升数据库操作的灵活性和效率。同时,这也是一次很好的实践机会,加深对Java EE开发流程和MyBatis框架的理解。

    mybatis一对一,一对多

    总之,掌握 MyBatis 的 `association` 和 `collection` 使用,对于处理复杂的数据关联非常重要。它们使我们能够在不编写大量手动映射代码的情况下,优雅地完成数据库操作与对象模型之间的转换。通过实际操作和测试,...

    MyBatis高级映射(多对多查询)

    通过合理配置映射文件,编写适当的SQL查询,以及利用结果映射和缓存策略,开发者可以有效地管理多对多关联数据,提升应用程序的效率和可维护性。在实际开发中,结合具体的业务场景进行实践和优化,将进一步提高代码...

    mybatis多表查询.zip

    在关系型数据库中,数据通常存储在多个表中,为了获取完整的信息,往往需要对这些表进行联合查询,即多表查询。常见的多表查询操作包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接...

Global site tag (gtag.js) - Google Analytics