MyBatis架构

转载:MyBatis面试题(总结最全面的面试题) (juejin.cn)

1MyBatis编程步骤是什么样的?

  1. 创建SqlSessionFactory
  2. 通过SqlSessionFactory创建SqlSession
  3. 通过SqlSession执行数据库操作
  4. 调用session.commit()提交事务
  5. 调用session.close()关闭会话

2 MyBatis的工作原理(重点)

在这里插入图片描述

描述如下:

  1. 读取 MyBatis 配置文件。mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件。映射文件即 SQL 映射文件.mapper,这些文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 构造会话工厂SqlSessionFactory。通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
  4. 创建会话对象SqlSession:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
  5. Executor 执行器。MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
  6. MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
  7. 输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
  8. 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

3 MyBatis架构图

在这里插入图片描述

MyBatis的架构分为三层:

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

4 MyBatis核心对象

核心对象如下:

  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能。
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护。
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数。
  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合。
  • TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换。
  • MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装。
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回。
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息。
  • Configuration MyBatis所有的配置信息都维持在Configuration对象之中。

5 为什么需要预编译?

定义

  • SQL 预编译指的是数据库驱动在发送 SQL 语句和参数给 DBMS 之前对 SQL 语句进行编译,这样 DBMS 执行 SQL 时,就不需要重新编译。

为什么需要预编译

  • JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以优化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的SQL,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。同时预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。Mybatis默认情况下,将对所有的 SQL 进行预编译
  • 还有一个重要的原因,预编译能够有效防止SQL注入

6 Mybatis都有哪些Executor执行器?它们之间的区别是什么?

Mybatis有三种基本的Executor执行器:SimpleExecutor、ReuseExecutor、BatchExecutor。

  • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
  • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
  • BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

Executor的这些特点,都严格限制在SqlSession生命周期范围内。


7 Mybatis中如何指定使用哪一种Executor执行器?

  • 在Mybatis配置文件中,在设置(<settings>)可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数,如 :

    SqlSession openSession(ExecutorType execType)
    
  • 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。

  • MyBatis的默认执行器选择的是 SimpleExecutor。


8 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

  • Mybatis仅支持 association关联对象 和 collection关联集合对象 的 延迟加载association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false
  • 原理:使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。
  • 当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot MyBatis架构图主要包括以下几个主要组件: 1. Spring Boot:Spring Boot是一个用于快速构建Spring应用程序的开发框架。它简化了Spring应用程序的配置和部署过程,并提供了许多开箱即用的功能。 2. MyBatisMyBatis是一个持久层框架,用于将Java对象映射到关系型数据库中的数据。它提供了一种简单而强大的方式来进行数据库操作,使得开发人员可以轻松地执行CRUD操作。 3. 数据库:数据库是存储和管理数据的地方。在Spring Boot MyBatis架构图中,数据库用于存储应用程序的数据。 4. MyBatis配置文件:MyBatis配置文件是配置MyBatis框架的地方。它指定了数据库连接信息、映射文件的位置等重要配置。 5. 映射文件:映射文件是将Java对象映射到数据库表的地方。它定义了对象属性和数据库列之间的映射关系,以及操作数据库的SQL语句。 6. Mapper接口:Mapper接口是定义数据库操作方法的地方。它通常与映射文件相对应,提供了与数据库交互的方法。 7. Service层:Service层是应用程序的业务逻辑层。它负责处理业务逻辑,将请求转发给Mapper接口进行数据库操作。 8. Controller层:Controller层是应用程序的控制器层。它接收客户端的请求,调用Service层处理业务逻辑,并返回响应给客户端。 9. 数据库连接池:数据库连接池是用于管理数据库连接的工具。它提供了一种复用数据库连接的机制,提高了数据库访问性能。 总之,Spring Boot MyBatis架构图展示了Spring Boot与MyBatis框架的整合过程,包括数据库、配置文件、映射文件、Mapper接口、Service层和Controller层等组件。它们共同协作,实现了从客户端请求到数据库操作的完整流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值