MyBatis 是 Apache 下的一个开源项目,原名为iBatis,后来因为项目托管平台迁移,更名为 MyBatis,它采用配置文件动态管理SQL语句,包含输入输出类型映射,数据库连接池配置的持久层框架。

1、MyBatis 整体架构

MyBatis 包含数据源配置文件, SQL 映射配置文件,会话工厂,会话,执行器及底层封装对象。

SQL 映射文件,包含select,update,insert标签,parameterType指定输入参数类型,resultType用于指定返回类型。

resultMap用于定义复杂的包含其他Bean的 Java Bean 对象,结合 association,collection 实现多表关联。

2、MyBatis 运行流程

通过Resource资源加载类读取 MyBatis 的全局配置文件 mybatis-config.xml,生成 SqlSessionFactory 会话工厂,会话工厂生成 SqlSession 会话对象,会话对象内部通过 Executor 接口对数据库进行增删改查操作。Executor 接口内部依赖 MappedStatement 底层封装对象,即对SQL语句ID,输入参数,输出结果类型的映射信息进行封装。

3、MyBatis 基本执行器

BaseExecutor 基本执行器有三种,SimpleExecutor,ReuseExecutor,和BatchExecutor,默认为SimpleExecutor。

SimpleExecutor,简单执行器,没执行一次select/update语句,开启一个Statement对象,用完立刻关闭。

ReuseExecutor,可重复使用执行器,会缓存同一个sql的Statement对象,存在就使用,不存在就创建,用完后不关闭,供下次使用。

BatchExecutor,批处理执行器,用于执行update,将所有sql添加到批处理中,等待统一执行。

执行器为SimpleExecutor和ReuseExecutor时,insert,update,delete方法的返回值可以用于判断sql执行是否成功,0表示执行失败,非0表示sql执行影响条目数。

BatchExecutor时,这三种方法返回结果值为-2147482646,不能用于判断sql语句是否执行成功。

4、MyBatis 插件

MyBatis中,针对某种方法进行拦截调用的机制,成为插件plugin,允许拦截方法的接口有Executor,ParameterHandler,ResultSetHandler,和StatementHandler。

实现一个 plugin,需要继承Interceptor接口,并且制定需要拦截的方法的签名,例如 mybatis-plus 提供的PaginationInterceptor分页插件,

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class PaginationInterceptor extends AbstractSqlParserHandler implements Interceptor {
}

之后注册此插件即可。

5、MyBatis 高级映射及延迟加载

主要用于多表关联查询的情况,先查单表,需要时再进行关联表查询,延迟加载可以提高查询效率。

association,collection具有延迟加载的功能,在使用时,需要先开启延迟加载功能,Spring Boot 中设置如下属性:

mybatis:configuration:lazy-loading-enabled: true #延迟加载aggressive-lazy-loading: false #按需加载

6、MyBatis 缓存

MyBatis 提供一级缓存和二级缓存机制,MyBatsi 默认支持一级缓存。

1)一级缓存

一级缓存为SqlSession级别的缓存,每个SqlSession类的实例对象内部有一个HashMap数据结构,用于存储缓存数据,当执行了commit操作时,一级缓存区域会清空。

在查询缓存数据之前,如果发生了增删改等操作,SqlSession 实例会清空其一级缓存区域。

2)二级缓存

二级缓存是Mapper级别的缓存,是跨SqlSession的,多个SqlSession类的对象操作同一个Mapper配置文件中的SQL语句时,会共享一个Mapper缓存。SqlSession 类的实例对象会先查询 Mapper 的缓存区域,如果不存在就查数据库,然后将结果放到缓存区域,下次查询相同数据时直接从缓存区域中取;当某个SqlSession类的实例对象执行了增删改等操作时,Mapper实例会清空其二级缓存。

7、Mapper 动态代理

需要遵守一定的开发规范,即可实现 Mapper 动态代理,这样只需要编写DAO 层接口和对应的Mapper映射文件,交互方法由 MyBatis 框架来完成,使开发更加简洁。

接口中的方法名,参数和返回类型,和 Mapper 映射文件中定义的id,输入类型,输出类型相同,然后指定映射文件的namespace 为Mapper 接口路径即可。

MyBatis 原理相关推荐

  1. 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

    本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...

  2. 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)

    文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...

  3. mybatis 原理_深入理解MyBatis原理 MyBatis数据源与连接池

    点击上方"程序开发者社区"关注,选择"设为星标" 第一时间送达实用干货 对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文 ...

  4. java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式

    在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...

  5. 【mybatis原理工作原理】

    文章目录 mybatis原理: mybatis缓存机制 mybatis原理: mybatis的工作原理就是:先封装sql,接着调用jdbc操作数据库,最后把数据库返回的表结果封装成java类. 通过代 ...

  6. spring原理 struts2原理 hibernate原理 MyBatis原理 SpringMVC

    Spring原理 最核心的就是IOC,动态注入DI,利用java里的反射,让一个对象的创建不用new了,可以自动的生产.Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调 ...

  7. 《深入理解Mybatis原理》 02-Mybatis数据源与连接池

    对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池. 本文首先会讲述MyB ...

  8. Spring整合MyBatis原理之Mapper接口和xml文件的解析

    目录 1. 前言 2. 类 `SqlSessionFactoryBean` 2.1. 实现了 `FactoryBean` 接口的 `getObject()` 2.2. `buildSqlSession ...

  9. 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

    MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...

  10. MyBatis原理解析

    参考自: MyBatis原理分析(通俗易懂)_Coder Wang-CSDN博客_mybatis原理 从源码一层一层进行分析,写得清晰易懂.我再这里就不赘述了,就写一下自己的大白话总结吧. Mybat ...

最新文章

  1. menu.php,menu.php
  2. LeetCode House Robber II(动态规划)
  3. 蓝桥杯- 图形显示(java)
  4. Coursera 吴恩达《Machine Learning》视频 + 作业
  5. windows10自动填充密码开机自动登陆
  6. 广州a货翡翠,深圳a货翡翠
  7. python字符串大全_Python 字符串操作方法大全
  8. Pascal 语言中的关键字及保留字
  9. linux远程连接windows桌面背景,Centos远程Windows桌面_远程桌面
  10. 《设计模式》组合模式---伊利工厂
  11. 智能音箱调研报告|语音交互功能详析
  12. TCPMP源代码分析
  13. 正则匹配中文、繁体字、不常见中文
  14. 单片机c语言小车转圈,用51单片机编写的智能小车全程前进的C程序
  15. android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!
  16. 黑客入侵微软邮件服务器部署勒索软件、惠普更新打印机漏洞|12月2日全球网络安全热点
  17. 【JavaWeb】AJAX
  18. 遍历列表python_Python-遍历列表中的每两个元素
  19. 单应性矩阵和仿射变换_仿射变换透射变换单应性矩阵
  20. SMPTE 274M 协议详细解读

热门文章

  1. Pentium 4处理器架构/微架构/流水线 (7) - NetBurst前端详解 - 分支预测
  2. 与计算机密度密切相关的是,全国计算机二级MS考前冲刺试题及答案2016
  3. c语言中const的作用面试,C语言const关键字作用
  4. Unreal Engine 4 基于网格的水面模拟实现
  5. [CF671E] Organizing a Race
  6. 微信小程序报thirdScriptError Cannot read property 'setData' of undefined
  7. Windows遇到ERR_NETWORK_ACCESS_DENIED处理方案
  8. Python:numpy数组转换为json格式
  9. 5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制、剪切和粘贴...
  10. win2008r2 or centos6 硬盘挂载