热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Mybatis04懒加载&缓存&注解开发

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Mybatis-04懒加载&缓存&注解开发相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Mybatis-04 懒加载&缓存&注解开发相关的知识,希望对你有一定的参考价值。



1.Mybatis延迟加载策略

1.1 什么是延迟加载(懒加载)?

简单的说,就是要用到数据时才加载,否则不加载。
好处:先单表查询,要用时才去关联查询,提高数据库性能。
坏处:大批量数据查询的时候,查询可能消耗时间,影响用户体验。

1.2 Mybatis的延迟加载

上一个文章说要,association、collection实现了一对一及一对多的映射,他们时具有延迟加载功能的。
一般一对一用立即加载,一对多用延迟加载。

1.2.1 使用assocation实现延迟加载

需求如:查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要求,当我们需要查询用户(User)信息时再查询用(User)信息。把对用户(User)信息的按需去查询就是延迟加载。
1.映射文件的配置
在association标签添加select属性,指定查找的方法唯一表示。
column属性,传递的参数








2.主配置文件的配置







1.2.2 使用collection实现延迟加载

结点中也有select属性,column属性。
和上类似:
1.配置主配置文件
2.配置映射文件










2.Mybatis缓存

2.1 一级缓存

一级缓存时sqlSession级别的缓存,只要sqlSession没有flush或close,就存在。

技术图片

可以发现,查询了2次,但最后一次执行并没有向数据库查询,这就是一级缓存的作用了,而是从一级缓存中查询。


2.1.1 一级缓存分析

1. 是SqlSession范围的缓存,当条用了SqlSession的修改,添加,删除,commit(),close()等方法,缓存就会清空。
很好理解,是为了防止数据库的数据和缓存的数据不一致。
流程,如查询id为1的用户信息,先去缓存查找id为1的信息,如果有就读取,如果没有,从数据库中查询,得到用户信息,存入缓存。
如果sqlSession去执行了commit操作(增删改),清空一级缓存,避免脏读。
PS: sqlSession.clearCache();这个方法也可清除缓存。

2.2 二级缓存

二级缓存是mapper映射级别的缓存,多个sqlSession去操作同一个Mapper映射的sql语句,多个sqlSession共用二级缓存,是跨越sqlSession的。
![](https://img2018.cnblogs.com/blog/1882316/202002/1882316-20200210154006177-132709407.png)

2.2.1 流程分析

sqlSession1查询信息,存入二级缓存。
sqlSession2如果执行相同mapper映射下的sql,执行commit,会清空缓存。
sqlSession2如果查询sqlSession1相同的信息,会看缓存是否存在数据,有就从缓存中去数据。

2.2.2 二级缓存的使用

1. 在全局配置文件开启二级缓存 默认值为true 这一步可省略不写

技术图片



2. 相关的映射文件

标签表示当前这个mapper映射将使用二级缓存,区分的标准就看 mapper的namespace值。




3. 添加useCache属性

将UserDao.xml映射文件中的
select * from user where id = #{uid}


2.2.3 注意事项

使用二级缓存的实体类一定要实现 java.io.Serializable 接口。

3.Mybatis注解开发

3.1 常用注解

@Insert 新增
@Update 更新
@Delete 删除
@Select 查询
@Result 封装结果集
@Results 和@Result一起使用,封装多个结果集
@ResultMap 引用封装
@One 一对一结果集封装
@Many 一对多结果集封装
@SelectProvider 动态SQL映射
@CacheNamespace 二级缓存使用

3.2 注解

SqlMapConfig.xml还是用xml配置的。
或者用package标签..
![](https://img2018.cnblogs.com/blog/1882316/202002/1882316-20200210193208224-928423688.png)
xml和注解的mapper属性不一样,如下:

技术图片

在接口中配置使用@Insert 新增 @Update 更新 @Delete 删除 @Select 查询配置相应的方法。
属性里面写sql语句。
如 @Select("select * from user")
注意:如果使用注解开发,就不能有对应的xml配置文件,不管mapper中用的是class还是什么,否则就会报错。

3.2.1 注解建立实体类和数据库表的对应关系即 ResultMap

技术图片

@Results 注解: 代替的是
使用:Results({@Result(),@Result()})
@Result 注解:
带起的是 中的标签
id是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One注解
select 指定用来查询的sqlmapper:使用的全限定类名,包类名+方法名
fetchType 会覆盖全局的配置参数lazyLoadingEnabled
使用格式:@Result(column="",property="",One=@One(select="" ))

many 需要使用的@Many注解

@One注解:(一对一)
代替的是标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@Many注解:(多对一)
代替了标签,在注解中用来指定子查询返回的对象集合。
注解:聚集元素用来处理一对多的关系,需要指定映射的java实体类属性,属性的JavaType(一般为ArrayList)但注解中可以不定义。
格式:@Result(property="",column="",many=@Many(select=""))

案例:

技术图片

技术图片

注解的关系如下:

技术图片

技术图片


3.3 注解开启缓存

在接口上使用@CacheNamespace注解就可以了

有一个blocking属性,改为true

技术图片


推荐阅读
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 在测试软件或进行系统维护时,有时会遇到电脑蓝屏的情况,即便使用了沙盒环境也无法完全避免。本文将详细介绍常见的蓝屏错误代码及其解决方案,帮助用户快速定位并解决问题。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文深入探讨了Linux内核中进程地址空间的设计与实现,包括虚拟地址空间的概念、内存描述符`mm_struct`的作用、内核线程与用户进程的区别、进程地址空间的分配方法、虚拟内存区域(VMA)的结构以及地址空间与页表之间的映射机制。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
author-avatar
mobiledu2502902041
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有