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 && !"".equals(name.trim())">and a.NAME=#{name}</if> <if test="description!=null && !"".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配置。
其他的就由程式碼邏輯完成了。