1. 程式人生 > >mybatis -- HashMap 用法/例項:查詢文章分類下文章的數目

mybatis -- HashMap 用法/例項:查詢文章分類下文章的數目

有兩張表,一張是文章分類表category,兩個欄位(id 分類編號,title 分類名稱);

                  一張是文章表article,三個欄位(id 文章編號,name 文章標題 ,content 文章內容,categoryid 所屬文章分類)

需求: 利用sql查找出一個分類下文章的數目。

分析:常規 xml中  寫 sql

SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
FROM CATEGORY tab1 LEFT JOIN 
(SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
ON tab1.id = tab2.categoryid
最終我們需要三個欄位,分類id   分類名稱name 和每個分類下的數目count,三個欄位裡兩個欄位是文章分類表裡有的,而第三個沒有,這時就不能直接返回分類表對應的實體類了。採用HashMap就可以很方便的解決這個問題。

mybatis  xml 檔案中程式碼如下:

<select id="xxxxx" resultType="java.util.HashMap">
    SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
    FROM CATEGORY tab1 LEFT JOIN
    (SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
    ON tab1.id = tab2.categoryid
</select>

返回值是HashMap型別,可以理解為動態的建立了一個HashMap集合,以鍵值對的形式儲存從資料庫裡的返回值,map.put("ID",xxx);    map.put("NAME",xxx);    map.put("COUNT",xxx);

需要注意的有兩點:

1.在Mapper.java裡,返回型別應寫成    List<Map<String,Object>>

2.map裡的鍵全都是相應欄位的大寫字母:map.put("ID",xxx);    map.put("NAME",xxx);    map.put("COUNT",xxx);

這裡貼一張資料庫檢視的結果方便理解:

補充:今天又遇到一個問題,如果title在資料庫裡的型別是clob型別,就取不到漢字了,需要對取出來的欄位做型別處理,直接應用ResultMap將會更簡單,下面直接上程式碼

xxxMapper.xml 程式碼:

<resultMap type="HashMap" id="categoryHashMap">
    <result property="ID" column="id"/>
    <result property="TITLE" column="title" javaType="String"/> <!-- 這裡將clob型別直接轉換為了String型別 -->
    <result property="COUNT" column="count"/>
</resultMap>

<select id="xxxxx" resultMap="categoryHashMap">
    SELECT tab1.id AS id,tab1.title AS title,nvl(tab2.count,0) AS COUNT
    FROM CATEGORY tab1 LEFT JOIN
    (SELECT COUNT(ID) AS COUNT,categoryid FROM ARTICLE ar GROUP BY ar.categoryid) tab2
    ON tab1.id = tab2.categoryid
</select>

 -----   筆者水平有限,如有不嚴謹的地方,請指教必改。