Mybatis执行流程、缓存原理及相关面试题汇总

目录
  • 一、Mybatis执行流程
  • 二、Mybatis缓存
    • 1、一级缓存
    • 2、二级缓存
    • 3、缓存原理
  • 三、相关面试题
    • 1、为什么说 Mybatis 是半自动ORM映射工具?它与全自动的区别在哪里?
    • 2、简述一下Mybatis的执行流程吧 ?
    • 3、说一下Mybatis的优缺点 ?
    • 4、#{} 和 ${} 的区别是什么 ?
    • 5、Mybatis的动态SQL有什么作用?执行原理是什么?有哪些常用标签?
  • 总结

一、Mybatis执行流程

具体分析Mybatis是如何操作数据库的!

1、定义我们的核心配置文件的路径,这个路径是从target/classes下开始找的!

 String config = "mybatis-config.xml" ;

2、读取这个config表示的文件

 InputStream inputStream= Resources.getResourceAsStream(config);

3、创建SqlSessionFactoryBuilder对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

4、创建SqlSessionFactory对象

SqlSessionFactory sessionFactory = builder.build(inputStream);

5、获取SqlSession对象,从SqlSessionFactory中获取

SqlSession sqlSession = sessionFactory.openSession();

6、【重点】执行我们的执行的的sql语句标识。sql文件中的namespace + sql标签的Id值

String sqlId = "com.sqx.dao.UserMapper.getUserById";

7、执行sql语句,通过sqlId找到语句,并执行!

List<Object> objects = sqlSession.selectList(sqlId);

8、关闭SqlSession

sqlSession.close();

总结

Myabtis启动的时候会加载mybatis-config.xml这个核心配置文件,得到要操作的数据库以及我们Mapper文件的的信息,然后将其以数据流的形式保存起来传给SqlSessionFactoryBuilder,创造出对应该数据库的SqlSessionFactory工厂,工厂生产SqlSession,这个SqlSession中包含了对该库的增删改查方法,我们需要通过namespace + sqlId来确定我们执行的是哪个sql,这一步操作可以通过SqlSeesion.getMapper()拿到接口,通过调用接口的方法(方法绑定了我们的sql,包含namespace + sqlId),执行对应的SQL语句!

二、Mybatis缓存

Mybatis缓存无论是一级缓存还是二级缓存都是本地缓存,都会占用JVM的内存,一旦Java停止缓存失效!

1、一级缓存

概述

  • 一级缓存保存在我们的SqlSession当中
  • 只要是同一个SqlSesisson(与数据库建立的会话)就会使用同一个缓存
  • 一级缓存是我们Mybatis默认开启的!

如下是对一级缓存进行测试:

查看我们的测试结果

采用不同的SqlSession测试数据,进行如下修改!

我们再次查看测试结果

得出结论我们的一级缓存只是在同一个SqlSession当中有效!

2、二级缓存

概述

二级缓存又称"全局缓存",是基于namespace级别的缓存,一个namespace对应一个二级缓存!

工作机制:

  • 一个会话查询一条数据,这个数据会被放在一级缓存当中
  • 当我们会话关闭的时候,会把这个数据从1级缓存迁入二级缓存当中,新的会话就可以在二级缓存当中找到这个数据!
  • 不同的会话查询不同的namespace的时候,会将不同namespace中的数据缓存到自己对应的缓存(map)中!

使用步骤 :

只需在需要使用缓存的namespace 中加入< cache/>即可

<!--在当前Mapper.xml中使用二级缓存,并配置相关参数-->
<cache  eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

eviction :缓存的回收策略
	LRU(最长时间未使用)、LFU(访问次数最少)、FIFO(默认)、SOFT(软引用)、WEAK(弱引用)
flushInterval :  缓存刷新间隔
	缓存多久清空一次,默认是不会清空的,设置一个毫秒值
readOnly :是否只读
size :缓存存放多少元素

我们还可以通过配置实现自定义缓存

 <!--  开启mybatis的二级缓存,其本质还是我们mybatis帮我们实现了自身提供的缓存接口Cache,
也就是cache标签的type属性默认指定了缓存策略	-->

 <cache type=""/>
 <!--本质上就是这种写法,我们可通该修改type来选择自定缓存策略-->
 <cache type="rg.apache.ibatis.cache.impl.PerpetualCache"/>

