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

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics