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的时候要注意
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
原文出处:https://blog.csdn.net/jiamaRay/article/details/108688542
相关文章
- 这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
- 这篇文章主要介绍了解决Mybatis 大数据量的批量insert问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-09
- 这篇文章主要介绍了mybatis的Configuration详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-04
mybatis 返回Integer,Double,String等类型的数据操作
这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25- 数据库中的数据删除会分为两种:物理删除 和 逻辑删除,接下来通过本文给大家介绍MyBatis-Plus的物理删除和逻辑删除使用场景分析,感兴趣的朋友一起看看吧...2021-09-25
Springboot如何使用mybatis实现拦截SQL分页
这篇文章主要介绍了Springboot使用mybatis实现拦截SQL分页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-19- 这篇文章主要介绍了Mybatis执行update失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
- 这篇文章主要介绍了Mybatis plus中使用in查询出错的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-06
- Mybatis-Plus是一个Mybatis的增强工具,它在Mybatis的基础上做了增强,却不做改变,Mybatis-Plus是为简化开发、提高开发效率而生,但它也提供了一些很有意思的插件,比如SQL性能监控、乐观锁、执行分析等,下面一起看看mybatis-plus雪花算法自动生成机器id原理解析...2021-06-04
解决Mybatis中mapper.xml文件update,delete及insert返回值问题
这篇文章主要介绍了解决Mybatis中mapper.xml文件update,delete及insert返回值问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-23- 这篇文章主要介绍了Mybatis用注解写in查询的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-13
Mybatis之Select Count(*)的获取返回int的值操作
这篇文章主要介绍了Mybatis之Select Count(*)的获取返回int的值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-23- 这篇文章主要介绍了Mybatis和Mybatis-Plus时间范围查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-06
Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用详解
这篇文章主要介绍了Springboot mybatis plus druid多数据源解决方案 dynamic-datasource的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-18- 这篇文章主要介绍了mybatis Map查询结果下划线转驼峰的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-24
Mybatis Plus 字段为空值时执行更新方法未更新解决方案
这篇文章主要介绍了Mybatis Plus 字段为空值时执行更新方法未更新解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-03关于IDEA 2020使用 mybatis-log-plugin插件的问题
这篇文章主要介绍了关于IDEA 2020使用 mybatis-log-plugin插件的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-10- 这篇文章主要介绍了基于MyBatis的parameterType传入参数类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-29
- 这篇文章主要介绍了Mybatis返回结果封装map过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
- JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一,那么这篇文章主要给大家介绍了关于原生Javascript实现继承方式及其优缺点的相关资料,需要的朋友可以参考下...2021-07-21