热门标签 | 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

技术图片


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
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社区 版权所有