🎄欢迎来到@边境矢梦°的csdn博文🎄
🎄本文主要梳理 Java 框架 中 SpringMVC的知识点和值得注意的地方 🎄
🌈我是边境矢梦°,一个正在为秋招算法竞赛准备学生🌈
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆

在这里插入图片描述

MyBatis什么

开源

轻量级(相比于Hibernate)

数据持久框架

简化了JDBC(加载驱动, 创建连接, 创建statement)
在这里插入图片描述MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。其封装性低于 Hibernate,但性能优秀、小巧、简单易学、应用广泛。

ORM(Object Relational Mapping对象关系映射)是一种数据持久技术,它在对象模型关系数据库之间建立起对应关系,并且提供了一种机制通过 JavaBean 对象操作数据库表中数据

MyBatis 的主要思想是将程序中的大量 SQL 语句剥离出来,使用 XML 文件注解的方式实现 SQL 的灵活配置,将 SQL 语句程序代码分离,在不修改程序代码的情况下,直接配置文件修改 SQL 语句。

MyBatis 与其它持久性框架最大不同是,MyBatis 强调使用 SQL,而其它框架例如 Hibernate)通常使用自定义查询语言,即 HQL(Hibernate查询语言)或 EJB QL(Enterprise JavaBeans查询语言)。

优点

缺点

MyBatis和Hibernateの区别

Hibernate 和 MyBatis 都是目前业界中主流的对象关系映射(ORM)框架,它们的主要区别如下

1)sql 优化方面

2)开发方面

Hibernate 的二级缓存配置在 SessionFactory 生成的配置文件中进行详细配置然后再在具体的表-对象映射中配置缓存

MyBatis 的二级缓存配置每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同缓存机制。并且 Mybatis 可以在命名空间共享相同缓存配置实例通过 Cache-ref实现

Hibernate 对查询对象有着良好的管理机制用户无需关心 SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。而 MyBatis 在这一方面,使用二级缓存需要特别小心。如果不能完全确定数据更新操作的波及范围,避免 Cache 的盲目使用。否则脏数据的出现会给系统的正常运行带来很大的隐患。

4)Hibernate 优势

5)Mybatis优势

  • MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段
  • MyBatis 容易掌握,而 Hibernate 门槛较高

6)应用场景

MyBatis 适合需求多变的互联网项目例如电商项目金融类型旅游类、售票类项目等。

Hibernate 适合需求明确、业务固定项目例如 OA 项目、ERP 项目和 CRM 项目等。

总结

总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

对于性能要求不太苛刻的系统比如管理系统、ERP 等推荐使用 Hibernate,而对于性能要求高、响应快、灵活的系统推荐使用 MyBatis。

自己实现 MyBatis 底层机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

了解MyBatis

