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

作者:王二小丷 时间:2023-06-27 13:27:43 

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的时候要注意

来源:https://blog.csdn.net/jiamaRay/article/details/108688542

标签:Mybatis,resultMap,继承,复用,嵌套
0
投稿

猜你喜欢

  • Java环境配置与编译运行详解

    2022-10-02 12:42:24
  • Java使用Math.random()结合蒙特卡洛方法计算pi值示例

    2023-05-10 10:43:13
  • java数独游戏完整版分享

    2023-05-22 07:09:56
  • Java之NIO基本简介

    2021-12-20 22:15:44
  • 基于Android SQLite的升级详解

    2021-06-24 05:26:05
  • Android Scroller的使用方法

    2023-02-03 03:57:01
  • Android实现调用摄像头进行拍照功能

    2021-07-16 20:26:07
  • Java多线程实现Runnable方式

    2022-06-29 17:09:46
  • 浅析Android TextView常用属性

    2022-12-20 00:32:18
  • C#基于XNA生成随机颜色的方法

    2021-07-05 08:34:50
  • C#中 MessageBox的使用技巧

    2023-06-25 16:15:48
  • C#实现自定义光标并动态切换

    2021-09-25 09:06:28
  • Android viewpager中动态添加view并实现伪无限循环的方法

    2022-11-17 12:59:08
  • java导出Excel通用方法实例

    2023-10-27 04:43:33
  • Java Spring AOP之PointCut案例详解

    2023-05-24 16:46:15
  • java中map和对象互转工具类的实现示例

    2023-06-05 11:08:30
  • AndroidStudio实现能在图片上涂鸦程序

    2023-09-14 06:57:02
  • C# 泛型集合类List<T>使用总结

    2021-08-30 02:04:01
  • 【IntelliJ IDEA】Maven构建自己的第一个Java后台的方法

    2023-09-24 20:11:16
  • Java经典面试题汇总:网络编程

    2021-12-12 11:53:33
  • asp之家 软件编程 m.aspxhome.com