Mybatis resultMap标签继承、复用、嵌套方式

 更新时间:2022年03月10日 14:50:09   作者:王二小丷  
这篇文章主要介绍了Mybatis resultMap标签继承、复用、嵌套方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

resultMap标签继承、复用、嵌套

记录演示 Mybatis 中 resultMap 标签继承、复用(包括跨文件)以及多层嵌套的使用方法,

  • 继承: 继承已存在的 resultMap 标签进行扩展
  • 复用: 跨mapper文件引用现存的 resultMap 标签
  • 嵌套: 多层嵌套的JavaBean与 resultMap 映射方法

定义表与实体类

创建三个表 group member score

score 与 member 一对一,通过 score.id 关联

group 与 member 一对多,通过 group.id 关联

create table `score` (
    `id` int comment '主键',
    `math` float comment '数学成绩',
    `history` float comment '历史成绩',
    primary key (`id`)
)
create table `member` (
    `id` int comment '主键',
    `name` varchar comment '姓名',
    `group_id` int comment '所属组group表id',
    `score_id` int comment '成绩Score表id',
    primary key (`id`)
)
create table `group` (
    `id` int comment '主键',
    `name` varchar comment '组名',
    primary key (`id`)
)

实体类

创建三个实体类 Group Member Score

Score 类的对象是 Member 类的成员变量

Member 类的对象集合是 Group 类的成员变量

/** 成绩类 */
public class Score {
    private Integer id;
    /** 数学成绩 */
    private Float math;
    /** 历史成绩 */
    private Float hitory;
    ...getter And setter...
}
/** 成员类 */
public class Member {
    private Integer id;
    /** 姓名 */
    private String name;
    /** 分数对象 */
    private Score score;
    ...getter And setter...
}
/** 组类 */
public class Group {
    private Integer id;
    /** 组名 */
    private String groupName;
    /** 成员 */
    private List<Member> members;
    ...getter And setter...
}

定义与表映射的 resultMap

在 BeanMapper.xml 定义最基本的与数据库表字段映射的 resultMap 标签

<?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">
<mapper namespace="com.example.BeanMapper">
    <!-- Score实体类映射 -->
    <resultMap id="scoreMap" type="com.example.Score">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="math" jdbcType="FLOAT" property="math" />
        <result column="history" jdbcType="FLOAT" property="history" />
    </resultMap>
    <!-- Member实体类映射 -->
    <resultMap id="memberMap" type="com.example.Member">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
    </resultMap>
    <!-- Group实体类映射 -->
    <resultMap id="groupMap" type="com.example.Group">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="groupName" />
    </resultMap>
</mapper>

继承、复用、嵌套

创建 DemoMapper.xml,演示标签的继承、复用、嵌套

复用现存标签时若位于相同mapper文件可直接使用 resultMap 的 id 属性引用,跨文件时需要指定 namespace 属性才可正常引用

  • extends: 继承,可继承其他 resultMap 并加以扩展
  • association: 复用现存的 resultMap,适用于对应的属性为单JavaBean时,使用 javaType 指定Java类型
  • collection: 复用现存的 resultMap,适用于对应的属性为JavaBean集合时,使用 ofType 指定Java类型
  • columnPrefix: 只将该属性指定前缀的属性赋值给当前 resultMap,存在多层嵌套时每进入一层就会将本层前缀截取掉。

如下面的mapper文件中,外层的 fullMemberMap 前缀为 member_,经本次筛选 member_score_id -> score_id,

内层的 scoreMap 前缀为 score_,经本次筛选 score_id -> id,最终被赋值给 Score.id

所以只有形如 member_score_id 的字段才会最终进入 scoreMap 的取值范围中

若是不复用只是单纯嵌套,则可以直接将三个类写在一个 resultMap 标签内实现

