1. 程式人生 > >MyBatis 一對多對映

MyBatis 一對多對映

昨天自己完成了一個Mybatis 的資料庫一堆多對映,特此記錄,以免忘記。

 

首先資料庫如下:

Table Command

Table Command_Content

為了達到正規化要求,我將資料庫分為了兩個,一個是Command:裡面記錄了Command的ID和NAME等資訊,其中ID為主鍵;另一個是Command_Content,裡面記錄了COMMAND_CONTENT的ID,內容,以及以其關聯的Command的COMMAND_ID,其中ID為主鍵。(如上圖所有內容都是指向Command 1 的所以,COMMAND_ID為1)。

 

接下來為MyBatis 配置SQL XML:

CommandContent.xml

<?xml version="1.0" encoding="UTF-8"?>


<mapper namespace="CommandContent">

  <resultMap type="bean.CommandContent" id="Content">
    <id column="ID" jdbcType="INTEGER" property="id"/>
    <result column="CONTENT_ID" jdbcType="VARCHAR" property="contentId"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap>

  


</mapper>

主要實現了類CommandContent裡面變數與資料庫列的對映關係。

Command.xml

<mapper namespace="Command">

  <resultMap type="bean.Command" id="Command">
    <id column="C_ID" jdbcType="INTEGER" property="id"/>
    <result column="NAME" jdbcType="VARCHAR" property="name"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <collection property="contentList" resultMap="CommandContent.Content"/>
  </resultMap>

   <select id="queryCommandList" parameterType="bean.Command" resultMap="Command">
    SELECT a.ID C_ID,a.NAME,a.DESCRIPTION,b.ID,b.CONTENT,b.COMMAND_ID
    FROM command a left join command_content b
    on a.ID=b.COMMAND_ID
    <where>
      	<if test="name!=null &amp;&amp; !&quot;&quot;.equals(name.trim())">and a.NAME=#{name}</if>
    	<if test="description!=null &amp;&amp; !&quot;&quot;.equals(description.trim())">and a.DESCRIPTION like '%' #{description} '%'</if>
    </where>
  
  </select>


</mapper>

ResultMap 裡面不僅包含了類Command變數與資料庫的對映關係。還有一個<collection/>標籤去關聯需要包含的子集合也就是上面XML實現的CommandContent(因為我在類Command定義了包含關係如下圖)。

下面是SQL語句: 

SELECT a.ID C_ID,a.NAME,a.DESCRIPTION,b.ID,b.CONTENT,b.COMMAND_ID
FROM command a left join command_content b
on a.ID=b.COMMAND_ID

注意為了防止在ResultMap 的column歧義,給相同資料名其中一個起了別名用來為MyBatis區別。對於Sql 語句來說,使用left join 將兩個表一起select了條件是設計表時候的Command表的ID等於Command_Content表的COMMAND_ID。

下面的Where 裡面加了if,是前面業務邏輯的需要,這裡不過多贅述。

完成後別忘了在資料庫配置XML裡面對映這兩個Sql配置。

其他的就由程式碼邏輯完成了。