苦练基本功-Mybatis

1. 什么是ORM?

对象-关系映射(Object-Relational Mapping,简称ORM)。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

苦练基本功-Mybatis_第1张图片

2.为什么使用ORM?

当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

3 常见ORM框架对比

方式

优点

缺点

应用场景

Hibernate

不再需要编写SQL就可以通过映射关系来操作数据库

当多表关联超过3个时Hibermate的级联会损失很多性能;学习成本高

适合性能要求不太苛刻的系统,不适合需要大量复杂查询的系统

SpringJDBC

内嵌Spring框架中、支持AOP;提供了统一的异常处理,框架处理了异常;事务管理

只是对原生JDBC进行一层非常薄的封装,没有缓存

需要在代码中嵌入SQL语句,适用中小型项目

Mybatis

满足灵活定制SQL和性能优化的需求

编写SQL和映射规则,工作量相对大些

性能要求高、响应快、灵活的系统;sql修改、优化比较方便

4 Mybatis

4.1 什么是 MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

4.2 Mybatis特点

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。

  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

  • 提供映射标签,支持对象与数据库的orm字段关系映射

  • 提供对象关系映射标签,支持对象关系组建维护

  • 提供xml标签,支持编写动态sql。

4.3 MyBatis功能流程的整体架构图

下图是MyBatis功能流程的整体架构图;主要包含了API接口层、数据处理层、基础支撑层。

API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

苦练基本功-Mybatis_第2张图片

4.4 MyBatis缓存

一级缓存:当在一次数据库会话中,执行多次查询条件完全相同的SQL时,MyBatis提供了一级缓存的方案优化,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,见下图。

苦练基本功-Mybatis_第3张图片

如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户,见下图。

苦练基本功-Mybatis_第4张图片

 

其中SqlSession提供用户和数据库交互的所有方法,隐藏了底层的细节。Executor: 虽然SqlSession向用户提供了操作数据库的方法,但真正和数据打交道的是Executor。Cache: MyBatis中的Cache接口,提供了和缓存相关的最基本的操作。

  1. MyBatis对会话(Session)级别的一级缓存设计的比较简单,就简单地使用了HashMap来维护,并没有对HashMap的容量和大小进行限制。

  2. 一级缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念。

4.5 MyBatis插件加载机制

Mybatis采用责任链模式,通过对下面四个接口的对象生成动态代理对象来实现的,借助这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的)

Mybatis 允许使用插件来拦截的有四个接口

  • Executor(内部执行器,可以借助插件实现自定义二级缓存)

  • StatementHandler(JDBC封装层,可以借助插件实现自定义一级缓存)

  • ResultSetHandler(结果集处理,可以借助插件对Mybatis的结果集进行修改)

  • ParameterHandler(可以借助插件改变Sql的参数默认设置)。

苦练基本功-Mybatis_第5张图片

你可能感兴趣的:(JAVA,java)