每日五道java面试题之mybatis篇(三)

目录:

  • [第一题. MyBatis的框架架构设计是怎么样的?](#第一题. MyBatis的框架架构设计是怎么样的?)
  • [第二题. 为什么需要预编译?](#第二题. 为什么需要预编译?)
  • [第三题. Mybatis都有哪些Executor执行器?它们之间的区别是什么?](#第三题. Mybatis都有哪些Executor执行器?它们之间的区别是什么?)
  • [第四题. Mybatis中如何指定使用哪一种Executor执行器?](#第四题. Mybatis中如何指定使用哪一种Executor执行器?)
  • [第五题. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?](#第五题. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?)

第一题. MyBatis的框架架构设计是怎么样的?

这张图从上往下看。MyBatis的初始化,会从mybatis-config.xml配置文件,解析构造成Configuration这个类,就是图中的红框。

(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

第二题. 为什么需要预编译?

  1. 定义
    SQL 预编译指的是数据库驱动在发送 SQL 语句和参数给 DBMS 之前对 SQL 语句进行编译,这样 DBMS 执行 SQL 时,就不需要重新编译。
  2. 为什么需要预编译
    JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以优化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的SQL,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。同时预编译语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。Mybatis默认情况下,将对所有的 SQL进行预编译。

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

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

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

第四题. Mybatis中如何指定使用哪一种Executor执行器?

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

配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语

句(prepared statements); BATCH 执行器将重用语句并执行批量更新。

第五题. 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,支持延迟加载的原理都是

一样的

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力

相关推荐
yvya_3 分钟前
JVM介绍
java·开发语言·jvm
烟雨书信12 分钟前
LINUX中Docker Swarm的介绍和使用
java·linux·docker
今天秃头了吗??27 分钟前
【JAVA】网络编程
java·网络·网络编程·socket
煎饼皮皮侠30 分钟前
【图解】idea中快速查找maven冲突
java·maven·intellij-idea·冲突
rockmelodies31 分钟前
【PHP7内核剖析】-1.1 PHP概述
开发语言·php
科兴第一吴彦祖31 分钟前
在线会议系统是一个基于Vue3 + Spring Boot的现代化在线会议管理平台,集成了视频会议、实时聊天、AI智能助手等多项先进技术。
java·vue.js·人工智能·spring boot·推荐算法
工一木子31 分钟前
HashMap源码深度解析:从“图书馆“到“智能仓库“的进化史
java·源码·hashmap
又菜又爱玩呜呜呜~42 分钟前
go使用反射获取http.Request参数到结构体
开发语言·http·golang
摸鱼仙人~1 小时前
一文详解 Python 密码哈希库 Passlib
开发语言·python·哈希算法