资讯专栏INFORMATION COLUMN

MyBatis知识点整理

zhangqh / 2164人阅读

摘要:得到用户信息,将用户信息存储到一级缓存中。如果中间去执行操作执行插入更新删除,则会清空中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

基础:

1、 概念:Java当中的一个持久层框架。
2、 特点、优势:
(1)把java代码和SQL代码做了一个完全分离。
(2)良好支持复杂对象的映射(输入映射、输出映射)
(3)使用动态SQL,可以预防SQL注入。
3、 原理:
(1)创建mybatis-config.xml配置文件
(2)创建sqlSessionFactory
(3)编写数据库表对应的实体类
(4)创建mybatis的sql映射文件,在这个文件中,把实体类的属性和数据库表的列联系起来,并且可以编写sql语句
(5)从sqlSessionFactory的实例获取session
(6)session内部通过Executor执行器执行操作。Executor会用到mapped statement对象,这个对象是对数据库存储的封装,包括:sql语句、输入参数、输出结果类型
(7)关闭session

MyBatis缓存:

1、概念:
(1)一级缓存:一级缓存是SqlSession(会话)级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
(2)二级缓存:二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。(二级缓存的原理和一级缓存原理一样,第一次查询,会将数据放入缓存中,然后第二次查询则会直接去缓存中取。但是一级缓存是基于 sqlSession 的,而 二级缓存是基于 mapper文件的namespace的,也就是说多个sqlSession可以共享一个mapper中的二级缓存区域,并且如果两个mapper的namespace相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中)
它们的关系如图:

2、一级缓存的使用:
我们在一个 sqlSession 中,对User表根据id进行两次查询,查看他们发出sql语句的情况:
(1)第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。
(2)如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
(3)第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

3、二级缓存的使用:

4、注意事项:
(1)如果设置了cacheEnabled=true; 那么MyBatis在执行查询的时候,先查看二级缓存(全局缓存)是否有查询的结果,如果有,直接返回缓存的结果;如果没有,再执行真正的查询,把查询的结果放到缓存中,再把结果返回给用户。
(2)二级缓存:mybatis中,每一个mapper都可以有一个二级缓存。使用节点配置。
(3)二级缓存使用场景:

 对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
 mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分的,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题可能需要在业务层根据需求对数据有针对性缓存。
语法:

1、#{}和${}
(1)#{}是一个占位符,接收输入参数,参数类型可以是基本类型、POJO、HashMap
(2)${}是一个拼接符号,可能导致sql注入,不建议使用。
2、resultMap标签:
(1)结果集映射的标签
(2)resultMap:

A、type:指定结果集中保存的实体类的类型
B、id:resultMap标签的标识
C、autoMapping:值范围true|false,设置是否启动自动映射功能。自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。设置为false之后,需要在resultMap内明确注明映射关系才会调用对应的setter方法。

(3)id:用于设置主键字段与领域模型属性的映射关系
(4)result:用于设置普通字段与领域模型属性的映射关系
3、sql标签:用来封装sql语句或者sql片段

MyBatis的DAO开发方法:
1、 使用mapper代理方法:
(1) 编写mapper.java 的接口类
(2) 编写mapper.xml
2、 编写接口类,需要遵守一些规范,MyBatis可以自动生成接口类的DAO实现类。规范有:
(1) mapper.xml中namespace需要等于mapper接口类的地址
(2) mapper接口类的方法的名称等于mapper.xml中statement(对应sql语句)的id
(3) mapper接口类的输入参数类型等于mapper.xml中statement的parameterType指定的类型
(4) mapper接口类的返回参数类型等于mapper.xml中statement的resultType指定的类型
3、

MyBatis和Hibernate的本质区别:
1、 Hibernate不需要写sql,通过hql或者Hibernate直接生成sql。Mybatis需要写sql。
2、 Mybatis适合于需求经常改动的项目,因为它的sql由程序员生成,容易改动。Hibernate适合于需求改动较少的项目。

MyBatis和Ibatis的本质区别:
1、MyBatis简化了编码过程,不需要写DAO的实现类。直接写一个DAO的接口和一个配置文件。MyBatis自动生成DAO实现类。

嵌套查询 及 嵌套结果查询:
嵌套查询:使用2次查询,然后在MyBatis(内存)中进行拼装。可能引起N+1问题。
嵌套结果查询:使用1次查询,然后将结果进行拼装。
具体参考:https://www.2cto.com/database...

参考:https://www.cnblogs.com/ysoce...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71589.html

相关文章

  • Java面试前需要了解的东西

    摘要:我在面试前针对基础也花了不少的时间,期间也将自己写过的博文粗略地刷了一遍,同时也在网上找了不少比较好的资料部分是没看完的。看面试题也是校验自己是否真正理解了这个知识点,也很有可能会有新的收获。 一、前言 只有光头才能变强 回顾前面: 广州三本找Java实习经历 上一篇写了自己面试的经历和一些在面试的时候遇到的题目(笔试题和面试题)。 我在面试前针对Java基础也花了不少的时间,期间也将...

    renweihub 评论0 收藏0
  • MyBatis 源码分析系列文章合集

    摘要:简介我从七月份开始阅读源码,并在随后的天内陆续更新了篇文章。考虑到超长文章对读者不太友好,以及拆分文章工作量也不小等问题。经过两周紧张的排版,一本小小的源码分析书诞生了。我在写系列文章中,买了一本书作为参考,这本书是技术内幕。 1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章。起初,我只是打算通过博客的形式进行分享。但在写作的过程中,发现要分析的代码...

    Crazy_Coder 评论0 收藏0
  • Java后端

    摘要:,面向切面编程,中最主要的是用于事务方面的使用。目标达成后还会有去构建微服务,希望大家多多支持。原文地址手把手教程优雅的应用四手把手实现后端搭建第四期 SpringMVC 干货系列:从零搭建 SpringMVC+mybatis(四):Spring 两大核心之 AOP 学习 | 掘金技术征文 原本地址:SpringMVC 干货系列:从零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 评论0 收藏0
  • Java入门基础识点总结(详细篇)

    摘要:深入理解数据库管理系统通用知识及数据库的使用与管理。为后台开发打下坚实基础。项目文档,项目规范,需求分析,数据库设计,工程构建,需求评审,配置管理,修复,项目管理等。 很多新手在学习java的时候都比较迷茫,不知道从哪里开始学起,这里就给大家整理了一份java开发学习路线,比较系统全面,可参...

    shinezejian 评论0 收藏0
  • Java进阶之路

    摘要:探索专为而设计的将探讨进行了何种改进,以及这些改进背后的原因。关于最友好的文章进阶前言之前就写过一篇关于最友好的文章反响很不错,由于那篇文章的定位就是简单友好,因此尽可能的摒弃复杂的概念,只抓住关键的东西来讲,以保证大家都能看懂。 周月切换日历 一个可以进行周月切换的日历,左右滑动的切换月份,上下滑动可以进行周,月不同的视图切换,可以进行事件的标记,以及节假日的显示,功能丰富 Andr...

    sushi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<