Mybatis懒加载

一、需求:查询用户信息,有时候需要关联查出部门信息。

第一种方法:我们直接关联查询出所有用户和部门的信息

select * from tb_user u ,tb_department d where u.dep_id = d.dep_id;

分析:

  ①这里我们一次查询出所有用户信息,需要什么部门信息的时候直接从查询的结果中筛选。但是如果部门和用户表都比较大的时候,这种关联查询肯定比较耗时。

  ②我们的需求是有时候需要关联查询部门信息。这里不是一定需要部门信息的。即有时候不需要查询部门信息,我们也查了,程序进行了多余的耗时操作。

第二种方法:分步查询,首先查询出所有的用户信息,然后如果需要部门的信息,我们在根据查询的部门信息去关联部门信息

//查询所有的用户信息,包括部门id

select * from tb_user;

//如果需要部门信息,我们再根据上一步查询的部门id查询部门信息

select * from tb_department where dep_id=id

分析:

     ①这里两步都是单表查询,执行效率比关联查询要高很多

     ②分为两步,如果我们不需要关联部门信息,那么我们就不必执行第二步,程序没有进行多余的操作。

这第二种方法就是mybatis的懒加载。

二、什么是懒加载?

通俗的讲就是按需加载,我们需要什么的时候再去进行什么操作。而且先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

  在mybatis中,resultMap可以实现高级映射,association、collection具备延迟加载功能。

具体实例:

1、创建User类(用户类):

public class User implements Serializable {

private static final long serialVersionUID = 6716332190979093860L;

private Integer Id;

private String username;

private String sex;

private String password;

private Date birthday;

private Department department;

}

2、创建Department类(部门类)

public class Department {

private Integer dep_id;

private String  dep_name;

private String  manager;

}

3、创建UserMapper类

public interface UserMapper {

public int insert(User u)throws Exception;

public int delete(Integer id)throws Exception;

public int updateUser(User u)throws Exception;

public List<User> selectAll()throws Exception;

public User selectByUserId(Integer id)throws Exception;

public Department selectDepartment(Integer id)throws Exception;

}

4、定义UserMapper.xml文件

<mapper namespace="com.mybatis.mapper.UserMapper">

<resultMap type="User" id="userMap">

<id property="id" column="id" javaType="java.lang.Integer"/>

<result property="username" column="username" javaType="java.lang.String"/>

<result property="password" column="password" javaType="java.lang.String"/>

<result property="gender" column="gender" javaType="java.lang.String"/>

<result property="address" column="address" javaType="java.lang.String"/>

<result property="birthday" column="birthday" javaType="java.util.Date"/>

<association property="department" column="dep_id" fetchType="lazy" select="selectDepartment"/>

</resultMap>

<resultMap type="Department" id="departmentMap">

<id property="dep_id" column="dep_id"/>

<result property="dep_name" column="dep_name"/>

<result property="manager" column="dep_manager"/>

</resultMap>

<select id="selectAll"  resultMap="userMap" >

select * from tb_user

</select>

<select id="selectDepartment" parameterType="int" resultMap="departmentMap">

select * from tb_department where dep_id=#{id}

</select>

</mapper>

5、在mybatis-config.xml文件中开启懒加载

<settings>

<setting name="lazyLoadingEnabled" value="true"/>

<setting name="aggressiveLazyLoading" value="false"/>

</settings>

6、测试

UserMapper mapper = session.getMapper(UserMapper.class);

List<User> users = mapper.selectAll();

for(User u:users)

{

System.out.println(u.getDepartment());

}

原文地址:https://www.cnblogs.com/lone5wolf/p/10961537.html

时间: 2024-11-09 03:01:52

Mybatis懒加载的相关文章

Mybatis懒加载机制

懒加载会按需要是否执行关联查询语句.如果用到了关联查询语句的信息,就需要执行关联查询,否则就只执行主查询 1.在mybatis的全局配置文件中加入两个属性: <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启懒加载机制 ,默认值为true--> <setting name="lazyLoadingEnabled&quo

mybatis懒加载特性详解,以及多对多映射详解

注意讲解都在代码中 准备数据库,测试数据,各位自己添加,因为是多对多,所以使用中间表: 用到的实体: 学生类: public class Student { private Integer sid; private String name; private Integer age; //一个学生有多个老师,一个老师有多个学生 private List<Teacher> teachers=new ArrayList<Teacher>(); setter.. getter.... to

Mybatis懒加载时,springMVC返回JSON异常 Could not write JSON: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl

在mybatis集成springmvc时,假如mybatis采用了懒加载,而springmvc中利用@ResponseBody注解返回实体类的JSON时会抛异常: Could not write JSON: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties di

MyBatis 懒加载

懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力. 懒加载的适用场景: 当前业务只使用主加载对象的其他属性,或者暂时只使用主加载对象的其他属性,长时间以后才使用主加载对象的关联对象属性. 懒加载只对关联查询起作用(一对一.一对多.多对多),且只对嵌套查询方式起作用,因为嵌套结果.扩展类的方式都是一次查询所需数据,不存在子查询,也就不存在延迟加载的情况. MyBatis

12、mybatis懒加载的设置

MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的<settings>属性有 lazyLoadingEnabled: lazy loading开关 aggressiveLazyLoading: 侵略性 lazy loading 开关 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置懒加载.如果设为‘false’,则所有相关联的都会被初始化加载. true | false 3.4.1后为false aggr

Mybatis处理表关联(懒加载)

1.关系型数据库? 数据库中的表对象之间是有关系的. 一对一,一对多,多对多. ORM映射.数据库表映射到实体对象. 实体与实体之间是有关系的. 一对多的关系. 比如商品分类表与商品表之间的关系,就是一对多的关系. 入库主表与入库子表之间的关系,也是一对多的关系. 出库主表与出库子表之间的关系,也是一对多的关系. ID编号  教师编号   课程编号   其余字段  (外键的都是多的关系) 1        001 2        001 很明显的就是在多的这个表里会出现1的这个表里的字段. 2

八、懒加载

1.需求:查询订单信息,有时候需要关联查出用户信息. 第一种方法:我们直接关联查询出所有订单和用户的信息 1 select * from orders o ,user u where o.user_id = u.id; 分析: ①.这里我们一次查询出所有的信息,需要什么信息的时候直接从查询的结果中筛选.但是如果订单和用户表都比较大的时候,这种关联查询肯定比较耗时. ②.我们的需求是有时候需要关联查询用户信息,这里不是一定需要用户信息的.即有时候不需要查询用户信息,我们也查了,程序进行了多余的耗时

mybatis(三)懒加载

懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载.总结为: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强,层次感很强. 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强

MyBatis --- 映射关系【一对一、一对多、多对多】,懒加载机制

映射(多.一)对一的关联关系 1)若只想得到关联对象的id属性,不用关联数据表 2)若希望得到关联对象的其他属性,要关联其数据表 举例: 员工与部门的映射关系为:多对一 1.创建表 员工表 确定其外键是部门表的 id DROP TABLE IF EXISTS emp; CREATE TABLE emp( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(255) DEFAULT NULL, gender CHAR(1