Mybatis框架(4)

延迟加载策略

1、背景

问题:在一对多的关系中,当我们有一个用户,它有100个账户。

          在查询用户的时候,要不要把关联的100个账户查出来?

          在查询账户的时候,要不要把关联的用户信息查出来?

思路:在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询

          在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来

2、概念

延迟加载:在真正使用数据时才发起查询,不用的时候不查询,即按需加载(懒加载) lazy

立即加载:不管用不用,只要一调用方法,马上发起查询 eager

3、多表关系

在对应的四种表关系中:一对多、多对一、一对一、多对多

一对多、多对多:通常采用延迟加载

多对一、一对一:通常采用立即加载

4、使用方法

1、修改SqlMapConfig.xml配置文件中的settings设置

    1)lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态,默认false

    2)aggressiveLazyLoading:开启时,任一方法的调用都会加载该对象的所有延迟加载属性, 否则,每个延迟加载属性会按需加载, 3.4.1 版本后默认关闭(false)

2、修改映射文件

    1)一对一(多对一):可以实现延迟加载,但是我们一般用立即加载

account配置文件:

   

   

   

   

   

user配置文件:

association标签属性:

property:实体类中的属性

javaType:查询结果封装到的具体类(全限定类名)

column:将要执行查询的语句对应的参数

select:将要执行查询的语句(全限定类名+方法名)

fetchType:加载方式:eager(立即加载)、lazy(懒加载)

    2)一对多(多对多):

user配置文件:

   

   

   

   

   

   

   

account配置文件:

3、测试

延迟加载(一对多)测试:

当只调用方法:List users = userDao.findAll();时,mybatis只进行一次查询,即查询所有user对象

当使用users列表中的某一个对象时,则会再次执行查询

延迟加载

立即加载(一对一)测试:

当调用方法:List accounts = accountDao.findAll();时,mybatis只进行了一次查询,但是执行了多条语句

立即加载

缓存

1、定义

缓存是指存在于内存中的临时数据

使用缓存可以减少和数据库的交互次数,提高执行效率

2、范围

适用缓存的条件

     1)经常查询并且不经常改变的

     2)数据的正确与否对最终结果影响不大的

不适用于缓存的情况

    1)经常改变的数据

    2)数据的正确与否对最终结果影响很大的,如:商品的库存,银行的汇率,股市的牌价

一级缓存

它指的是Mybatis中SqlSession对象的缓存

当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中

该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿出来用

当SqlSession对象消失时,mybatis的一级缓存也就消失

一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

二级缓存

它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存

开启二级缓存

1)让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)

cacheEnabled:全局性地开启或关闭所有映射器配置文件中已配置的任何缓存,默认true

2)让当前的映射文件支持二级缓存(在IUserDao.xml中配置)

:开启user支持二级缓存

3)让当前的操作支持二级缓存(在select标签中配置)