Mybatis的映射文件中顶级的标签并不多,之前有说过select、update、delete、insert、sql等标签,resultMap在之前的文章也有提过,但是当时也是简单的提过,其实这个标签里面的内容很多,可简单可复杂。正常开发中简单的基本都在使用,但是涉及到复杂的用的就少啦。
association实现一对一的查询,collection实现一对多的查询,discriminator实现鉴别器的功能,也就是根据不同的条件实现不同的关联查询。为什么说用到这些复杂的内容很少呢。以前在项目上性能要求不是很高,对分库分表概念没有那么高的时候,采用关联查询其实没有什么不好,但是现在互联网发展迅速,数据量变得庞大,查询SQL的性能要求也变得更高。关联查询在大数据量的时候执行效率不高也就格外的凸显出来了。如果看过阿里的Java开发手册可以知道,他们是不推荐关联查询,而是提倡单表操作,如果需要查其他表信息,就根据条件,操作其他单表。
虽然关联查询操作变少,但是面试的时候还是可以用来问的。不管从哪一个方面来说扩展知识面都不是坏事。
resultMap子标签之association标签
在说association标签的具体使用前,先说一下两种关联查询方式。
- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
- 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型
咋一看上面的两个概念很难理解,下面用代码体现一下。
嵌套结果方式
//用户类
public class User{
private Integer id;
private String user_name;
private String phone;
private String email;
private Father father;
}
//父亲类
public class Father{
private Integer id;
private String name;
private Integer age;
}
<!--用户表基础字段的映射关系-->
<resultMap id="userBaseColumnMap" type="com.zdydoit.core.model.User">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="phone" column="phone"/>
<result property="email" column="email"/>
</resultMap>
<!-- 嵌套结果方式 -->
<resultMap id="selectUserMap1" extends="userBaseColumnMap" type="com.zdydoit.core.model.User">
<association property="father" javaType="com.zdydoit.core.model.Father" columnPrefix="tf_">
<id property="id" column="id"/>
<result property="name&