Mybatis基础工具类

SqlSessionFactory

利用mybatis配置文件创建,工厂类,生产SqlSession

SqlSession

用户和数据库打交道的层面接口

Executor

真正执行SQL的组件,接口定义了对数据库的增删改查操作。


Executor类继承图

BaseExecutor: Executor的抽象实现类,定义了方法处理流程和通用逻辑
SimpleExecutor: 简单的实现类,实现了基本的增删改查
ReuseExecutor: 对JDBC的Statement对象进行了缓存,提升系统性能。
BatchExecutor: 对同一个Mapper的update,insert,delete操作,调用批量操作功能
CachingExecutor: 对以上3种进行装饰,为查询操作增加二级缓存功能(需要打开二级缓存)

MappedStatement

mybatis通过MappedStatement保存mapper文件或注解@select,@update等配置的SQL,

StatementHandler

组件封装了对MappedStatement的操作,有几种不同的实现类,如下图


StatementHandler类继承图
ParameterHandler

对对象PrepareStatement,CallableStatement设置参数接口,方法如下:

public interface ParameterHandler {
    Object getParameterObject();

    void setParameters(PreparedStatement ps) throws SQLException;
}

该接口只有一个默认实现类DefaultParameterHandler


ParameterHandler设置参数
TypeHandler

定义了JDBC类型与Java类型的互相转换方法

    void setParameter(PreparedStatement ps, int i, T javaType, JdbcType type) throws SQLException;

    T getResult(ResultSet rs, String column) throws SQLException; 

    T getResult(ResultSet rs, int i) throws SQLException;

    T getResult(CallableStatement cs, int i) throws SQLException;

mybatis在Configuration中使用TypeHandlerRegisty保存了Class-Java-JDBC类型之间的映射关系

ResultSetHandler

定义了对ResultSet的操作

public interface ResultSetHandler {
    <E> List<E> handleResultSets(Statement var1) throws SQLException;

    <E> Cursor<E> handleCursorResultSets(Statement var1) throws SQLException;

    void handleOutputParameters(CallableStatement var1) throws SQLException;
}

只有唯一一个默认实现类DefaultResultSetHandler,处理关键逻辑如下

        List<Object> multipleResults = new ArrayList();
        int resultSetCount = 0;
        ResultSetWrapper rsw = this.getFirstResultSet(stmt);// wrapper封装
        List<ResultMap> resultMaps = this.mappedStatement.getResultMaps();//获取结果集映射,一般只有一个
        int resultMapCount = resultMaps.size();
        this.validateResultMapsCount(rsw, resultMapCount);// 校验

        while(rsw != null && resultMapCount > resultSetCount) {
            ResultMap resultMap = (ResultMap)resultMaps.get(resultSetCount);
            this.handleResultSet(rsw, resultMap, multipleResults, (ResultMapping)null);//核心
            rsw = this.getNextResultSet(stmt);
            this.cleanUpAfterHandlingResultSet();
            ++resultSetCount;
        }
        return this.collapseSingleResultList(multipleResults);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容