這幾天,百度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有兩種方式:一種是查詢一次,直接映射;另一種方式是:通過association的select屬性,再次發起一個查詢,這就是傳說中的1+N問題。前者相當於邁了一大步,后者相當於小碎步走了好幾下。邁一大步的好處在於:一次完成任務,避免了多次請求數據庫,缺點是這一個大請求可能占用了數據庫大量的資源,別人沒法進行寫操作,造成等待;邁小碎步的好處在於:靈活控制,語句簡單,缺點是可能會很費時間。凡是各有利弊,只得得願老天保佑。
邁一大步:列出博客的詳細信息,包括blog_id,blog_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,記住typeAlias和as可以給一個東西重命名,這個很有用)。如果一個大類里面包含的是更多的小類,那就要用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>
四.resultMap的collections屬性
一個大類里面包含着多個小類: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 一致,在這里就不再詳細述說。
