App下載

關(guān)于MyBatis3.X復(fù)雜Sql查詢相關(guān)知識(shí)總結(jié)

猿友 2021-07-17 11:58:18 瀏覽數(shù) (1825)
反饋

MyBatis 作為一個(gè) Java 項(xiàng)目過(guò)程中常用的持久層框架,主要是進(jìn)行的是與數(shù)據(jù)庫(kù)交互的動(dòng)作。本篇文章將為您介紹 MyBatis3.X 中復(fù)雜 Sql 查詢語(yǔ)句相關(guān)的知識(shí)總結(jié),以下是詳情內(nèi)容。

MyBatis3.X復(fù)雜Sql查詢

MyBatis3.X的resultMap

1.Mybatis的sql語(yǔ)句返回的結(jié)果有兩種

  • resultType
  • 查詢出的字段在相應(yīng)的pojo中必須有和它相同的字段對(duì)應(yīng),或者基本數(shù)據(jù)類型
  • 適合簡(jiǎn)單查詢
  • resultMap

需要自定義字段,或者多表查詢,一對(duì)多等關(guān)系,比resultType更強(qiáng)大
適合復(fù)雜查詢


<resultMap id="VideoResultMap" type="Video">
	<!--
	id 指定查詢列列的唯?一標(biāo)示
	column 數(shù)據(jù)庫(kù)字段的名稱
	property pojo類的名稱
	-->
	<id column="id" property="id" jdbcType="INTEGER" />
	<result column="video_tile" property="title" jdbcType="VARCHAR" />
	<result column="summary" property="summary" jdbcType="VARCHAR" />
	<result column="cover_img" property="coverImg" jdbcType="VARCHAR" />
</resultMap>
<select id="selectBaseFieldByIdWithResultMap" resultMap="VideoResultMap">
	select id , title as video_tile, summary, cover_img from video where id = #{video_id}
</select>

ResultMap復(fù)雜對(duì)象一對(duì)一查詢結(jié)果映射之a(chǎn)ssociation

association:映射到POJO的某個(gè)復(fù)雜類型屬性,比如訂單order對(duì)象里面包含user對(duì)象


<!-- 名稱空間,需要保存全局唯一,最好是和dao層的Java接口一致
   可以映射sql語(yǔ)句到對(duì)應(yīng)的方法名參數(shù)和返回值
   mybatis是使用接口動(dòng)態(tài)代理
 -->
<mapper namespace="net.xiaotiancai.online_class.dao.VideoOrderMapper">
  <resultMap id="VideoOrderResultMap" type="VideoOrder">
    <id column="id" property="id"></id>
    <result column="user_id" property="userId"></result>
    <result column="out_trade_no" property="outTradeNo"></result>
    <result column="state" property="state"></result>
    <result column="total_fee" property="totalFee"></result>
    <result column="video_id" property="videoId"></result>
    <result column="video_title" property="videoTitle"></result>
    <!--
    配置屬性一對(duì)一
    property對(duì)應(yīng)videoOrder里面的User
    javaType對(duì)應(yīng)這個(gè)屬性的類型
    -->
    <association property="user" javaType="User">
      <id column="user_id" property="id"></id>
      <result column="name" property="name"></result>
      <result column="head_img" property="headImg"></result>
      <result column="phone" property="phone"></result>

    </association>
  </resultMap>
  <!--一對(duì)一訂單查詢,訂單內(nèi)部包含用戶屬性-->
  <select id="queryVideoOrderList" resultMap="VideoOrderResultMap">
    select
    o.id id,
    o.user_id,
    o.out_trade_no,
    o.state,
    o.total_fee,
    o.video_id,
    o.video_title,
    u.name,
    u.head_img,
    u.phone
    from video_order o left join user u on o.user_id = u.id
  </select>
</mapper>

代碼

// resultmap association關(guān)聯(lián)查詢
VideoOrderMapper videoOrderMapper =sqlSession.getMapper(VideoOrderMapper.class);
List<VideoOrder> videoOrderList = videoOrderMapper.queryVideoOrderList();
System.out.println(videoOrderList.toString());