MyBatis(以前称为iBATIS)是一个Java持久性框架,它提供了一种将SQL查询与Java对象映射起来的方式,使数据库访问更加方便。MyBatis的底层原理涉及到以下几个重要方面:

  1. SQL映射文件(XML配置文件:MyBatis的配置是通过XML文件进行的,其中包括SQL语句的定义参数映射、结果集映射等信息。SQL映射文件描述如何将Java对象与数据库表之间进行映射,以及如何执行SQL语句。
  2. SqlSessionFactory:SqlSessionFactory是MyBatis的核心接口,它负责创建SqlSession对象。SqlSessionFactory实现通常是通过XML配置文件或Java代码来配置的,它包含了数据库连接池信息事务管理器等信息
  3. SqlSession:SqlSession是MyBatis的工作单元,它负责执行SQL语句并管理数据库连接每个线程通常都会有一个SqlSession对象,它可以用来执行SQL语句、提交事务关闭连接等操作。
  4. Mapper接口:Mapper接口是Java接口,它定义了与数据库交互方法,这些方法与SQL语句相关联。Mapper接口实现通常由MyBatis动态代理生成,它会将接口方法与SQL语句进行绑定,使得在调用接口方法时可以执行相应的SQL语句。
  5. TypeHandler:TypeHandler负责将Java对象和数据库中数据类型进行转换。MyBatis提供了一些默认的TypeHandler,同时也可以自定义TypeHandler以处理特定的数据类型转换
  6. 缓存:MyBatis支持两种类型缓存:一级缓存二级缓存。一级缓存是SqlSession级别的缓存,它可以减少数据库访问次数二级缓存是全局的,多个SqlSession可以共享二级缓存中的数据,以减轻数据库压力

MyBatis的工作流程通常如下

  1. 通过SqlSessionFactory创建SqlSession对象。
  2. 调用SqlSession的Mapper方法,执行SQL语句。
  3. MyBatis将SQL语句与Mapper接口方法进行映射,生成真正的SQL语句,并执行数据库操作。
  4. 结果数据经过TypeHandler进行转换,并返回调用者
  5. 如果启用了缓存,MyBatis会在缓存中查找结果,如果缓存中有数据,就直接返回,否则将数据存入缓存。
  6. 最后,SqlSession需要关闭关闭时会提交事务或回滚事务,同时释放数据库连接

总的来说,MyBatis的底层原理涉及了SQL语句映射、数据库连接管理、事务管理数据类型转换等方面,它提供了一种灵活而强大的方式来进行数据库访问,并且可以通过XML配置文件或Java代码定制化配置。


Executor与XxxMapper.xml

MyBatis中的ExecutorXxxxMapper.xml(通常是指XML配置文件比如UserMapper.xml)之间有密切的关系,它们共同协作来执行SQL语句和映射结果。下面我会详细解释它们之间的关系:

  1. XxxxMapper.xml文件:这是MyBatis中用于定义SQL语句和映射的XML配置文件,其中包含了SQL语句的定义、参数映射、结果集映射等信息。这些XML文件定义了与数据库交互的具体SQL操作,如SELECT、INSERT、UPDATE、DELETE等。XxxxMapper.xml文件通常定义了一个或多个Mapper接口对应的SQL操作。

    举例来说,如果你有一个UserMapper.java接口,那么相应的UserMapper.xml文件可能包含了与用户数相关的SQL操作。

  2. ExecutorExecutor是MyBatis中的一个关键组件,它负责执行SQL语句。Executor的主要任务接收XxxxMapper.xml文件中定义的SQL语句,执行这些SQL语句,处理结果集,并将结果返回调用者

    在MyBatis中,有两种主要类型Executor

ExecutorXxxxMapper.xml之间的关系可以总结如下

总之,Executor是MyBatis中用于执行SQL语句的核心组件,而XxxxMapper.xml文件用于定义SQL语句和结果映射的配置。它们一起工作,使得你可以通过Mapper接口的方法来执行数据库操作,而无需编写大量的SQL语句和繁琐的结果映射代码


MyBatis 是一个开源的持久层框架,它的底层具体原理主要包括以下几个方面:

  1. SQL 解析与执行:MyBatis 使用 SQL 解析器解析 XML 配置文件中定义的 SQL 语句,将其转换为对应数据结构,包括 SQL 语句类型、参数、返回类型等。通过 JDBC 驱动程序执行对应的 SQL 语句,并处理结果集的映射。
  2. 映射器(Mapper) :MyBatis 使用映射器来处理与数据库交互逻辑。映射器是一个接口,在 Java 代码定义数据库操作的方法。MyBatis 通过映射器将方法与 XML 配置文件中的 SQL 语句进行关联,并处理 SQL 语句的执行和结果的映射。
  3. 对象关系映射(ORM):MyBatis 提供了对象关系映射的功能,将数据库表记录映射为 Java 对象,并将 Java 对象的属性映射为数据库表的字段。通过映射器和映射配置,可以实现对象与表之间的转换,提供方便的 CRUD 操作。
  4. 缓存管理:MyBatis 的缓存机制可以提高查询性能。它会缓存查询结果,避免重复查询数据库。MyBatis 通过缓存管理器来管理缓存,可以配置不同级别的缓存策略,如一级缓存(本地缓存)和二级缓存(分布式缓存),以及全局缓存。
  5. 事务管理:MyBatis 可以与事务管理器进行集成,进行事务的提交回滚回滚点的设置。它可以与各种事务管理器进行配合,如 JDBC 事务、Spring 事务等。

总的来说,MyBatis 的底层原理包括 SQL 解析与执行、映射器、对象关系映射(ORM)、缓存管理以及事务管理等。通过这些机制,MyBatis 实现了方便灵活的数据库交互和持久化操作,同时提供了缓存和事务管理等功能,以便开发者能够更高效地进行数据库操作。


源码debug

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MyBatis注解

〉Arg.class

〉AutomapConstructor.class

〉CacheNamespace.class

〉CacheNamespaceRef.class

〉Case.class

〉ConstructorArgs.class

〉Delete.class @Delete:实现删除功能

〉DeleteProvider.class

〉Flush.class

〉Insert.class @Insert:实现新增功能 @Insert:实现插入功能

〉InsertProvider.class

〉Lang.class

〉Many.class @many用于一对多关系映射

〉MapKey.class

〉Mapper.class

〉One.class @one:用于一对一关系映射

〉Options.class

〉Param.class @Param:映射多个参数

〉Property.class

〉Result.class 结果集映射

〉ResultMap.class 结果集映射

〉Results.class 结果集映射

〉ResultType.class 返回类型

〉Select.class @Select:实现查询功能

〉SelectKey.class @SelectKey:插入后,获取id的值

〉SelectProvider.class

〉TypeDiscriminator.class

〉Update.class @Update:实现更新功能

〉UpdateProvider.class

动态SQL

⚠ : if 标签中的test属性的值可以不带#{}, 对象中的属性

动态SQL就是让SQL的拼接不那么死板, 可以由程序员自定义拼接

映射关系

一对一映射关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
值得注意的是MyBatis有自己的机制, 那就是可以避免无限级联查询, 之前思考过的问题 : 主人和宠物之间的一对多关系的时候


MyBatis执行SQL的两种方式

在这里插入图片描述

执行器随记

CachingExecutorSimpleExecutor 都是 MyBatis 框架中的执行器(Executor)的实现,用于执行 SQL 语句和处理数据库操作。它们之间的主要区别在于缓存的使用方式。

  1. SimpleExecutorSimpleExecutor 是 MyBatis 默认的执行器。它执行 SQL 语句,但不使用缓存机制。每次执行相同的 SQL 语句时,都会直接查询数据库,不会对查询结果进行缓存。这意味着每次执行查询都会从数据库中获取数据,不会利用内存中的缓存。
  2. CachingExecutorCachingExecutor 是一个装饰模式下的执行器,它可以包装其他执行器,通常是 SimpleExecutor。它的主要作用添加缓存支持。当一个查询语句被执行时,CachingExecutor 会首先检查缓存中是否已经有相同的查询结果。如果缓存中有数据,它会从缓存中返回结果,而不会实际执行 SQL 查询。如果缓存中没有数据,它会调用包装的执行器(通常是 SimpleExecutor)执行 SQL 查询,然后将结果缓存起来,以便下次查询时使用。

使用 CachingExecutor 可以提高查询性能,特别是在需要频繁执行相同查询的情况下,因为它避免了不必要的数据库查询操作。然而,需要注意的是,缓存可能导致数据一致性问题,因此在使用缓存时,你需要谨慎处理缓存的清除更新

你可以在 MyBatis 的配置文件中配置执行器的类型,以决定使用哪种执行器。例如,你可以在配置文件中指定以下内容选择 CachingExecutor

xmlCopy code<settings>
    <setting name="defaultExecutorType" value="REUSE" />
</settings>

这将在全局范围内将执行器类型设置REUSE,这将使用 CachingExecutor 来执行 SQL 查询。但是,你也可以在具体的 Mapper 接口中使用 @Select 注解useCache 属性来覆盖全局配置,以决定是否使用缓存。

缓存

二级缓存的大开关(mybatisconfig.xml)和小配置(XxxxMapper.xml)
在这里插入图片描述
如何禁用二级缓存

1)

