mybatis resultMap映射學習筆記


這幾天,百度mybatis突然看不到官網了,不知道百度怎么整的。特此貼出mybatis中文官網:

http://www.mybatis.org/mybatis-3/zh/index.html

一個學習mybatis的英文網站:http://mybatis.co.uk/

一.概論

大類里面有一個小類用association,大類里面有多個小類用collection。之前學習過json或者xml-rpc,里面的組合數據類型都是兩種:數組和結構體。數組就是集合,就是序列。結構體就是映射,就是鍵值對。

二.關於typeAliases屬性

_byte映射的是byte(值類型),byte映射的是Byte(引用類型)。系統已經為許多常見的 Java 類型內建了相應的類型別名。它們都是大小寫不敏感的,需要注意的是由基本類型名稱重復導致的特殊處理。下面是一些非基本數據類型的別名定義,左邊是mybatis的,右邊是對應的java中的對象。

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

三.association的用法

大類里面有一個小類,那就用association。用association有兩種方式:一種是查詢一次,直接映射;另一種方式是:通過associationselect屬性,再次發起一個查詢,這就是傳說中的1+N問題。前者相當於邁了一大步,后者相當於小碎步走了好幾下。邁一大步的好處在於:一次完成任務,避免了多次請求數據庫,缺點是這一個大請求可能占用了數據庫大量的資源,別人沒法進行寫操作,造成等待;邁小碎步的好處在於:靈活控制,語句簡單,缺點是可能會很費時間。凡是各有利弊,只得得願老天保佑。

邁一大步:列出博客的詳細信息,包括blog_idblog_title及作者的id,用戶名,密碼,性別等信息,也就是class Blog里有一個成員變量User author

<select id="test2" parameterType="int" resultMap="test2Map" >

        select

         B.id as blog_id,

         B.title as blog_title,

         B.author_id as blog_author_id,

         A.id as author_id,

         A.username as author_username,

         A.password as author_password,

         A.email as author_email,

         A.bio as author_bio,

         A.favourite_section as author_favourite_section

        from

         Blog B

         left join Author A on (B.author_id = A.id)

        where

         B.id = #{id}

    </select>

    <resultMap type="Blog" id="test2Map">

        <id property="id" column="blog_id" javaType="int"/>

        <result property="title" column="blog_title" javaType="string"/>

        <association property="author" column="blog_author_id" javaType="Author">

            <id property="id" column="author_id" javaType="_int"/>      <result property="username" column="author_username" javaType="string"/>      <result property="password" column="author_password" javaType="string"/>      <result property="email" column="author_email" javaType="string"/>      <result property="bio" column="author_bio" javaType="string"/>      <result property="favouriteSection" column="author_favourite_section" javaType="string"/>

        </association></resultMap>

邁兩次小碎步:首先獲取用戶的id,再發起一次查詢。

<resultMap type="Blog" id="test2Map">

        <id property="id" column="blog_id" javaType="int"/>

        <result property="title" column="blog_title" javaType="string"/>

        <association property="author" column="blog_author_id" javaType="Author" select="test2DivideSelect">

        </association>

    </resultMap>

    <select id="test2DivideSelect" parameterType="int" resultType="Author">

        select * from author where id = #{id}</select>

不一定是大類里面包含一個小類,可能是兩三個個小類,這時邁一大步就需要通過association標簽的columnPrefix屬性(相對應的查詢語句也要多用as,記住typeAliasas可以給一個東西重命名,這個很有用)。如果一個大類里面包含的是更多的小類,那就要用List<小類>了。

<resultMap id="blogResult" type="Blog">    

<id property="id" column="blog_id" />   

 <result property="title" column="blog_title" />   

 <association property="author" resultMap="authorResult" />   

 <association property="coAuthor" resultMap="authorResult"      columnPrefix="co_" />

</resultMap>

四.resultMapcollections屬性

一個大類里面包含着多個小類:class User里面有一個成員變量List<Blog>blogs也就是說一個用戶對應多篇文章。

<select id="test3" parameterType="int" resultMap="test3Map">

        select

         A.id as author_id,

         A.username as author_username,

         A.email as author_email,

         B.id as blog_id,

         B.title as blog_title,

         B.author_id as blog_author_id

        from

         Author A

         left join Blog B on (A.id = B.author_id)

        where

         A.id = #{id}

    </select>

    <resultMap type="Author" id="test3Map">

        <id column="author_id" property="id" javaType="_int"/>

        <result column="author_username" property="username" javaType="string"/>

        <result column="author_email" property="email" javaType="string"/>

        <collection column="blog_author_id" property="blogs" javaType="ArrayList" ofType="Blog">

            <id column="blog_id" property="id" javaType="_int"/>

            <result column="blog_title" property="title" javaType="string"/>

        </collection></resultMap>

就如上述所說, collection 即表示“多個  的關系, 必須注意的是,一定要指定ofType 屬性,這個 ofType 屬性指的是集合的元素類型,缺少這個屬性, MyBatis 會報出設定參數錯誤的提示 

 

就如同 association 一樣, collection 也分兩種:一種為嵌套查詢 select ,另一種為嵌套結果 resultMap ,用法也跟 association 一致,在這里就不再詳細述說。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM