MyBatis 原理
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 原理相关推荐
- 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现
本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...
- 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)
文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...
- mybatis 原理_深入理解MyBatis原理 MyBatis数据源与连接池
点击上方"程序开发者社区"关注,选择"设为星标" 第一时间送达实用干货 对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文 ...
- java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式
在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...
- 【mybatis原理工作原理】
文章目录 mybatis原理: mybatis缓存机制 mybatis原理: mybatis的工作原理就是:先封装sql,接着调用jdbc操作数据库,最后把数据库返回的表结果封装成java类. 通过代 ...
- spring原理 struts2原理 hibernate原理 MyBatis原理 SpringMVC
Spring原理 最核心的就是IOC,动态注入DI,利用java里的反射,让一个对象的创建不用new了,可以自动的生产.Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调 ...
- 《深入理解Mybatis原理》 02-Mybatis数据源与连接池
对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池. 本文首先会讲述MyB ...
- Spring整合MyBatis原理之Mapper接口和xml文件的解析
目录 1. 前言 2. 类 `SqlSessionFactoryBean` 2.1. 实现了 `FactoryBean` 接口的 `getObject()` 2.2. `buildSqlSession ...
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...
- MyBatis原理解析
参考自: MyBatis原理分析(通俗易懂)_Coder Wang-CSDN博客_mybatis原理 从源码一层一层进行分析,写得清晰易懂.我再这里就不赘述了,就写一下自己的大白话总结吧. Mybat ...
最新文章
- menu.php,menu.php
- LeetCode House Robber II(动态规划)
- 蓝桥杯- 图形显示(java)
- Coursera 吴恩达《Machine Learning》视频 + 作业
- windows10自动填充密码开机自动登陆
- 广州a货翡翠,深圳a货翡翠
- python字符串大全_Python 字符串操作方法大全
- Pascal 语言中的关键字及保留字
- linux远程连接windows桌面背景,Centos远程Windows桌面_远程桌面
- 《设计模式》组合模式---伊利工厂
- 智能音箱调研报告|语音交互功能详析
- TCPMP源代码分析
- 正则匹配中文、繁体字、不常见中文
- 单片机c语言小车转圈,用51单片机编写的智能小车全程前进的C程序
- android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!
- 黑客入侵微软邮件服务器部署勒索软件、惠普更新打印机漏洞|12月2日全球网络安全热点
- 【JavaWeb】AJAX
- 遍历列表python_Python-遍历列表中的每两个元素
- 单应性矩阵和仿射变换_仿射变换透射变换单应性矩阵
- SMPTE 274M 协议详细解读
热门文章
- Pentium 4处理器架构/微架构/流水线 (7) - NetBurst前端详解 - 分支预测
- 与计算机密度密切相关的是,全国计算机二级MS考前冲刺试题及答案2016
- c语言中const的作用面试,C语言const关键字作用
- Unreal Engine 4 基于网格的水面模拟实现
- [CF671E] Organizing a Race
- 微信小程序报thirdScriptError Cannot read property 'setData' of undefined
- Windows遇到ERR_NETWORK_ACCESS_DENIED处理方案
- Python:numpy数组转换为json格式
- 5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制、剪切和粘贴...
- win2008r2 or centos6 硬盘挂载