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 是一对多, 但是我发现使用哪个都可以 …

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