<?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">
<mapper namespace="com.example.DemoMapper">
    <!-- extends: 继承 -->
    <resultMap id="fullMemberMap" extends="com.example.BeanMapper.memberMap" type="com.example.Member">
        <!-- association: 复用已存在的resultMap,单JavaBean属性时使用
                        使用javaType属性指定JavaBean的类型
                        跨文件引用需指定namespace -->
        <!-- columnPrefix: 只从 score_ 开头的字段为当前resultMap取值 -->
        <association  property="score" resultMap="com.example.BeanMapper.scoreMap" javaType="com.example.Score" columnPrefix="score_" />
    </resultMap>
    
    <resultMap id="fullGroupMap" extends="com.example.BeanMapper.groupMap" type="com.example.Group">
        <!-- collection: 复用已存在的resultMap,JavaBean集合属性时使用
                        使用ofType属性指定JavaBean的类型
                        同文件引用无需指定namespace -->
        <!-- columnPrefix: 只从 member_ 开头的字段为当前resultMap取值
                        进入fullMemberMap内嵌套的scoreMap时前缀 member_ 会被去除,即 member_score_id 字段才能被scoreMap正确接收 -->
        <collection property="members" ofType="com.example.Member" resultMap="fullMemberMap" columnPrefix="member_"/>
    </resultMap>
    <!-- 直接引用最终的resultMap,并根据columnPrefix属性设置的前缀为各个字段指定不同的别名 -->
    <select id="selectGroupById" parameterType="java.lang.Integer" resultMap="fullGroupMap">
        select g.id, g.name,
               m.id member_id, m.name member_name,
               s.id member_score_id, s.math member_score_math, s.history member_score_history
          from `group` g
            left join `member` m on m.group_id = g.id
            left join `score` s on s.id = m.score_id
          where g.id = #{id,jdbcType=INTEGER}
    </select>
</mapper>

使用resultMap需要注意的地方

今天主要还是根据需求在进行sql的编写 ,在mybatis里面进行复查和复用的时候一定要去看所对应的有没有这个类 ,今天弄了几个dto,还有时间戳的转换,java里面的时间戳是以毫秒来进行计算的。

所以说在专用mysql的时候要注意

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实例化的几种方法总结

    Java实例化的几种方法总结

    这篇文章主要介绍了Java实例化的几种方法总结的相关资料,需要的朋友可以参考下
    2017-04-04
  • Idea如何去除Mapper警告方法解析

    Idea如何去除Mapper警告方法解析

    这篇文章主要介绍了Idea如何去除Mapper 警告的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java中MapStruct的使用详解

    Java中MapStruct的使用详解

    这篇文章主要介绍了Java中MapStruct的使用详解,mapstruct,全称是org.mapstruct.Mapper, 是将接口或抽象类标记为映射器,并通过MapStruct为这个接口或者抽象类生成一个实现类,大大简化了Java bean类型之间转换,需要的朋友可以参考下
    2023-09-09
  • java 集合----Map、Collection

    java 集合----Map、Collection

    HashSet 的 add() 方法添加集合元素时实际上转变为调用 HashMap 的 put()方法来添加 key-value 对。HashMap 的 put() 方法.hashCode() 判断返回值相等,如果返回值相等则再通过 equals 比较也返回 true,最终认为key对象是相等的已经在HashMap中存在。
    2016-04-04
  • Java中计算集合中元素的出现次数统计

    Java中计算集合中元素的出现次数统计

    本文主要介绍了Java中计算集合中元素的出现次数统计,使用Collections类配合HashMap来统计和java lamb 计算这两种方式,具有一定的参考价值,感兴趣可以了解一下
    2024-02-02
  • 十分钟速懂java知识点 System类

    十分钟速懂java知识点 System类

    这篇文章主要介绍了java知识点System类,根据一次面试总结的,可以十分钟速懂System类,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Java优先队列(PriorityQueue)重写compare操作

    Java优先队列(PriorityQueue)重写compare操作

    这篇文章主要介绍了Java优先队列(PriorityQueue)重写compare操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • SpringBoot整合阿里云开通短信服务详解

    SpringBoot整合阿里云开通短信服务详解

    这篇文章主要介绍了如何利用SpringBoot整合阿里云实现短信服务的开通,文中的示例代码讲解详细,对我们学习有一定帮助,需要的可以参考一下
    2022-03-03
  • CGLIB代理的使用与原理解析

    CGLIB代理的使用与原理解析

    这篇文章主要介绍了CGLIB代理的使用与原理解析,静态代理和JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理,这就是Cglib代理,需要的朋友可以参考下
    2023-09-09
  • springboot+redis实现简单的热搜功能

    springboot+redis实现简单的热搜功能

    这篇文章主要介绍了springboot+redis实现一个简单的热搜功能,通过代码介绍了过滤不雅文字的过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论