`

Ibatis 关联查询

阅读更多

目前公司的查询结果是关联的数据结构,

 

酒店列表的酒店对象 有个字段是 价格计划列表 .

 

对于这种关联的一对多数据结构, 我们可以在SQLMAP中完成, 而不必对查询结果进行遍历, 还可以配置延迟加载, 提高性能

 

SQLMAP:

 

<resultMap class="com.woyo.travel.hotel.dto.HotelSRVDto" id="hotelSearchDto">
    <result property="hotelId" column="hotel_id" />
	<result property="code" column="code" />
	<result property="pricePlanList"  column="{hotelId=hotel_id,beginDate=begin_date,endDate=end_date}" select="com.woyo.travel.hotel.dto.SearchSRVDto.searchPlanList" />	
  </resultMap>
<!--对象com.woyo.travel.hotel.dto.HotelSRVDto中必须存在 hotelId , beginDate , endDate 属性, 否则会报SQLMAP属性错误-->

  <select id="searchPlanList" resultMap="pricePlanSearchDto">
			SELECT pp.id id, hr.id room_id, hr.broadband broad_band, pp.pay_way pay_way_name, "cu xiao" promotion_info
			FROM t_htl_price_plan pp
			LEFT JOIN t_htl_hotel_room hr ON pp.room_id = hr.id
			LEFT JOIN t_htl_add_value_strategy avs ON pp.id = avs.price_plan_id
			WHERE hr.hotel_id=#hotelId#  AND pp.begin_date &gt;= #beginDate# AND pp.end_date &lt;= #endDate#  
  </select>
 

 

 最近 , 公司的数据结构也要使用这种的关联加载 。 结构 :



 

使用以上的方式加载, 属于  N+1 的加载方式, 比较消耗查询效率 。 。

 

这里碰到使用 SQLMAp 必须要注意的几个 地方: 

 

内部类不能被 SQLMAP 识别到:

 

比如 : TheoryDesView 是 类 SuitAdminView 的内部类, 以下的写法, Ibatis 就不能识别。

 

如果有看到文章的牛人找到可以识别的方法请指教。 我就另外开了一个单独的类。

 

	<resultMap class="com.cares.flyingnet.crs.simulator.dto.SuitAdminView.TheoryDesView" id="TheoryDesView" >
		<result property="id" column="TRAINING_THEORY_ID" />
		<result property="t_date" column="t_date" />
		<result property="t_content" column="t_content" />
		<result property="ORDER_NUM" column="ORDER_NUM" />
	</resultMap>
	

 

 

于是采用了 另外的一种  Result Map 的加载方式 。

 

这种方式用 Left Join 一次关联查询出所有的数据。在SQLMAP里面使用 GROUPBY 属性分组。 

 

	<typeAlias alias="SuitAdminView"
		type="com.cares.flyingnet.crs.simulator.dto.SuitAdminView." />
		
	<resultMap class="com.cares.flyingnet.crs.simulator.dto.SuitAdminView" id="SuitAdminViewRstMap" groupBy="suiteId">
		<result property="isScheduled" column="isScheduled" />
		<!-- <result property="changed" column="changed" /> -->
		<result property="suiteId" column="suiteId" />
		<result property="sign_property" column="sign_property" />
		<result property="batch_no" column="batch_no" />
		<result property="studentLock" column="studentLock" />
		<result property="bench_Month" column="bench_Month" />
		<result property="checkin_date" column="checkin_date" />
		<result property="suite_no" column="suite_no" />
		<result property="ac_type" column="ac_type" />
		<result property="train_com" column="train_com" />
		<result property="releaseStatus" column="releaseStatus" />
		<result property="theoryDesViewListMap" resultMap="SuitAdminView.TheoryDesView" />
		<result property="training_simDesViewListMap" resultMap="SuitAdminView.TrainingSimDesView" />
 		<result property="studentListMap" resultMap="SuitAdminView.PilotInfForVoteDto" />
 		<result property="simTeacherList" resultMap="SuitAdminView.SimTeacherView" />
	</resultMap>
	
	<resultMap class="com.cares.flyingnet.crs.simulator.dto.TheoryDesViewMap" id="TheoryDesView" >
		<result property="id" column="TRAINING_THEORY_ID" />
		<result property="t_date" column="t_date" />
		<result property="t_content" column="t_content" />
		<result property="ORDER_NUM" column="ORDER_NUM" />
	</resultMap>
	
	<resultMap class="com.cares.flyingnet.crs.simulator.dto.Training_simDesViewMap" id="TrainingSimDesView" >
		<result property="id" column="TRAINING_SIM_ID" />
		<result property="s_date" column="s_date" />
		<result property="s_time" column="s_time" />
		<result property="s_no" column="s_no" />
		<result property="S_ORDER" column="S_ORDER" />
		<result property="s_type" column="s_type" />
		<result property="teacherName" column="simTeacherName" />
		<result property="unitName" column="simUnitName" />
		<result property="changed" column="simChanged" />
		<result property="SIM_TEACHER_ID" column="SIM_TEACHER_ID" />
	</resultMap>
	
	<resultMap class="com.cares.flyingnet.crs.simulator.dto.PilotInfForVoteDto" id="PilotInfForVoteDto" >
		<result property="pilotName" column="pilotName" />
		<result property="unitName" column="unitName" />
		<result property="unitCode" column="unitCode" />
		<result property="month1" column="month1" />
		<result property="month2" column="month2" />
		<result property="valid_end_date" column="valid_end_date" />
		<result property="technicalStandard" column="technicalStandard" />
		<result property="changed" column="changed" />
		<result property="position" column="position" />
	</resultMap>
	
	<resultMap class="com.cares.flyingnet.crs.simulator.dto.SimTeacherDto" id="SimTeacherView" >
		<result property="simTeacherId" column="simTeacherId" />
		<result property="teacherNo" column="teacherNo" />
		<result property="TType" column="TType" />
		<result property="TUnit" column="TUnit" />
		<result property="bigSuiteNo" column="tBigSuiteNo" />
		<result property="pilotId" column="tPilotId" />
		<result property="pilotName" column="tPilotName" />
		<result property="totalDay" column="tTotalDay" />
		<result property="startDate" column="tStartDate" />
		<result property="endDate" column="tEndDate" />
		<result property="needType" column="tNeedType" />
		<result property="changed" column="tChanged" />
		<result property="teacherLock" column="teacherLock" />
		<result property="TUnitName" column="TUnitName" />
	</resultMap>
	
	<!-- 查询总排班表 wuao 2011-10-14 -->
	<select id="suitAdminViewList" parameterClass="java.util.Map" resultMap="SuitAdminViewRstMap">
		SELECT s.IS_SCHEDULED isScheduled,
		<!-- 'true' changed, -->
       s.SUITE_ID suiteId,
       s.SIGN_PROPERTY sign_property,
       s.BATCH_NO batch_no,
       s.STUDENT_LOCK studentLock,
       s.BENCH_MONTH bench_Month,
       s.CHECKIN_DATE checkin_date,
       s.SUITE_NO suite_no,
       s.AC_TYPE_CODE ac_type,
	   s.TRAIN_COM train_com,
	   s.RELEASE_STATUS releaseStatus,
	   
	   h.TRAINING_THEORY_ID,
	   h.T_DATE t_date, 
		h.T_CONTENT t_content,
		h.ORDER_NUM ORDER_NUM,
		
		m.TRAINING_SIM_ID,
		m.S_DATE s_date, 
		m.S_TIME s_time,
		m.S_NO s_no,
		m.S_ORDER S_ORDER,
		m.S_TYPE s_type,
		m.SIM_TEACHER_ID,
		'' simTeacherName,
		'' simUnitName,
		'' simChanged,
		
		stubasicinfo.pilotName,
		stubasicinfo.unitName,
		stubasicinfo.unitCode,
		stubasicinfo.month1,
		stubasicinfo.month2,
		stubasicinfo.valid_end_date,
		stubasicinfo.technicalStandard,
		stubasicinfo.changed,
		stubasicinfo.position,
		
		teabasicinfo.simTeacherId as simTeacherId,
		teabasicinfo.teacherNo as teacherNo,
		 teabasicinfo.TType as TType,
		 teabasicinfo.TUnit as TUnit,
		 teabasicinfo.bigSuiteNo as tBigSuiteNo,
		 teabasicinfo.pilotId as tPilotId,
		 teabasicinfo.pilotName as tPilotName,
		 teabasicinfo.totalDay as tTotalDay,
		teabasicinfo.startDate as tStartDate,
		teabasicinfo.endDate as tEndDate,
		teabasicinfo.needType as tNeedType,
		teabasicinfo.changed as tChanged,
		 teabasicinfo.teacherLock as teacherLock,
		 teabasicinfo.TUnitName as TUnitName
		
		
	  FROM SIM_SUITE s 
	  left join SIM_TRAINING_THEORY h on s.SUITE_ID = h.SUITE_ID
	  left join SIM_TRAINING_SIM m on s.SUITE_ID = m.SUITE_ID
	  left join
	  (
			SELECT distinct  P.PILOT_NAME pilotName, 
			simS.SUITE_ID SUITE_ID,
		    U.UNIT_NAME unitName,
		    U.UNIT_CODE unitCode,
		    S.MONTH1 month1,
		    S.MONTH2 month2,
		    S.valid_end_date as valid_end_date,
		    CASE
		    WHEN SUBSTR(NVL(S.TECHNICAL_STANDARD, '21'), 0, 1) = '1' THEN
		    '机长'
		    ELSE
		    '副驾驶'
		    END technicalStandard,
		    simS.CHANGED changed,
		    simS.position position 
		    FROM flight.PILOT_BASIC_INFO P, flight.PILOT_TECHNICAL_STANDARD S, flight.BD_AERO_UNIT
		    U,sim_student_assign simS
		    WHERE P.BASIC_INFO_ID = S.PILOT_INFO_ID
		    AND U.UNIT_CODE = SUBSTR(P.AERO_UNIT_CODE, 0, 4)
		    AND (S.MAIN_AC_TYPE_CODE = '11' OR S.MAIN_AC_TYPE_CODE = '12' OR
		    S.MAIN_AC_TYPE_CODE = '14')
		    AND P.WORK_TYPE = '5201'
				AND S.MONTH1 IS NOT NULL
				AND S.MONTH2 IS NOT NULL
				AND P.VALIDITY='VALID'
				and p.basic_info_id=simS.Pilot_Id
    
     ) stubasicinfo on s.SUITE_ID = stubasicinfo.SUITE_ID
     
     left join 
	 (
	 
		 select 
		t.SIM_TEACHER_ID as simTeacherId,
		 t.TEACHER_NO as teacherNo,
		 t.T_TYPE as TType,
		 t.T_UNIT as TUnit,
		 t.BIG_SUITE_NO as bigSuiteNo,
		 t.PILOT_ID as pilotId,
		 p.pilot_name as pilotName,
		 t.TOTAL_DAY as totalDay,
		 t.START_DATE as startDate,
		 t.END_DATE as endDate,
		 t.NEED_TYPE as needType,
		 t.CHANGED as changed,
		 t.TEACHER_LOCK as teacherLock,
		 d.unit_name as TUnitName
		  from SIM_TEACHER  t left join 
		  flight.bd_aero_unit d on substr(t.t_unit,1,4)=d.unit_code
		  left join 
		  flight.pilot_basic_info p on p.basic_info_id = t.PILOT_ID
  
	 )   teabasicinfo on m.SIM_TEACHER_ID = teabasicinfo.simTeacherId
	  
     
	  WHERE s.FIXED_YEAR=#fixedYear#
	   AND  s.AC_TYPE_CODE=#acType#
	   AND s.TRAIN_COM=#trainCom#
	   AND s.IS_SCHEDULED = 'Y'
	   <dynamic>
			<isNotNull prepend="and" property="batchNo">
			   s.BATCH_NO=#batchNo#
			</isNotNull>
			<isNotNull prepend="and" property="suiteId">
			   s.SUITE_ID=#suiteId#
			</isNotNull>
			<isNotNull prepend="and" property="benchMonth">
			   s.BENCH_MONTH=#benchMonth#
			</isNotNull>
			<isNotNull prepend="and" property="isScheduled">
			   s.IS_SCHEDULED=#isScheduled#
			</isNotNull>
			<isNotNull prepend="and" property="startSuiteNo">
			   s.SUITE_NO between #startSuiteNo# and #endSuiteNo#
			</isNotNull>
	   </dynamic>
	 ORDER BY s.SUITE_NO
	</select>

 

 

这种方式, 查询出来子列表的数据仍然有很多是重复的。 

 

就到 Java  里面处理 过滤。 

 

 

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

相关推荐

    Ibatis的简单例子(增删改查,联合查询等)

    在这个"Ibatis的简单例子"中,我们将探讨如何使用Ibatis进行数据库的增删改查(CRUD)操作以及联合查询。 1. **安装与配置**: 在开始之前,你需要在项目中添加Ibatis的依赖,通常是通过Maven或Gradle。在Maven的`...

    Ibatis复杂查询语句.doc

    在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...

    iBatis条件查询

    在本资源中,"iBatis条件查询"着重展示了如何根据业务需求定制SQL语句进行数据检索,尤其在不涉及复杂关联查询的情况下,iBatis可以提供高效且简单的解决方案。 首先,iBatis的核心概念是SQL Map,它是一个XML配置...

    ibatis 文档查询

    【标题】:深入理解iBATIS的查询机制 【描述】:本文将详细解析iBATIS框架中的查询功能,包括处理复杂对象关系、XML映射和数据集操作,旨在帮助开发者充分利用iBATIS进行高效数据库操作。 【标签】:iBATIS、查询...

    ibatis and和or联合查询 .doc

    ### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...

    Ibatis多表查询

    在多表查询中,Ibatis 提供了多种方式来处理复杂的关联查询,包括一对一、一对多、多对一和多对多等关系。在这个例子中,我们将探讨如何在 Ibatis 中实现一对多的关系查询。 首先,我们创建了两个表:`book` 和 `...

    ibatis多表查询

    在Ibatis中,多表查询是一项重要的功能,它允许我们处理复杂的数据库操作,例如一对多、多对一或一对一的关系。在这个例子中,我们将探讨如何使用Ibatis进行一对多的多表查询,以`book`和`user`两个表为例。 首先,...

    Ibatis查询语句里,可以使用多表查询

    多表查询通常涉及到 JOIN 操作,例如内连接(INNER JOIN)、左连接(LEFT JOIN)等,这些操作可以帮助我们从多个相关联的表中获取所需的数据。 #### 三、多表查询示例分析 根据提供的部分代码,我们可以看到一个多...

    ibatis做连接查询 .doc

    本文将详细介绍如何使用iBatis进行连接查询。 首先,我们需要理解iBatis的工作原理。iBatis并不是像Hibernate那样完全自动管理数据库操作,而是将SQL语句的编写权交给开发者,这样可以更好地控制查询性能和复杂性。...

    主子表查询ibatis

    本文将深入探讨如何在iBATIS中进行主子表查询,以及涉及到的相关技术如一对多关系、日志管理库log4j等。 首先,主子表查询是数据库设计中常见的场景,通常涉及到一个“父”表(主表)和一个或多个“子”表(从表)...

    ibatis多表查询过程

    当我们需要进行多表查询时,iBatis提供了一种高效且易于管理的方式。本文将深入探讨iBatis在处理多表查询时的具体步骤和技巧。 ### 1. iBatis简介 iBatis 是一个基于Java的持久层框架,它简化了数据库访问,并避免...

    ibatis总结 ibatis ibatis ibatis ibatis

    - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大的情况下。 - 避免在`WHERE`子句中使用多个条件或`OR`操作符,而是应该使用`IN`操作符或者`UNION ALL`合并多个查询。 3. Struts、Spring与Ibatis...

    ibatis教程_查询指定id的单个对象

    本教程聚焦于如何使用Ibatis查询指定ID的单个对象,这对于日常的数据检索工作尤为重要。 首先,理解Ibatis的基本架构。Ibatis不是一个完整的ORM(对象关系映射)框架,而是介于SQL和Java之间的桥梁,允许开发者编写...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis提供了多种方式来实现映射,如自动类型匹配、自定义类型处理器、复杂关联映射等。 7. **缓存机制**:Ibatis内置了本地缓存和二级缓存,可以提高数据读取速度。本地缓存作用于单个SqlSession,而二级缓存则...

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

    IBATIS开发使用实例

    本文将围绕“IBATIS开发使用实例”这一主题,深入解析复杂SQL查询的应用,尤其是如何利用SQL进行多表关联、条件筛选以及聚合函数的使用。 ### IBATIS简介 IBATIS,现被称为MyBatis,是一种优秀的持久层框架,它...

    ibatis api,ibatis文档,ibatis说明文档

    通过阅读文档,你可以了解如何配置Ibatis、创建Mapper接口和XML映射文件,以及如何处理复杂的查询和关联。 在说明文档中,通常会包含以下内容: 1. 安装和配置:介绍如何将Ibatis集成到项目中,包括Maven或Gradle...

    ibatis的实现(包含模糊查询、关联查询、增删改查)

    本篇将详细讲解Ibatis在实现模糊查询、关联查询以及增删改查操作时的关键知识点。 首先,模糊查询是数据库操作中常见的功能,Ibatis通过`&lt;if&gt;`标签或`&lt;where&gt;`标签配合`#{}`占位符来实现。例如,如果你有一个用户...

    ibatis开发指南 经典教材

    ibatis支持多种ORM映射策略,包括一对多关联和一对一关联。这些关联可以使用嵌套查询或嵌套结果的方式实现,允许开发者在多个表之间建立复杂的关系。此外,ibatis还支持延迟加载,即只有在真正需要时才加载关联对象...

Global site tag (gtag.js) - Google Analytics