D:hspedu_mybatis_lxmybatismybatis_cachesrcmainresourcesmybatisconfig.xml


2)

在D:hspedu_mybatis_lxmybatismybatis_cachesrcmainjavacomhspedumapperMonsterMapper.xml

3) 或者更加细粒度的 , 在配置方法上指定

设置 useCache=false 可以禁用当前 select 语句的二级缓存,即每次查询都会发出 sql 去查询,默认情况是 true,即该 sql 使用二级缓存。


注意:一般我们不需要去修改,使用默认即可

4. mybatis 刷新二级缓存的设置

UPDATE mybatis_monster SET NAME=#{name},age=#{age} WHERE id=#{id}

insertupdatedelete 操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读

默认为 true ,默认情况下为 true刷新缓存,一般不用修改

两个缓存的事

sqlSession.clearCache() 方法在 MyBatis 中用于清理一级缓存(本地缓存)。它不会清理二级缓存。

如果您希望清理二级缓存,可以在 MyBatis 的配置中配置相应的 <cache/> 标签来管理二级缓存,或者使用相应的方式来手动清理。但是,sqlSession.clearCache() 主要用于清理当前 sqlSession 中的一级缓存。


⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️⚠️☣️

解释一下这句话 : 不会出现一级缓存和二级缓存中有同一个数据。因为二级缓存(数据)是在一级缓存关闭之后才有的

