所谓的懒加载,延迟加载是同一个东西。指的就是需要才会加载,不需要就不会加载。
答案
:懒加载针对级联使用的,懒加载的目的是减少内存的浪费和减轻系统负担。
答案
:可以理解为按需加载,当调用到关联的数据时才与数据库交互否则不交互。
再具体点来说
:
比如user表和role表有关联关系,有这样一条语句:查询uesr的同时将user的某一列数据作为参数一并查询role表符合条件的数据,mybatis里叫做级联。只要执行这条语句,就会将这两张表符合需求的信息一起加载出来。而懒加载只会加载uesr表的数据出来不加载role表的数据。
方式1:全局设置,在mybatis-config.xml中进行开启
方式2:局部设置
,答案
:是可以的,
它是控制具有懒加载特性的对象的属性的加载情况的。
true表示如果对具有懒加载特性的对象的任意调用会导致这个对象的完整加载,false表示每种属性按照需要加载。
注意点1
:只有分步查询才能让懒加载有效,也就是只能使用单条查询,而不能使用连表查询语句。注意点2
:现实中用这个的场景我个人感觉也不太多,因为当多表查询,比如5个表查询的时候,写注意点3
:懒加载分全局设置和局部设置。注意点4
:如果是全局设置开启,要注意标签的放置位置,因为在mybatis-config.xml中标签是有顺序的。我有个用户表,有个地址表,其中地址表可以根据用户id进行关联查询,具体测试如下
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
//id
private Integer id;
//用户名称
private String username;
//用户密码
private String password;
//用户手机号码
private String mobile;
//性别
private Integer gender;
//最近一次登录IP地址
private String lastLoginIp;
private Address address;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Address implements Serializable {
//id
private Integer id;
//用户名称
private String name;
//用户ID
private Integer userId;
private List userList = new ArrayList<>();
}
List getAllUser();
Address getAddressByUserId(@Param("userId") Integer userId);
当开启全局懒加载时,只调用item.getUsername()属性时,可以看到只调用user表sql,没有调用address表sql
@Test
public void lazyLoading(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);
SelectMapper selectMapper = sqlSession.getMapper(SelectMapper.class);
List userList = selectMapper.getAllUser();
userList.forEach(item -> {
System.out.println(item.getUsername());
// System.out.println(item.getAddress());
});
}
日志打印:
当调用item.getAddress()地址属性时
@Test
public void lazyLoading(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);
SelectMapper selectMapper = sqlSession.getMapper(SelectMapper.class);
List userList = selectMapper.getAllUser();
userList.forEach(item -> {
System.out.println(item.getUsername());
System.out.println(item.getAddress());
});
}
日志打印:
其他不变,只设置
属性为fetchType=“eager”,其中eager代表立即加载
@Test
public void lazyLoading(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);
SelectMapper selectMapper = sqlSession.getMapper(SelectMapper.class);
List userList = selectMapper.getAllUser();
userList.forEach(item -> {
System.out.println(item.getUsername());
});
}
日志打印:
最终结论
:局部设置生效了,因为调接口打印输出只调用了item.getUsername(),而没有调用item.getAddress(),所以如果局部设置不生效,那么不会调用查询地址的sql。
1.一、MyBatis简介:MyBatis历史、MyBatis特性、和其它持久化层技术对比、Mybatis下载依赖包流程
2.二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
3.三、MyBatis核心配置文件详解
4.四、MyBatis获取参数值的两种方式(重点)
5.五、MyBatis的增删改查模板(参数形式包括:String、对象、集合、数组、Map)
6.六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
7.七、MyBatis自定义映射resultMap
8.八、(了解即可)MyBatis懒加载(或者叫延迟加载)
9.九、MyBatis动态SQL
10.十、MyBatis的缓存
11.十一、MyBatis的逆向工程
12.十二、MyBatis分页插件