首页 > 其他分享 >Mybatis---查询resultMap-多表关联{association-collection}--延迟加载

Mybatis---查询resultMap-多表关联{association-collection}--延迟加载

时间:2022-10-28 12:35:34浏览次数:79  
标签:多表 -- resultMap 查询 对象 collection 关联 id 加载


Mybatis查询

文章目录

resultMap

resultMap: 结果映射。 自定义列名和java对象属性的对应关系。 常用在列名和属性名不同的情况。

用法:

1.先定义 resultMap标签, 指定列名和属性名称对应关系

2.在select标签使用resultMap属性,指定上面定义的resultMap的id值

<resultMap id="studentMap" type="com.nie.domain.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="email" property="email"/>
<result column="age" property="age"/>
</resultMap>


<select id="selectById2" resultMap="studentMap">
select id,name,email,age from student where id=#{stuid}
</select>

Mybatis---查询resultMap-多表关联{association-collection}--延迟加载_java

多表关联处理结果集

resultMap元素中association,collection元素

association

–复杂类型联合;许多查询结果合成这个类型

​一对一​​结果映射-association,能引用自身,或者从其他地方引用collection-复杂类型集合

collection

–复杂类型集合

嵌套结果映射–collection能引用自身,或者从其它地方引用与​​一对多​

关联-association​一对一,,多对一​

集合-collection​一对多​

相关的association与collection区别

案例

association

<resultMap id="empMap" type="com.nie.domain.Emp">
<id column="eid" property="id"/>
<result column="ename" property="name"/>
<result column="age" property="age"/>


<!--关联的对象-->
<association property="dept" javaType="com.nie.domain.Dept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
<result column="deptDesc" property="deptDesc"/>
</association>

</resultMap>

<!-- 公共的-->
<sql id="result">
e.id eid,
e.name ename,
e.age,
d.id did,
d.name dname,
d.dept_desc deptDesc
</sql>

<select id="selectById" resultMap="empMap">
SELECT
e.id eid,
e.name ename,
e.age,
d.id did,
d.name dname,
d.dept_desc deptDesc
FROM
emp e
LEFT JOIN dept d
ON e.dept_id = d.id
WHERE e.id = #{id}
</select>


<!-- 查询所有的员工-->
<select id="findEmpById" resultMap="empMap">
SELECT
<include refid="result"></include>
FROM
emp e
LEFT JOIN dept d
ON e.dept_id = d.id
</select>

Mybatis---查询resultMap-多表关联{association-collection}--延迟加载_mybatis_02

collection

<resultMap id="deptMap" type="com.nie.domain.Dept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
<result column="deptDesc" property="deptDesc"/>
<!-- 查询到的多个员工对象,再将多个对象 封装集合-->
<collection property="empList" javaType="list" ofType="com.nie.domain.Emp">
<id column="eid" property="id"/>
<result column="ename" property="name"/>
<result column="age" property="age"/>
</collection>
</resultMap>


<select id="findDeptById" resultType="com.nie.domain.Dept" resultMap="deptMap">
SELECT
e.id eid,
e.name ename,
e.age,
d.id did,
d.name dname,
d.dept_desc deptDesc
FROM
dept d
LEFT JOIN emp e
ON d.`id` = e.`dept_id`
WHERE d.id = #{id}
</select>

Mybatis---查询resultMap-多表关联{association-collection}--延迟加载_sql_03

相关类

Emp

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private int id;
private String name;
private int age;
private Dept dept;

}

Dept

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private int id;
private String name;
private String deptDesc;
private List<Emp> empList;

}

​Mybatis延迟加载的实现方式​

概念:

mybatis的延迟加载,也称为懒加载,是指在进行表关联查询时,按照设置延迟规则推迟对关联对象的select查询,

如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力

mybatis的延迟记载只是对关联对象的查询有延迟设置,对于主动加载对象都是直接执行查询语句的

加载时机

直接加载: 执行完对主加载对象的select语句,马上执行对关联对象的select查询

侵入式延迟: 执行对主加载对象的查询时,不会主动关联对象的查询,但当要访问主加载对象的详情属性,就会马上执行相关对象的select查询

深度延迟: 执行对主加载对象的查询,不会执行对关联对象的查询,。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

<!--开启延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--配置侵入式延迟加载 默认为false(深度加载)
侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询
深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询
-->
<setting name="aggressiveLazyLoading" value="true"/>


标签:多表,--,resultMap,查询,对象,collection,关联,id,加载
From: https://blog.51cto.com/u_15850876/5804338

相关文章