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流程
最新文章
- OpenCascade Eigenvalues and Eigenvectors of Square Matrix
- ElasticSearch集群配置
- <;转载>; OpenGL Projection Matrix
- 【Visual Lisp】变体与安全数组
- [AngularJS] Accessing Data in HTML -- controllerAs, using promises
- Java一些常见的出错异常处理
- 如何生成一副Poker
- win7 变WIFI热点 &; 在线Linux 内核代码
- Python之路【第十一篇】:CSS --暂无内容-待更新
- haproxy之配置文件解析
- 全易通人事考勤工资验厂管理系统软件创建连接SQL2000数据库的操作方法和说明
- mysql列约束
- 关于footer 小于一屏还要在底部显示的思考
- 芯灵思SInA33开发板怎样烧写镜像文件
- celery.backends.base.NotRegistered.
- CDN工作过程(第二种版本)
- 执行Import-SPWeb报错的解决办法
- Java虚拟机笔记(一):类加载机制
- 3Sum Closest - LeetCode
- 执行 update操作的时候有报错 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction