Mybatis核心模块简介
Configuration
主要字段
Environment:配置DataSource和TransactionFactory
ObjectFactory:bean工厂
MapperRegistry:Mapper的注册器,用Map存放class与MapperProxyFactory的映射
InterceptorChain:插件链
TypeHandlerRegistry:TypeHandler的注册器,用Map存放jdbcType、Type与TypeHandler的映射
mappedStatements:存放StatementId与MapperStatement的映射
resultMaps:存放ResultMap
parameterMaps:存放ParameterMap
loadedResource:已加载的资源,包括xml和Mapper接口
主要方法:
addMappedStatement:注册mapperStatement
addMapper:添加Mapper到MapperRegistry中,同时解析Mapper的注解和对应的xml获取MapperStatement
getMapper:获取mapper代理
mapper解析流程

SqlSessionFactoryBuilder
build:读取xml配置构建configuration,实例化SqlSessionFactory
解析xml配置主要流程:
1.解析plugin注册到configuration.addIntercptor
2.解析objectFactory注册到configuration.setObjectFactory(factory);
3.解析objectWrapperFactory注册到configuration.setObjectWrapperFactory(factory);
4.解析environments创建datasource和transactionFactory构建environment注册到configuration
5.解析typeHandlers,注册typeHandlerRegistry.register(typeHandlerClass);
6.解析mappers,根据类型解析xml或者直接addMapper
SqlSessionFactory
提供OpenSession方法,获取SqlSession
SqlSession
提供查询、更新、插入、删除接口,从configuration获取MapperStatement,然后底层委托给Executor实现
提供获取Mapper接口,底层委托给Configuration的getMapper
Executor

1.BaseExecutor:实现一级缓存,与statement交互逻辑交给子类实现
2.SimpleExecutor:每次执行sql,创建一个statement,用完关闭,默认配置
3.BatchExecutor:批量执行update语句,执行select语句时先flushStatements
4.ReuseExecutor:复用statement,如果sql相同从map中获取statement,flushStatements时关闭所有statement
5.cachingExecutor:使用装饰者模式,实现二级缓存
executor将statement与db交互的逻辑委托给StatementHandler
StatementHandler

1.SimpleStatementHandler:实现Statement与db交互功能,相当于下面的语句
Statement stm = conn.createStatement()
return stm.execute(sql);
2.PreparedStatementHandler:实现PreparedStatement与db交互功能,相当于下面的语句
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1, "Hello");
return pstm.execute();
3.CallableStatementHandler:实现CallableStatement与db交互功能,相当于下面的语句
CallableStatement cs = conn.prepareCall("{call pr_add(?,?,?)}");
cs.registerOutParameter(3, Types.INTEGER);
cs.setInt(1, 10);
cs.setString(2, "Hello");
cs.execute();
return cs.getInt(3);
4.RoutingStatementHandler:根据MappedStatement的statementType将功能委托给上面三种statementHandler
ParameterHandler
setParameters:实现参数注入到preparedStatement中,相对与下面语句
preparedStatement.setString(1, "Hello");
preparedStatement.setString(2, "Hello");
preparedStatement.setString(3, "Hello");
callableStatement.setInt(1, 10);
callableStatement.setInt(2, 10);
callableStatement.setInt(3, 10);
ResultSetHandler
handlerResultSets:实现ResultSet结果转换为pojo,相当于下面的语句
User user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
TypeHandler
实现Statement参数设置和ResultSet类型转换
setParameter:ps.setArray(i, (Array) parameter);
getResult:rs.getArray(columnName)
整体sql流程

Mybatis核心模块简介的更多相关文章
- SSH与ansible 部署方法与核心模块简介
SSH与ansible 部署方法 部署环境 管理服务器 172.16.1.61 NFS服务器 172.16.1.31 备份服务器 172.16.1.41 1检查SSH服务是否运行并开启服务 netst ...
- Nodejs进阶:核心模块net入门与实例讲解
模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net. ...
- Qt5模块简介
原文链接:Qt5 模块简介 无意中看到这篇文章,虽然讲的不是经常用的东西,但是看了这篇文章之后,可以对qt有个大致的了解,能够清晰的知道自己想要什么,应该关注那一部分,学习了,相信以后会又很大 ...
- MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...
- [转]ASP.NET 核心模块配置参考
本文转自:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore ...
- 1.2(Mybatis学习笔记)Mybatis核心配置
一.Mybatis核心对象 1.1SqlSeesionFactory SqlSessionFactory主要作用是创建时SqlSession. SqlSessionFactory可通过SqlSessi ...
- Qt 学习之路 2(6):Qt 模块简介
Home / Qt 学习之路 2 / Qt 学习之路 2(6):Qt 模块简介 豆子 2012年8月26日 Qt 学习之路 2 20条评论 Qt 5 与 Qt 4 最大的一个区别之一是底层架构 ...
- MyBatis 核心配置综述之 ParameterHandler
目录 ParameterHandler 简介 ParameterHandler 创建 ParameterHandler 中的参数从何而来 ParameterHandler 解析 MyBatis 四大核 ...
- iOS开发UI篇—核心动画简介
转自:http://www.cnblogs.com/wendingding/p/3801036.html iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画 ...
随机推荐
- day01---学习Mysql高级性能优化1
Mysql逻辑架构图
- python之浅谈编程语言
一.编程语言的分类 机器语言(低级语言) 可以直接和硬件交互,用0和1和计算机沟通 优点:执行效率高(因为可以直接和计算机沟通) 缺点:开发效率低(都是用0和1进行编码) 汇编语言 同样可以直接和硬件 ...
- Spring 获取单例流程(三)
读完这篇文章你将会收获到 Spring 何时将 bean 加入到第三级缓存和第一级缓存中 Spring 何时回调各种 Aware 接口.BeanPostProcessor .InitializingB ...
- 洛谷 P1215 【[USACO1.4]母亲的牛奶 Mother's Milk】
这道题\(DFS\)就好了,六种情况,\(ab,ac,ba,bc,ca,cb\),我们直接枚举就可.什么?这样不会结束?用一个\(vis\)数组判断走过没有就可以了.最后排序输出即可. \(code: ...
- WSL配置高翔vslam环境
WSL配置高翔vslam环境 步骤: 安装 windows wls 配置 g++ cmake 环境 编译运行一下例子 1. window启用 wsl 前往 "启用或关闭 Windows 功能 ...
- Oracle查询表空间使用率很慢
Oracle查询表空间使用率很慢 问题描述 执行查询表空间的语句,需要接近2min的时间才能执行完成. 以前也在其他客户的生产库遇到过一样的情况,当时是由于回收站的内容过多引起的. 不过这次的情况却不 ...
- 带你认识网站图片img懒加载和预加载的区别
懒加载 什么是懒加载? 懒加载也就是延迟加载.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览 ...
- call,apply,bind的内部原理实现
call call 方法使用一个函数执行的时候更改本身 this 指向,并传入一个或者多个参数. var obj = { name: '$call' } function _fun() { conso ...
- day48 work
1 navicat自己玩一玩 2 练习题一定要搞懂 照着我的思路一遍遍的看敲 3 熟悉pymysql的使用 4 sql注入产生的原因和解决方法 了解 5 思考:如何结合mysql实现用户的注册和登录功 ...
- 关于点击input框唤醒键盘导致input被遮盖的问题
关于点击input框唤醒键盘导致input被遮盖的问题 这个问题相信大家在实际开发过程当中都有遇见,我自己也遇见过很多次.之前在百度上看见大多数的方法利用的都是键盘唤醒了之后,页面的实际高度会发生变化 ...