Mybatis 中resultMap

本文详细解析了MyBatis框架中resultMap元素的强大功能,通过实例展示了如何使用resultMap进行复杂数据映射,包括一对一(association)和一对多(collection)关系的处理,适用于多表查询场景。

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

MyBatis中,resultMap是用于自定义查询结果映射的一种方式。它可以通过指定字段名和属性名的对应关系来进行映射,并且可以选择性地指定要显示的列。使用resultMap可以实现更加灵活和定制化的结果映射操作。 需要注意的是,在使用resultMap时,字段名和属性名需要保持一致,这样才能进行自动映射匹配。在默认映射级别下,即使没有显式地进行属性名和字段名的匹配,只要字段名和属性名一致,就可以在后台获取到未匹配过的属性值。但是如果字段名和属性名不一致,并且在resultMap中也没有进行映射,那么就无法在后台获取并输出未匹配的属性值。 总结来说,resultMapMyBatis中用于自定义查询结果映射的一种机制,可以灵活地进行字段和属性的映射,提供了更多的定制化选项。在使用resultMap时,需要注意字段名和属性名的一致性,以及在需要自动映射未匹配属性值的情况下,进行相应的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* *3* *4* [MyBatisresultMap详解](https://blog.youkuaiyun.com/weixin_49707895/article/details/109564527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值