04 Mybatis 延迟加载 缓存 注解开发

目录

延迟加载

延迟加载

立即加载

一对一

开启步骤

注意事项

原理(个人理解)

一对多

缓存

适用条件

可以用

不可以用

一级缓存

概念

触发清空缓存的条件

二级缓存

概念

使用步骤

注意事项

注解开发

注意细节

自定义映射关系

Results注解

多表查询

一对一

一对多

延迟加载

二级缓存

开启方法


  1. 延迟加载

    1. 延迟加载

      1. 在真正使用数据时才发起查询, 不用的时候不查询. 按需加载(懒加载)
      2. 常用于一对多和多对多
    2. 立即加载

      1. 不管用不用, 都一并查询
      2. 多用于一对一和多对一
    3. 一对一

      1. 开启步骤

        1. 在主配置文件中添加如下代码
          1. <!--配置参数-->
            <settings>
                <setting name="lazyLoadingEnabled" value="true"/>
                <setting name="aggressiveLazyLoading" value="false"></setting>
            </settings>

             

        2. 在映射配置文件里的association标签中添加select标签, 值为: cn.lq.dao.DaoAccount.findById
          1. findById
            1. 必须使用此方法, 因为发起第二次查询时, 使用的参数是uid
      2. 注意事项

        1. 是在主配置文件中开启延迟加载, 但并不意味着所有的方法都会自动应用延迟加载, 还需要进行额外的配置(添加select属性 修改sql语句)
      3. 原理(个人理解)

        1. select属性中会指明发起二次查询时需要用到的方法(findById), column属性则指明了方法需要用的参数(uid), 这个参数是第一次查询时查出来的结果
    4. 一对多

      1. 方法同上
  2. 缓存

    1. 适用条件

      1. 可以用

        1. 数据经常被查询且不经常发生改变
        2. 数据的正确与否对最终结果影响不大
      2. 不可以用

        1. 数据经常改变
        2. 数据的正确与否对最终结果影响很大
    2. 一级缓存

      1. 概念

        1. 他指的是mybatis中sqlSession中的缓存
        2. 当我们执行查询之后, 查询的结果会同时存入到sqlSession为我们提供的一片区域中. 该区域的结构是一个map. 当我们再次查询同样的数据时, mybatis会先去sqlSession中查询
      2. clearCache() : 清除sqlSession中的缓存
      3. 触发清空缓存的条件

        1. 当调用sqlSession的修改 添加 删除 commit close等方法时, 都会清空一级缓存
    3. 二级缓存

      1. 概念

        1. 二级缓存是在SqlSessionFactory中, 可以多个sqlSession共享共享这片区域
      2. 使用步骤

        1. 让mybatis框架支持二级缓存(设置主配置文件)
          1. 可以省略, 因为cacheEnabled默认是开启的(值为true)
        2. 让映射配置文件支持二级缓存(设置映射配置文件)
          1. 在mapper标签下添加依据<cache/>即可
        3. 让当前操作支持二级缓存(在select标签中设置)
          1. 在select标签中添加属性useCache="true"即可
      3. 注意事项

        1. 二级缓存中存的不是对象, 而是"散装"的数据, SqlSession拿到数据之后会根据自己的需要再组装成对象
  3. 注解开发

    1. 注意细节

      1. 注解和配置文件是不可以同时使用的, 即 不能即给方法添加注解, 同时又配置方法的映射配置文件
    2. 自定义映射关系

      1. Results注解

        1. /**
           * 查询所有
           *
           * @return
           */
          @Select("select * from user")
          /*
           * 自定义映射关系
           *   Results.id : 如果别的方法也想使用这个映射关系, 就需要用到这个id, 在方法前添加注解: @ResultMap("mapUser")
           *   Result.id : 值为true代表这个属性是主键
           * */
          @Results(id = "mapUser", value = {
                  @Result(id = true, column = "id", property = "id"),
                  @Result(column = "username", property = "username"),
                  @Result(column = "sex", property = "sex"),
                  @Result(column = "address", property = "address"),
                  @Result(column = "birthday", property = "birthday"),
                  @Result(column = "id", property = "accounts",
                          many = @Many(select = "cn.lq.dao.DaoAccount.findAllByUid", fetchType = FetchType.LAZY))
          })
          public List<User> findAll();

           

    3. 多表查询

      1. 一对一

        1. /**
           * 查询所有
           *
           * @return
           */
          @Select("select * from account")
          /*
           * 一对一
           *   one : 一对一(或多对一), 对应的还有many,一对多(多对多)
           *       select : 要执行的方法的位置
           *       fetchType : 加载方式
           *           EAGER : 立即加载
           *           LAZY : 延迟加载
           * */
          @Results(id = "mapAccount", value = {
                  @Result(id = true, property = "id", column = "id"),
                  @Result(property = "uid", column = "uid"),
                  @Result(property = "money", column = "money"),
                  @Result(property = "user", column = "uid",
                          one = @One(select = "cn.lq.dao.DaoUser.findById", fetchType = FetchType.EAGER))
          })
          public List<Account> findAll();

           

      2. 一对多

        1. 方法和上面一样
    4. 延迟加载

      1. 不需要在主配置文件中单独设置开关, 直接给方法加上相应的注解就可以直接使用
    5. 二级缓存

      1. 开启方法

        1. 不需要在主配置文件中单独设置了, 因为二级缓存的总开关默认是开启的, 只需要在相应的dao接口上添加注解即可
        2. 在接口上面(注意 ! ! 是接口上面, 不是方法上面)添加注解: @CacheNamespace(blocking = true)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值