resultMap
resultMap是Mybatis最強大的元素
它可以將查詢到的複雜數據(比如查詢到幾個表中數據)映射到一個結果集當中。
<!--column不做限制,可以爲任意表的字段,而property須爲type 定義的pojo屬性-->
<resultMap id="唯一的標識" type="映射的pojo對象">
<id column="表的主鍵字段,或者可以爲查詢語句中的別名字段" jdbcType="字段類型" property="映射pojo對象的主鍵屬性" />
<result column="表的一個字段(可以爲任意表的一個字段)" jdbcType="字段類型" property="映射到pojo對象的一個屬性(須爲type定義的pojo對象中的一個屬性)"/>
<association property="pojo的一個對象屬性" javaType="pojo關聯的pojo對象">
<id column="關聯pojo對象對應表的主鍵字段" jdbcType="字段類型" property="關聯pojo對象的主席屬性"/>
<result column="任意表的字段" jdbcType="字段類型" property="關聯pojo對象的屬性"/>
</association>
<!-- 集合中的property須爲oftype定義的pojo對象的屬性-->
<collection property="pojo的集合屬性" ofType="集合中的pojo對象">
<id column="集合中pojo對象對應的表的主鍵字段" jdbcType="字段類型" property="集合中pojo對象的主鍵屬性" />
<result column="可以爲任意表的字段" jdbcType="字段類型" property="集合中的pojo對象的屬性" />
</collection>
</resultMap>
- 這裏定義一個例子
用戶 ---- 角色 ---- 權限 (一個用戶對應一個角色(管理者 或 遊客 ) , 一個角色有多個權限 (增刪改查) )
用戶類
//User屬性:1、唯一ID 2、用戶名 3、密碼 4、擁有的Role
public class User {
private Integer uid;
private String username;
private String password;
private Role role;
}
省略 get set-------
角色類
//Role存在:1、唯一ID 2、角色名 3、角色擁有的權限 4、擁有該角色的用戶(可以不需要)
public class Role {
private Integer rid;
private String rname;
private Set<Permission> permissions = new HashSet<>(); //該集合用來存儲各個權限
}
省略 get set-------
權限類
//Permission存在:1、唯一ID 2、權限名 3、。。。
public class Permission {
private Integer pid;
private String name;
private String url;
}
省略 get set-------
Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace必須是唯一的,建議用該文件所在的包路徑全類名 -->
<mapper namespace="IOC.Mybatis_spring.UserMapper">
<resultMap id="userMap2" type="IOC.Mybatis_spring.pojo.User">
<id property="uid" column="uid"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<association property="role" resultMap="roleMap"/> <!--直接引用rolemap-->
</resultMap>
<!--角色對象的Type 定義java Bean的屬性與數據庫的列之間的映射 -->
<resultMap id="roleMap" type="IOC.Mybatis_spring.pojo.Role">
<id property="rid" column="rid"/>
<result property="rname" column="rname"/>
<collection property="permissions" resultMap="permissMap"/> <!--直接引用permissMap-->
</resultMap>
<!-- 權限對象的Type 定義java Bean的屬性與數據庫的列之間的映射 -->
<resultMap id="permissMap" type="IOC.Mybatis_spring.pojo.Permission">
<id property="pid" column="pid"/>
<result property="name" column="name"/>
<result property="url" column="url"/>
</resultMap>
<select id="select" parameterType="string" resultMap="userMap2">
SELECT
u.*,r.*,p.*
FROM
USER u
JOIN user_role ur ON ur.uid = u.uid -- 用戶id 等於 ur中間表的用戶id --
JOIN role r ON r.rid = ur.rid -- 角色id 等於 ur中間表的角色id --
JOIN permission_role pr ON r.rid = pr.rid -- 角色id 等於 pr中間表的角色id --
JOIN permission p ON p.pid = pr.pid -- 權限id 等於 pr中間表的權限id --
AND u.uid =#{id} -- 當獲取到用戶的ID,就可以推算出角色表和權限表,最後知道角色是什麼,權限是什麼 --
</select>
</mapper>
疑點: 網上說的 association 是一對一 ,collection 是一對多, 但是我發現使用哪個都可以 …