mybatis学习笔记(三) 高级映射

在返回结果集时,一对一 一对多有嵌套查询,嵌套结果集2中查询方式

 

1:嵌套查询方式

     由于会导致N+1次的查询,所以在返回数据较多时,会导致性能问题

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.mybatis.mapper.GameQuestionTypeMapper">
	
	<!-- 1:嵌套查询的方式。这种方式会导致N+1次查询,所以查询列表时会导致性能问题。 -->
	<select id="getGameQuestionTypes"  parameterType="long" resultMap="gameQuestionTypeResult">
		 SELECT T.QT_ID,
		        T.GAME_ID,
		        T.QT_NAME,
		        T.STATUS
		  FROM T_GIM_QUESTION_TYPE T
		 WHERE T.QT_ID = #{typeId}
	</select>
	
	<resultMap type="org.mybatis.entity.GameQuestionType" id="gameQuestionTypeResult">
		<!-- 指定使用的构造方法:使用时需要保证参数的顺序 -->
		<!-- <constructor></constructor> -->
		
		<!-- 映射一般的列,提供id可以用来改进性能(缓存) -->
		<id property="qtId" column="QT_ID"/>
		<result property="qtName" column="QT_NAME"/>
		<result property="status" column="STATUS"/>
		
		<association property="game" column="GAME_ID" javaType="org.mybatis.entity.GameServer" 
			select="selectGame"></association>
		
		<!-- 关联一对多(多对多) -->
		<!-- 1:column是T_GIM_QUESTION_TYPE表中的ID,不是DETAIL表中的主键。2:javaType可以省略不写 -->
		<collection property="details" column="QT_ID" ofType="org.mybatis.entity.GameQuestionDetail" javaType="ArrayList" 
			select="selectQuestionDetail"></collection>
	</resultMap>
	
	<!-- #{}中的参数既可以是GameQuestionType中的外键gamedId,也可以是GameServer中的主键id -->
	<select id="selectGame" parameterType="long" resultType="org.mybatis.entity.GameServer">
		SELECT ID,NAME FROM GAME_SERVER WHERE ID=#{id}
	</select>
	<!-- #{}中的参数既可以是GameQuestionType中的主键qtId,也可以是GameQuestionDetail中的外键qtId -->
	<select id="selectQuestionDetail" parameterType="long" resultType="org.mybatis.entity.GameQuestionDetail">
		SELECT QD_ID AS QDID,QD_NAME AS QDNAME FROM T_GIM_QUESTION_DETAIL WHERE QT_ID=#{qtId}
	</select>
</mapper> 
 

 

2:嵌套结果集

     由于是通过一条sql语句将需要的数据全部查询出来,所以只会执行一条sql

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.mybatis.mapper.GameQuestionTypeMapper">
	
		<!-- 根据编号查询基础数据对象 -->
	<select id="getGameQuestionTypes"  parameterType="long" resultMap="gameQuestionTypeResult">
		SELECT T.QT_ID,
		       T.GAME_ID,
		       T.QT_NAME,
		       T.STATUS,
		       D.QD_ID,
		       D.QD_NAME,
		       S.NAME
		  FROM T_GIM_QUESTION_TYPE T
		  JOIN GAME_SERVER S
		    ON T.GAME_ID = S.ID
		  JOIN T_GIM_QUESTION_DETAIL D
		    ON T.QT_ID = D.QT_ID
		 WHERE D.QT_ID = #{gameId}
	</select>
	
	
	<!-- mybatis高级映射 -->
	<resultMap type="org.mybatis.entity.GameQuestionType" id="gameQuestionTypeResult">
		<!-- 指定使用的构造方法:使用时需要保证参数的顺序 -->
		<!-- <constructor></constructor> -->
		
		<!-- 映射一般的列,提供id可以用来改进性能(缓存) -->
		<id property="qtId" column="QT_ID"/>
		<result property="qtName" column="QT_NAME"/>
		<result property="status" column="STATUS"/>
		
		<association property="game" column="GAME_ID" javaType="org.mybatis.entity.GameServer">
			<id property="id" column="GAME_ID"/>
			<result property="name" column="NAME"/>
		</association>
		
		<collection property="details" column="QD_ID" ofType="org.mybatis.entity.GameQuestionDetail">
			<id property="qdId" column="QD_ID"/>
			<result property="qdName" column="QD_NAME"/>
		</collection>
	</resultMap>
</mapper> 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值