目录
-
延迟加载
-
延迟加载
- 在真正使用数据时才发起查询, 不用的时候不查询. 按需加载(懒加载)
- 常用于一对多和多对多
-
立即加载
- 不管用不用, 都一并查询
- 多用于一对一和多对一
-
一对一
-
开启步骤
- 在主配置文件中添加如下代码
-
<!--配置参数--> <settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"></setting> </settings>
-
- 在映射配置文件里的association标签中添加select标签, 值为: cn.lq.dao.DaoAccount.findById
- findById
- 必须使用此方法, 因为发起第二次查询时, 使用的参数是uid
- findById
- 在主配置文件中添加如下代码
-
注意事项
- 是在主配置文件中开启延迟加载, 但并不意味着所有的方法都会自动应用延迟加载, 还需要进行额外的配置(添加select属性 修改sql语句)
-
原理(个人理解)
- select属性中会指明发起二次查询时需要用到的方法(findById), column属性则指明了方法需要用的参数(uid), 这个参数是第一次查询时查出来的结果
-
-
一对多
- 方法同上
-
-
缓存
-
适用条件
-
可以用
- 数据经常被查询且不经常发生改变
- 数据的正确与否对最终结果影响不大
-
不可以用
- 数据经常改变
- 数据的正确与否对最终结果影响很大
-
-
一级缓存
-
概念
- 他指的是mybatis中sqlSession中的缓存
- 当我们执行查询之后, 查询的结果会同时存入到sqlSession为我们提供的一片区域中. 该区域的结构是一个map. 当我们再次查询同样的数据时, mybatis会先去sqlSession中查询
- clearCache() : 清除sqlSession中的缓存
-
触发清空缓存的条件
- 当调用sqlSession的修改 添加 删除 commit close等方法时, 都会清空一级缓存
-
-
二级缓存
-
概念
- 二级缓存是在SqlSessionFactory中, 可以多个sqlSession共享共享这片区域
-
使用步骤
- 让mybatis框架支持二级缓存(设置主配置文件)
- 可以省略, 因为cacheEnabled默认是开启的(值为true)
- 让映射配置文件支持二级缓存(设置映射配置文件)
- 在mapper标签下添加依据<cache/>即可
- 让当前操作支持二级缓存(在select标签中设置)
- 在select标签中添加属性useCache="true"即可
- 让mybatis框架支持二级缓存(设置主配置文件)
-
注意事项
- 二级缓存中存的不是对象, 而是"散装"的数据, SqlSession拿到数据之后会根据自己的需要再组装成对象
-
-
-
注解开发
-
注意细节
- 注解和配置文件是不可以同时使用的, 即 不能即给方法添加注解, 同时又配置方法的映射配置文件
-
自定义映射关系
-
Results注解
-
/** * 查询所有 * * @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();
-
-
-
多表查询
-
一对一
-
/** * 查询所有 * * @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();
-
-
一对多
- 方法和上面一样
-
-
延迟加载
- 不需要在主配置文件中单独设置开关, 直接给方法加上相应的注解就可以直接使用
-
二级缓存
-
开启方法
- 不需要在主配置文件中单独设置了, 因为二级缓存的总开关默认是开启的, 只需要在相应的dao接口上添加注解即可
- 在接口上面(注意 ! ! 是接口上面, 不是方法上面)添加注解: @CacheNamespace(blocking = true)
-
-