MyBatis-详解ResultMap结果映射

映射文件:

select * from blog where id=#{id}

讲解

idArg:一般是作为主键元素,方便全局调用。 javaType:指Java类该属性的类型,可以是完全限定名,或一个类型别名(例如:int的类型别名就是_int,Integer的类型别名就是int) name:指构造方法的参数名,需要对构造方法用@Param(“指定名字”)指定相应属性的名字,不然MyBatis不知道。

3.关联association

===============

介绍一对一的关系,将结果包装成这种类型,例如:

一篇博客只有一个作者,但一个作者可以有多篇博客,那么就应该在博客这边关联作者,对博客而言,他只需认定一个作者即1对1。

Blog实体类:

public class Blog {

private int id;

private String name;

private String pwd;

private Author author;

//set,get,无参,有参

}

Author实体类:

public class Author {

private int author_id;

private String author_name;

private String author_pwd;

//set,get,无参,有参

}

注意:现在有两个实体类了,意味着为了规范化,需要在resource目录下创建实体类相同的目录,将两个映射文件AuthorMapper.xml和BlogMapper.xml移到该目录下并记得去配置文件重新匹配路径,这是为了规范化,当然,你不这么做也可以,只是当项目大了之后就会非常难以维护。

配置文件配置路径:

这是我的目录截图:

MyBatis 有两种不同的方式加载关联:

  • 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。

  • 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。

3.1关联的嵌套 Select 查询


属性

select:用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句

AuthorMapper接口:

public interface AuthorMapper {

public Author getAuthor(int author_id);

}

BlogMapper接口:

public interface BlogMapper {

public Blog selectBlogById(int id);

}

映射文件:

AuthorMapper.xml

select * from author where author_id=#{id}

BlogMapper.xml

select * from blog where id=#{id}

讲解

property:实体的属性名

column:数据库的字段名

javaType:表示传给实体对象的类型是Author

select:将column拿到的author_id的值传进去,getAuthor根据传进来的id值拿到Author这个对象,并返回去。

注意:如果希望通过两个或多个参数确定Author的对象,则column的取值可以用**“,”**分割。

AuthorMapper.xml

select * from author where author_id=#{id} and author_name=#{name}

BlogMapper.xml

select * from blog where id=#{id}

讲解

通过column定义的id,name,然后用select将id和name传入getAuthorByIdAndName,进入返回Author.

3.2关联的嵌套结果映射


属性:

resultMap :结果映射的 ID,可以将此关联的嵌套结果集映射到一个合适的对象树中。

嵌套结果映射又分为两种

1.结果映射作为子元素嵌套在内

2.外部结果映射元素来映射关联

3.2.1结果映射作为子元素嵌套在内

接口方法:

public Blog selectBlog();

映射文件:

select a.,b. from blog b,author a

讲解

查询出两个表的所有属性,然后利用这些属性在Blog里面进行分配,association则是用这些属性,生成一个Author对象

注意

id 元素在嵌套结果映射中扮演着非常重要的角色。你应该总是指定一个或多个可以唯一标识结果的属性。 虽然,即使不指定这个属性,MyBatis 仍然可以工作,但是会产生严重的性能问题。

3.2.2.外部结果映射元素来映射关联

这种方式的特点是子结果映射可重用

映射文件:

讲解

查询出所有元素后,利用resultMap嵌套了另一个resultMap—getAuthor,getAuthor同样能拿到所有的属性字段,并生成一个Author对象返回。

4.collection 一对多级联

==================

讲解:一个作者可以有多个博客,那么为了获取作者的全部博客,我们可以对实体类Author进行如下定义

public class Author {

private int author_id;

private String author_name;

private String author_pwd;

private List blogs;

//get,set,有参构造,无参构造

}

对于这样的映射文件的实现方式,又分为两种

1.集合的嵌套 Select 查询

2.集合的嵌套结果映射

4.1集合的嵌套 Select 查询


接口:

public Author getAuthor(int author_id);

映射文件:

AuthorMapper.xml

select a.,b. from blog b,author a where b.author_id=#{id}

<collection property=“blogs” javaType=“ArrayList” column=“id” ofType=“Blog”

select=“com.yixin.dao.BlogMapper.selectBlogById”/>

BlogMapper.xml

select * from blog where id=#{id}

讲解

column拿到字段id,传递给select,然后通过返回一个Blog组成集合blogs。

Collection:

  • JavaTypeofType都是用来指定对象类型的

JavaType是用来指定pojo中属性的类型

ofType指定的是映射到list集合属性中pojo的类型

4.2集合的嵌套结果映射


映射文件:

select a.,b. from blog b,author a where b.author_id=#{id}

讲解

ofType:指定的是映射到list集合属性中pojo的类型

property:该集合的属性名

5.鉴别器

=====

介绍:

有时候,一个数据库查询可能会返回多个不同的结果集,鉴别器元素就是被设计来应对这种情况的,另外也能处理其它情况,例如类的继承层次结构。 鉴别器的概念很好理解——它很像 Java 语言中的 switch 语句。

理解:一个作者的博客可以有多种类型,可以是技术类型的,娱乐类型的,工作类型等等,而这些类型的博客都是继承了Blog这个类,当我们要去找出某种类型的博客时(type_blog),并将其加载出来,这时候就需要用到鉴别器了。

class TechnologyBlog extends Blog{

private String study;

}

class PlayBlog extends Blog{

private String game;

}

通过type_blog这个属性判定要加载哪个博客。

对于Author这个表的属性如下:

int id,

String name,

String pwd,

int type_blog,

study,

game.

映射文件:

讲解

MyBatis 会从结果集中得到每条记录,然后比较它的 best_blog 值。 如果它匹配任意一个鉴别器的 case,就会使用这个 case 指定的结果映射。就像继承关系一样,resultMap也可以继承,在父类的基础上加入自己的属性

注意:这个过程是互斥的,也就是说,剩余的结果映射将被忽略。

如果匹配到的是technologyResult,那么就只有TechnologyBlog这个类会被加载,返回结果也是返回TechnologyBlog这个对象。

看完上面的代码你如果觉得太复杂,更倾向于简洁的映射风格,那么也可以换成以下这种写法:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

  • 算法与编程

  • 数据库部分

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-c1PWdAeR-1712861376115)]

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

[外链图片转存中…(img-EL1WBiAY-1712861376115)]

  • 算法与编程

[外链图片转存中…(img-Qd0hcSvm-1712861376115)]

  • 数据库部分

[外链图片转存中…(img-KWiaKpzq-1712861376116)]

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

[外链图片转存中…(img-Qnu9RqjR-1712861376116)]

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-xTPvypHc-1712861376116)]

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值