映射文件:
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:
- JavaType和ofType都是用来指定对象类型的
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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:
- Java基础部分
- 算法与编程
- 数据库部分
- 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)
这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。
作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加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)]