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流程

img

posted @ 2020-06-10 18:00  wuweishuo  阅读(371)  评论(0)    收藏  举报