ResultMap復(fù)雜對(duì)象一對(duì)多查詢結(jié)果映射之collection

collection: 一對(duì)多查詢結(jié)果查詢映射,比如user有多個(gè)訂單

 <resultMap id="UserOrderResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="headImg" column="head_img"/>
    <result property="phone" column="phone"/>
    <!--
    property 填寫pojo類中集合類屬性的名稱
    ofType 集合?里里?面的pojo對(duì)象
    -->
    <collection property="videoOrderList" ofType="VideoOrder">
      <!--配置主鍵,管理理order的唯?一標(biāo)識(shí)-->
      <id column="order_id" property="id"/>
      <result column="user_id" property="userId"/>
      <result column="out_trade_no" property="outTradeNo"/>
      <result column="state" property="state"/>
      <result column="total_fee" property="totalFee"/>
      <result column="video_id" property="videoId"/>
      <result column="video_title" property="videoTitle"/>
      <result column="video_img" property="videoImg"/>
    </collection>
  </resultMap>
  <select id="queryUserOrder" resultMap="UserOrderResultMap">
    select
    u.id,
    u.name,
    u.head_img,
    u.phone,
    o.id order_id,
    o.out_trade_no,
    o.user_id,
    o.state,
    o.total_fee,
    o.video_id,
    o.video_title
    from user u left join video_order o on u.id = o.user_id
  </select>

代碼

// resultmap association關(guān)聯(lián)查詢
VideoOrderMapper videoOrderMapper =sqlSession.getMapper(VideoOrderMapper.class);
//resultmap collection測(cè)試
List<User> userList = videoOrderMapper.queryUserOrder();
System.out.println(userList.toString());

Mybatis3.X ResultMap復(fù)雜對(duì)象查詢總結(jié)

總結(jié)ResultMap的復(fù)雜對(duì)象查詢

  • association映射的是一個(gè)pojo類,處理一對(duì)一的關(guān)聯(lián)關(guān)系。
  • collection映射的一個(gè)集合列表,處理的是一對(duì)多的關(guān)聯(lián)關(guān)系。
  • 模板
<!--column不做限制,可以為任意表的字段,而property須為type定義的pojo屬性-->
<resultMap id=“唯一的標(biāo)識(shí)”type=“映射的pojo對(duì)象">
	<id column="表的主鍵字段,或查詢語(yǔ)句中的別名字段”jdbcrype="字段類型”property=“映射pojo對(duì)象的主鍵屬性"/>
	<result column="表的一個(gè)字段”jdbcrype="字段類型”property=“映射到pojo對(duì)象的一個(gè)屬性"/>
	<association property="pojo的一個(gè)對(duì)象屬性”javarype="pojo關(guān)聯(lián)的pojo對(duì)象">
  <id column="關(guān)聯(lián)pojo對(duì)象對(duì)應(yīng)表的主鍵字段”jdbcrype="字段類型”property="關(guān)聯(lián)pojo對(duì)象的屬性"/>
	<result column="表的字段”jdbcrype="字段類型”property="關(guān)聯(lián)pojo對(duì)象的屬性"/>
</association>
<!--集合中的property 需要為oftype定義的pojo對(duì)象的屬性-->
<collection property="pojo的集合屬性名稱”ofType="集合中單個(gè)的pojo對(duì)象類型">
 	<id column="集合中pojo對(duì)象對(duì)應(yīng)在表的主鍵字段”jdbcrype="字段類型”property=“集合中pojo對(duì)象的主鍵屬性”/>
	<result column="任意表的字段”jdbcrype="字段類型”property="集合中的pojo對(duì)象的屬性”/>
</collection>
</resultMap>

以上就是關(guān)于MyBatis3.X復(fù)雜Sql查詢相關(guān)知識(shí)總結(jié)的全部?jī)?nèi)容,想要了解更多相關(guān)MyBatis框架的其他內(nèi)容請(qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持!

0 人點(diǎn)贊