3、缓存原理

如图所示

缓存执行流程

  • 当我们的sql执行的时候,先去二级缓存namespace中查看是否存在缓存,
  • 然后如果二级缓存不存在,查看当前sqlSession中一级缓存中是否存在,
  • 最后一、二级缓存中都不存在的话那么就去数据库查询,
  • 接着会将查询出来的结果保存在我们的一级缓存当中,
  • 当前会话(SqlSession)结束,就会将一级缓存中的数据,同步到我们的二级缓存

三、相关面试题

1、为什么说 Mybatis 是半自动ORM映射工具?它与全自动的区别在哪里?

什么是ORM

ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单 Java 对象(POJO)建里映射关系的技术。

为什么说 Mybatis 是半自动ORM映射工具?它与全自动的区别在哪里?

  • 首先,像 Hibernate、JPA 这种属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
  • 而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动 ORM 映射工具。
  • 换句话来解释就是说 MyBatis 是 半自动 ORM 最主要的一个原因是,它需要在 XML 或者注解里通过手动或插件生成 SQL,才能完成 SQL 执行结果与对象映射绑定。

2、简述一下Mybatis的执行流程吧 ?

  • MyBatis 是以一个 SqlSessionFactory 实例为核心,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
  • SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
  • SqlSessionFactory 实例工厂可以生产 SqlSession ,它里面提供了在数据库执行 SQL 命令所需的所有方法。

3、说一下Mybatis的优缺点 ?

优点

  • 基于SQL语句编写、相当灵活,SQL写在XML文件当中,解除了sql与程序代码的耦合,便于统一管理
  • 消除了JDBC的冗余代码、能够与Spring很好的集成

缺点

  • SQL语句的编写工作量大,尤其是字段多,关联表多的情况下,对开发人员的SQL语句功底有一定的要求
  • SQL语句依赖数据库,导致数据库移植性差,不能随意更换数据库

4、#{} 和 ${} 的区别是什么 ?

  • #{} 是占位符,预编译处理,${}是拼接符,字符串替换,没有预编译处理
  • mybatis在处理#{}的时候,#{} 传入的参数是字符串,会将SQL中的#{} 替换为?调用PreparedStatement的Set方法赋值
  • myabtsi在处理的 时 候 , 就 是 原 值 传 入 , 就 是 把 {}的时候,就是原值传入,就是把的时候,就是原值传入,就是把{}替换为传来的值
  • #{}通过编译预处理可以有效地防止SQL注入问题,提高系统的安全性,${}则不能防止SQL注入

5、Mybatis的动态SQL有什么作用?执行原理是什么?有哪些常用标签?

  • mybatis动态sql可以在xml映射文件内,以标签的形式编写动态sql
  • 执行原理:根据参数表达式的值完成逻辑判断,并且动态拼接sql
  • mybatis提供9种动态sql的标签:trim、where、set、foreach、if、choose、when、otherwise、bind

总结