这句话的含义是,一级缓存(本地缓存)和二级缓存(全局缓存)中不会同时包含相同的数据。这是因为二级缓存中的数据只有在一级缓存关闭(或未命中)的情况下才会被添加到二级缓存中。

具体来说:

  1. 一级缓存(本地缓存): 当您执行一个查询操作时,查询结果会被缓存在当前sqlSession 中。如果您再次执行相同的查询,MyBatis会首先查看一级缓存,如果有缓存的数据,将直接返回,而不需要再次查询数据库。这是一级缓存的工作方式。
  2. 二级缓存(全局缓存): 二级缓存是一个跨 sqlSession 的缓存。如果您在一个 sqlSession 中查询了数据,然后关闭了该 sqlSession,在另一个新的 sqlSession 中再次查询相同的数据,MyBatis会首先查看二级缓存。如果在二级缓存中有缓存的数据,将直接返回,而不需要查询数据库。这是二级缓存的工作方式。

由于一级缓存是在每个 sqlSession独立的,而二级缓存是在多个 sqlSession 之间共享的,因此在一个 sqlSession 中缓存了数据后,这些数据不会立刻添加到二级缓存。只有在该 sqlSession 关闭时,如果有相应的配置,数据才会被写入二级缓存。

因此,一级缓存和二级缓存的数据是不会重叠的,因为在同一个 sqlSession 中使用一级缓存,而在不同 sqlSession 之间使用二级缓存。这保证了数据的一致性和避免了数据冗余

Ehcache

第三方二级缓存Ehcache

属性解释

属性名 含义 解释
name 缓存名称 每个缓存区域应该有一个唯一名称以便在 MyBatis 中引用和配置缓存。
maxElementsInMemory 缓存最大数 用于配置缓存在内存中的缓存元素的最大数量。它决定了内存缓存的容量上限。
maxElementsOnDisk 硬盘最大缓存个数 用于配置磁盘上存储的缓存元素的最大数
eternal 对象是否永久有效 一但设置了,TTL和TTI将不起作用
overflowToDisk 是否保存磁盘,当系统宕机 缓存中的元素是否应在内存不足时写入磁盘以释放内存
☣️timeToIdleSeconds 设置对象在失效前的允许闲置时间单位:秒) 在一直不访问这个对象的前提下,这个对象可以在cache中的存活时间
☣️timeToLiveSeconds 设置对象在失效前允许存活时间单位:秒), 最大时间介于创建时间和失效时间之间。 就是 无论对象访问或是不访问(闲置),这个对象在cache中的存活时间
diskPersistent 是否缓存虚拟机重启期数据 用于控制在缓存关闭(或系统重启)后是否保留磁盘上的缓存数据默认值false
diskSpoolBufferSizeMB 这个参数设置 DiskStore (磁盘缓存) 的缓存区大小 默认是30MB。这个属性决定了当数据被写入磁盘时,缓冲区大小,以及一次写入多少数据到磁盘。
diskExpiryThreadIntervalSeconds 磁盘失效线程运行时间间隔,默认是 120秒。 用于配置在磁盘上存储的缓存数据过期检查线程运行间隔时间,以秒为单位
memoryStoreEvictionPolicy 当达到maxElementsInMemory 限制时,Ehcache 将会根据指定策略去清理内存。 FIFO,first in first out,先进先出。LFU,Less Frequently Used,一直以来. 最少被使用的。LRU,Least Recently Used (默认策略),最近最少使用的。
clearOnFlush 内存数量最大时是否清除 用于控制在缓存刷新flush)时是否清空缓存中的所有数据。

FIFO,first in first out这个大家最熟的,先进先出。LFU, Less Frequently Used,直白一点就是一直以来. 最少被使用的。如上面所讲,缓存的元素有一个 hit 属性,hit 值最小的将会被清出缓存。LRU,Least Recently Used最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存

原文地址:https://blog.csdn.net/dandelionl_/article/details/134470839

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50421.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注