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>
多表关联处理结果集
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>
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>
相关类
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"/>