Mybatis 中resultMap

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 是一對多, 但是我發現使用哪個都可以 …

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章