基于Mapper代理配置Mybatis多表查询的一对一映射(三种方式)
一、mybatis多表联查使用内连接
1、两表联查中一对一关系对于POJO的体现(截图忽略了get,set方法)
2、编写对应的PaperMapper接口和在同目录下创建对应sql映射文件PaperMapper.xml
注意:
这里我们在mybatis总配置里设置包扫描
<mappers>
<!-- 自动扫描指定包中的sql映射文件 -->
<package name="com.ashes.mapper"/>
</mappers>
(批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中
上边规范的前提是:使用的是mapper代理方法)
(1)mapper接口类名和mapper.xml映射文件名称保持一致,且namespace的值习惯上是包名家接口名
(2)Paper:方法返回值类型,对应select标签的resultMap,我们可以通过rm(自定义)找到对应id为rm的
resultMap,它的type的类型就是我们的Paper对应的POJO,因此找到我们的返回值类型
(3)getPaper:方法名,对应select标签的id,这里使用了代理模式,我们需要保证Mapper接口方法名和
Mapper.xml中定义的每个statement的id相同
(4)int pid: 参数,对应select标签中的parameterType的Integer
3、补充:
(1)<![CDATA[xxxxxx]]>:将标签内容当文本输出
(2)resultMap中的type:将查询结果映射到指定的POJO中
(3)id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
(4)property:订单信息的唯 一标识列所映射到POJO的Paper中哪个属性
(5)column:订单信息的唯 一标识 列(数据库)
(6)association:用于映射关联查询单个对象的信息 property:要将关联查询的学生信息映射到Paper中哪个属性
(7)javaType:对应学生信息的POJO
4、测试
二、mybatis多表联查使用嵌套查询,执行多个sql操作(涉及延迟加载知识,后续讲解)
1、编写新的方法,规范如上
(1)通过rm2找到id为rm2的resultMap,可以看看(4)type是我们需要的返回类型
(2)resultMap执行到association时,通过select值getStu找到对应id为getStu的select的sql语句,我们可以看到resultType(3)是我们在association中需要的返回值类型
2、测试
注意:如果我们使用延迟加载(可以提高我们的效率)
(1)使用延迟加载
(此处只有一条sql语句执行)
但是我们用延迟加载的时候需要做一个重要配置
Mybatis的检索策略:
1、立即检索:在对象的关联查询中,查询一方的数据,会立即检索关联方的数据(属于默认的检索策略)
2、延迟检索(懒加载):在对象的关联查询,查询一方数据,不会立即检索关联方数据,只有等到访问关联方对象的属性时,才发送sql语句去查询
(2)不使用延迟加载
(不使用延迟加载就会一次执行两条sql)
内连接的使用会涉及笛卡尔积,效率不够高,一般建议使用嵌套查询,使用延迟加载
三、mybatis多表联查使用resultType
使用Map存储,resultType的值为hashmap,接口的方法返回值为Map,得到的结果集存入map中,
其中key是数据库的列名,value是数据库查询出的信息。