昨天自己完成了一个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配置。
其他的就由代码逻辑完成了。