到此这篇关于Mybatis执行流程、缓存原理及相关面试题的文章就介绍到这了,更多相关Mybatis执行流程、缓存及面试题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java经典面试题汇总:Mybatis

    目录 1. MyBatis 中 #{}和 ${}的区别是什么? 2. MyBatis 有几种分页方式? 3. MyBatis 逻辑分页和物理分页的区别是什么? 4. MyBatis 是否支持延迟加载?延迟加载的原理是什么? 5. 说一下 MyBatis 的一级缓存和二级缓存? 6. MyBatis 有哪些执行器(Executor)? 7. MyBatis 分页插件的实现原理是什么? 8. MyBatis如何返回主键? 9. Xml映射文件中,除了常见的select|insert|update|d

  • MyBatis一级缓存避坑完全指南

    一级缓存概念 当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象.那么一个SqlSession的生命周期即对应于Mybatis的一次会话.在Mybatis的一次会话中,我们很有可能多次查询完全相同的sql语句,如果不采取措施的话,每一次查询都查询一次数据库.而一次会话时间一般都是极短的,相同Sql的查询结果极有可能完全相同.由于查询数据库代价是比较大的,这会导致系统的资源浪费. 为了解决这个问题,Mybati

  • 深入理解Mybatis二级缓存

    上篇文章给大家介绍了mybatis一级缓存,有需要的朋友可以参考下. 与一级缓存相比,二级缓存范围更大了一些,可以被多个SqlSession所共用. 同样是发送同样的查询sql会先去缓存中找,找不到再去查询数据库. 每个namespace的mapper都会有自己的一个缓存的空间. 如果两个mapper的namespace相同,执行mapper查询到的数据将存储到相同的二级缓存. 同样如果有sqlSession执行了commit 会清空二级缓存. 配置文件(不用配置也是默认开启的): 在sqlMa

  • MyBatis详细执行流程的全纪录

    Mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. mybatis详细执行流程 一.通过Resource去加载全局配置文件 import org.apache.ibatis.

  • 深入理解MyBatis中的一级缓存与二级缓存

    前言 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据.不同的sqlSession之间的缓存数据区域是互相不影响的.也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的. 一级缓

  • 详解Java的MyBatis框架中的缓存与缓存的使用改进

    一级缓存与二级缓存 MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存: 一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改): 二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个App

  • Mybatis执行流程、缓存原理及相关面试题汇总

    目录 一.Mybatis执行流程 二.Mybatis缓存 1.一级缓存 2.二级缓存 3.缓存原理 三.相关面试题 1.为什么说 Mybatis 是半自动ORM映射工具?它与全自动的区别在哪里? 2.简述一下Mybatis的执行流程吧 ? 3.说一下Mybatis的优缺点 ? 4.#{} 和 ${} 的区别是什么 ? 5.Mybatis的动态SQL有什么作用?执行原理是什么?有哪些常用标签? 总结 一.Mybatis执行流程 具体分析Mybatis是如何操作数据库的! 1.定义我们的核心配置文件

  • laravel 框架执行流程与原理简单分析

    本文实例讲述了laravel 框架执行流程与原理.分享给大家供大家参考,具体如下: 1.index.php $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); 2

  • MyBatis通用Mapper实现原理及相关内容

    MyBatis通用Mapper实现原理 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程. 基本原理 通用 Mapper 提供了一些通用的方法,这些通用方法是以接口的形式提供的,例如. public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL

  • Javascript执行流程细节原理解析

    Javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的不是孤立的为你讲解每一个概念,而是通过一个简单的DEMO来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1; //定义一个全局变量 x function A(y){ var x = 2; //

  • SpringMVC底层执行流程及原理解析

    一个简单的HelloSpringMVC程序 先在web,xml中注册一个前端控制器(DispatcherServlet) <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • springboot相关面试题汇总详解

    springboot和springmvc的区别 spring boot 内嵌tomcat,Jetty和Undertow容器,可以直接运行起来,不在再做部署: spring boot 自动配置,减少了xml文件的大量配置:降低了项目搭建的复杂度 Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML. JavaConfig.hin处理起来比较繁琐.于是为了简化开发者的使用,从而创造性地推出了Spring boo

  • MyBatis Plus插件机制与执行流程原理分析详解

    MyBatis Plus插件 MyBatis Plus提供了分页插件PaginationInterceptor.执行分析插件SqlExplainInterceptor.性能分析插件PerformanceInterceptor以及乐观锁插件OptimisticLockerInterceptor. Mybatis 通过插件 (Interceptor) 可以做到拦截四大对象相关方法的执行 ,根据需求完成相关数据的动态改变. 四大对象是: Executor StatementHandler Parame

  • 浅谈Mybatis SqlSession执行流程

    目录 Mybatis执行SQL流程 SqlSession Executor Mybatis之Executor Mybatis之StatementHandler 进入ResultSetHandler Mybatis执行SQL流程 在看源码之前,我们需要了解一些基本知识,如果您没有阅读Mybatis SqlSessionFactory 初始化原理,可以先阅读Mybatis SqlSessionFactory 初始化原理这篇文章,这用更有助于我们理解接下来的文章 在看源码之前,我们需要了解一些基本知识

  • MyBatis执行Sql的流程实例解析

    这篇文章主要介绍了MyBatis执行Sql的流程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本博客着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存.动态SQl生成等细节不在本博客中体现,相应内容后面再单独写博客分析吧. 还是以之前的查询作为列子: public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public v

随机推荐