mybatis源码解析(近日持续更新)

资源

中文文档:
https://mybatis.org/mybatis-3/zh/getting-started.html

bilibili视频
https://www.bilibili.com/video/BV1R14y1W7yS/?spm_id_from=333.337.search-card.all.click&vd_source=d219811e9d440a60ff3810c0d5349f43(引用了很多图片和代码)

github 源码
https://github.com/mybatis/mybatis-3

简要介绍

mybatis架构

mybatis架构分为:

  • 接口层
  • 数据处理层
  • 框架支撑层
  • 引导层

在这里插入图片描述

JDBC的“原始代码”

首先,需要说明的是,mybatis底层封装的其实就是JDBC的“原始代码”,这个“原始代码” 比较啰嗦繁琐,mybatis将一些重复的东西隐藏了,只需要我们提供关键信息就可以正常运行。下面我先贴上JDBC的“原始代码”。其实mybatis做的也是同样的事情!

public static void main(String[] args) { 
    	Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
	try {
	// 加载数据库驱动
	Class.forName("com.mysql.jdbc.Driver");
	// 通过驱动管理类获取数据库链接
	connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis? characterEncoding=utf-8", "root", "root");
	// 定义sql语句?表示占位符
	String sql = "select * from user where username = ?";
	// 获取预处理statement
	preparedStatement = connection.prepareStatement(sql);
	// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值 preparedStatement.setString(1, "tom");
	// 向数据库发出sql执行查询,查询出结果集
	resultSet = preparedStatement.executeQuery();
	// 遍历查询结果集
	while (resultSet.next()) {
		int id = resultSet.getInt("id");
		String username = resultSet.getString("username");
	// 封装User
		user.setId(id);
		user.setUsername(username);
	}
		System.out.println(user);
	}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		  // 释放资源
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
	}
}

JDBC的原始代码用肯定是能用的,但是存在一些问题,mybatis解决了这些问题:

存在问题优化思路
数据库配置信息存在硬编码问题使用配置文件
频繁创建、释放数据库连接问题使用数据连接池
SQL语句、设置参数、获取结果集参数均存在硬编码问题使用配置文件
手动封装返回结果集,较为繁琐使用Java反射、内省

mybatis 主要接口和对象

最主要的接口或者对象就是

  1. SqlSession:SqlSessionFactoryBuilder 创建了SqlSessionFactory,SqlSessionFactory创建了SqlSession
  2. Executor (mybatis 4大对象之一):sql执行器,封装了query,update,commit,close等数据库操作方法,控制缓存等
  3. StatementHandler (mybatis 4大对象之一):真正控制执行sql语句的“实际管理者”
  4. ParameterHandler (mybatis 4大对象之一):负责从xml注解到sql语句的映射:将xml或者注解中的sql(例如:select * from user where id = #{id})翻译成JDBC Statement 接口能执行的sql 字符串(例如:select * from user where id = ?)
  5. ResultSetHandler (mybatis 4大对象之一):负责从sql数据到java对象的映射
    在这里插入图片描述

1.SqlSession

sqlSession不难理解,就像浏览器登录网站时的session一样,一连串的交互在同一个session会话中。后端与数据库交互前也需要构建session,在mybatis中,构建session之前做了一些连接前的准备,如下

1.1 SqlSessionFactory sqlSessionFactory = SqlSessionFactoryBuilder().build(resourceAsStream)

这里的resourceAsStream 是xml配置文件的字节输入流,可以这样获取:(sqlMapConfig.xml是在resourses下你配置的mybatis配置xml文件)
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

在这个build方法中,会做如下几个动作

  1. 构建XpathParser对象,使用Xpath方式解析xml文件
  2. 使用XpathParser解析mybatis全局配置文件得到:configuration节点下:properties,settings,typeAliases,plugins,objectFactory,objectWrapperFactory,reflectorFactory,environments,databaseIdProvider,typeHandlers,mappers子节点。得到org.apache.ibatis.session.Configuration类的全局配置对象:configuration
    (1). 其中XMLMapperBuilder 专门获取下的信息,XMLMapperBuilder 还有个助手MapperBuilderAssistant
    (2). XMLStatementBuilder专门解析mapper中的一条select|insert|update|delete节点中内容
  3. 将configuration作为参数构建 new DefaultSqlSessionFactory(config);

1.2 SqlSession sqlSession = sqlSessionFactory.openSession();

先贴一段比较重要的代码

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      // 从configuration对象中获取environment对象
      final Environment environment = configuration.getEnvironment();
      // 获得事务工厂对象
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      // 构建事务对象
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      // 创建执行器对象
      final Executor executor = configuration.newExecutor(tx, execType);
      // 创建DefaultSqlSession对象
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

上一步创建了DefaultSqlSessionFactory类的对象sqlSessionFactory,现在用它来创建SqlSession,在创建中,做了如下几个动作:

  1. 创建Transaction事务对象(先从environment中尝试获取transactionFactory,再创建Transaction对象),再跟源码时我们可以看见 标识事务隔离界别的枚举类:TransactionIsolationLevel中有对象:NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE,SQL_SERVER_SNAPSHOT(sql server特殊处理)
  2. 创建Executor,会在下文中介绍,这里我们看见ExecuterType:SIMPLE, REUSE, BATCH(这三个有什么区别大家可以网上找一下,这里不再细述https://www.cnblogs.com/wwct/p/12994222.html)
  3. 创建SqlSession对象:new DefaultSqlSession

到这里才真正创建了SqlSession对象

2.Configuration

2.1 incompleteResultMaps属性

  1. Collection incompleteResultMaps 属性 在解析resultMap,例如:
    <resultMap id="selectAuthor" type="org.apache.ibatis.domain.blog.Author">
        <id column="id" property="id" />
        <result property="username" column="username" />
        <result property="password" column="password" />
        <result property="email" column="email" />
        <result property="bio" column="bio" />
        <result property="favouriteSection" column="favourite_section" />
    </resultMap>

我们找到mapper的dtd文件是这么定义的

<!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST resultMap
id CDATA #REQUIRED
type CDATA #REQUIRED
extends CDATA #IMPLIED
autoMapping (true|false) #IMPLIED

所以resultMap是可以有extends属性的,当解析一个resultMap时,extends的resultMap还没有被解析出来,就会把这个resultMap放在incompleteResultMaps 中,之后会重复解析,直到解析成功。

<resultMap id="draftPost" type="org.apache.ibatis.domain.blog.DraftPost" extends="joinedPost"/>

Executor

封装了JDBC的query和update方法,同时还包括缓存、事务等操作的管理

StatementHandler

ResultSetHandler

mybatis提供的插件功能 Interceptor

概括

tree . /F> ./tree.txt
可以在window下打印文件结构到文件中,mybatis文件结构及注释

└─ibatis
    │  package-info.java
    │  
    ├─annotations
    │      Arg.java
    │      AutomapConstructor.java
    │      CacheNamespace.java
    │      CacheNamespaceRef.java
    │      Case.java
    │      ConstructorArgs.java
    │      Delete.java
    │      DeleteProvider.java
    │      Flush.java
    │      Insert.java
    │      InsertProvider.java
    │      Lang.java
    │      Many.java
    │      MapKey.java
    │      Mapper.java
    │      One.java
    │      Options.java
    │      package-info.java
    │      Param.java
    │      Property.java
    │      Result.java
    │      ResultMap.java
    │      Results.java
    │      ResultType.java
    │      Select.java
    │      SelectKey.java
    │      SelectProvider.java
    │      TypeDiscriminator.java
    │      Update.java
    │      UpdateProvider.java
    │      
    ├─binding
    │      BindingException.java
    │      MapperMethod.java
    │      MapperProxy.java
    │      MapperProxyFactory.java
    │      MapperRegistry.java
    │      package-info.java
    │      
    ├─builder
    │  │  BaseBuilder.java
    │  │  BuilderException.java
    │  │  CacheRefResolver.java
    │  │  IncompleteElementException.java
    │  │  InitializingObject.java
    │  │  MapperBuilderAssistant.java
    │  │  package-info.java
    │  │  ParameterExpression.java
    │  │  ResultMapResolver.java
    │  │  SqlSourceBuilder.java			//有内部类ParameterMappingTokenHandler解析 mapper.xml中#{} 中的信息存到 List<ParameterMapping> parameterMappings 中
    │  │  StaticSqlSource.java			//SqlSource实现类,描述经过ProviderSqlSource、DynamicSqlSource或者RawSqlSource解析后得到的静态SQL信息。
    │  │  
    │  ├─annotation
    │  │      MapperAnnotationBuilder.java
    │  │      MethodResolver.java
    │  │      package-info.java
    │  │      ProviderContext.java
    │  │      ProviderMethodResolver.java
    │  │      ProviderSqlSource.java		//SqlSource实现类,描述通过@SelectProvider、@InsertProvider、@DeleteProvider和@UpdateProvider注解配置的SQL信息
    │  │      
    │  └─xml
    │          mybatis-3-config.dtd			//config.xml规范
    │          mybatis-3-mapper.dtd			//mapper.xml规范
    │          mybatis-config.xsd			//config.xml规范2
    │          mybatis-mapper.xsd			//mapper.xml规范2
    │          package-info.java
    │          XMLConfigBuilder.java		//config.xml 解析工具类,SqlSessionFactoryBuilder().build(resourceAsStream)时会调用,解析得到Configuration信息
    │          XMLIncludeTransformer.java		//解析mapper.xml中的<include> 标签
    │          XMLMapperBuilder.java		//解析整个mapper文件的工具类
    │          XMLMapperEntityResolver.java
    │          XMLStatementBuilder.java			//解析mapper.xml文件中的<select>\<insert>\<update>\<delete>子标签,然后通过MapperBuilderAssistant创建 MappedStatement对象,表示一条sql语句以及相关信息
    │          
    ├─cache
    │  │  Cache.java
    │  │  CacheException.java
    │  │  CacheKey.java			//一二级缓存的key,BaseExecutor中创建(mapper文件中使用<mapper></mapper>标签开启二级缓存)
    │  │  NullCacheKey.java
    │  │  package-info.java
    │  │  TransactionalCacheManager.java		//一个Executor[sqlSessionFactory.openSession()时创建]中可能会涉及多个事务,也就涉及多个TransactionalCache,通过TransactionalCacheManager来统一管理
    │  │  
    │  ├─decorators
    │  │      BlockingCache.java
    │  │      FifoCache.java
    │  │      LoggingCache.java
    │  │      LruCache.java
    │  │      package-info.java
    │  │      ScheduledCache.java
    │  │      SerializedCache.java
    │  │      SoftCache.java
    │  │      SynchronizedCache.java
    │  │      TransactionalCache.java		//1.delegate属性中有二级缓存内容(每次查询时从Configuration对象获取Cache对象),2.保持事务中的数据,commit时TransactionalCacheManager将数据保存到二级缓存中(见CachingExecutor#commit方法)
    │  │      WeakCache.java
    │  │      
    │  └─impl
    │          package-info.java
    │          PerpetualCache.java
    │          
    ├─cursor
    │  │  Cursor.java
    │  │  package-info.java
    │  │  
    │  └─defaults
    │          DefaultCursor.java
    │          package-info.java
    │          
    ├─datasource
    │  │  DataSourceException.java
    │  │  DataSourceFactory.java
    │  │  package-info.java
    │  │  
    │  ├─jndi
    │  │      JndiDataSourceFactory.java
    │  │      package-info.java
    │  │      
    │  ├─pooled
    │  │      package-info.java
    │  │      PooledConnection.java
    │  │      PooledDataSource.java
    │  │      PooledDataSourceFactory.java
    │  │      PoolState.java
    │  │      
    │  └─unpooled
    │          package-info.java
    │          UnpooledDataSource.java
    │          UnpooledDataSourceFactory.java
    │          
    ├─exceptions
    │      ExceptionFactory.java			//根据ErrorContext记录的上下文信息创建错误PersistenceException
    │      IbatisException.java
    │      package-info.java
    │      PersistenceException.java			//自定义异常
    │      TooManyResultsException.java
    │      
    ├─executor
    │  │  BaseExecutor.java			//抽象类,子类有SimpleExecutor,BatchExecutor,ReuseExecutor,管理一级缓存、子类共有方法
    │  │  BatchExecutor.java		//它会将多个Statement对象一次性发送给数据库执行,以提高执行效率。BatchExecutor是通过JDBC的addBatch()和executeBatch()方法来实现的,可以将一组SQL语句打包在一起执行,减少了数据库连接的建立和关闭次数,从而提高了批量操作的效率。
    │  │  BatchExecutorException.java
    │  │  BatchResult.java
    │  │  CachingExecutor.java			//Executor代理(delegate被代理对象),主要负责缓存动作(TransactionalCacheManager tcm事务缓存管理组件)
    │  │  ErrorContext.java			//记录全局状态,方便发送错误时进行跟踪:https://blog.csdn.net/lqzkcx3/article/details/84944285
    │  │  ExecutionPlaceholder.java
    │  │  Executor.java				//接口,子类有CachingExecutor,BaseExecutor,SimpleExecutor,BatchExecutor,ReuseExecutor
    │  │  ExecutorException.java		//PersistenceException的子类
    │  │  package-info.java
    │  │  ResultExtractor.java
    │  │  ReuseExecutor.java		//使用Statement缓存来重用已有的Statement对象
    │  │  SimpleExecutor.java		//普通executor
    │  │  
    │  ├─keygen
    │  │      Jdbc3KeyGenerator.java
    │  │      KeyGenerator.java
    │  │      NoKeyGenerator.java
    │  │      package-info.java
    │  │      SelectKeyGenerator.java
    │  │      
    │  ├─loader
    │  │  │  AbstractEnhancedDeserializationProxy.java
    │  │  │  AbstractSerialStateHolder.java
    │  │  │  CglibProxyFactory.java
    │  │  │  JavassistProxyFactory.java
    │  │  │  package-info.java
    │  │  │  ProxyFactory.java
    │  │  │  ResultLoader.java
    │  │  │  ResultLoaderMap.java
    │  │  │  WriteReplaceInterface.java
    │  │  │  
    │  │  ├─cglib
    │  │  │      CglibProxyFactory.java
    │  │  │      CglibSerialStateHolder.java
    │  │  │      package-info.java
    │  │  │      
    │  │  └─javassist
    │  │          JavassistProxyFactory.java
    │  │          JavassistSerialStateHolder.java
    │  │          package-info.java
    │  │          
    │  ├─parameter
    │  │      package-info.java
    │  │      ParameterHandler.java			//接口,子类只有DefaultParameterHandler,executer中参数处理
    │  │      
    │  ├─result
    │  │      DefaultMapResultHandler.java
    │  │      DefaultResultContext.java
    │  │      DefaultResultHandler.java
    │  │      package-info.java
    │  │      ResultMapException.java
    │  │      
    │  ├─resultset
    │  │      DefaultResultSetHandler.java
    │  │      package-info.java
    │  │      ResultSetHandler.java
    │  │      ResultSetWrapper.java
    │  │      
    │  └─statement
    │          BaseStatementHandler.java		//模板方法模式,抽象类继承自StatementHandler,子类都覆写了instantiateStatement(...)方法,子类有 SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler
    │          CallableStatementHandler.java			//JDBC CallableStatement操作类
    │          package-info.java
    │          PreparedStatementHandler.java			//JDBC PrepareStatement操作类
    │          RoutingStatementHandler.java
    │          SimpleStatementHandler.java			//JDBC Statement操作类
    │          StatementHandler.java		//接口 子类有BaseStatementHandler,SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler以及代理 RoutingStatementHandler
    │          StatementUtil.java
    │          
    ├─io
    │      ClassLoaderWrapper.java
    │      DefaultVFS.java
    │      ExternalResources.java
    │      JBoss6VFS.java
    │      package-info.java
    │      ResolverUtil.java
    │      Resources.java
    │      SerialFilterChecker.java
    │      VFS.java
    │      
    ├─jdbc
    │      AbstractSQL.java
    │      Null.java
    │      package-info.java
    │      RuntimeSqlException.java
    │      ScriptRunner.java			//可以运行脚本文件,主要为了测试使用
    │      SelectBuilder.java
    │      SQL.java
    │      SqlBuilder.java
    │      SqlRunner.java
    │      
    ├─lang
    │      package-info.java
    │      UsesJava7.java
    │      UsesJava8.java
    │      
    ├─logging
    │  │  Log.java
    │  │  LogException.java
    │  │  LogFactory.java
    │  │  package-info.java
    │  │  
    │  ├─commons
    │  │      JakartaCommonsLoggingImpl.java
    │  │      package-info.java
    │  │      
    │  ├─jdbc
    │  │      BaseJdbcLogger.java
    │  │      ConnectionLogger.java			//java.sql.Connection的代理类,添加了日志
    │  │      package-info.java
    │  │      PreparedStatementLogger.java
    │  │      ResultSetLogger.java
    │  │      StatementLogger.java
    │  │      
    │  ├─jdk14
    │  │      Jdk14LoggingImpl.java
    │  │      package-info.java
    │  │      
    │  ├─log4j
    │  │      Log4jImpl.java
    │  │      package-info.java
    │  │      
    │  ├─log4j2
    │  │      Log4j2AbstractLoggerImpl.java
    │  │      Log4j2Impl.java
    │  │      Log4j2LoggerImpl.java
    │  │      package-info.java
    │  │      
    │  ├─nologging
    │  │      NoLoggingImpl.java
    │  │      package-info.java
    │  │      
    │  ├─slf4j
    │  │      package-info.java
    │  │      Slf4jImpl.java
    │  │      Slf4jLocationAwareLoggerImpl.java
    │  │      Slf4jLoggerImpl.java
    │  │      
    │  └─stdout
    │          package-info.java
    │          StdOutImpl.java
    │          
    ├─mapping
    │      BoundSql.java		//new SqlSessionFactoryBuilder().build(resourceAsStream) 时解析得到的SqlSource根据传入的参数   进一步解析得到的SQL和参数映射信息,JDBC执行需要它
    │      CacheBuilder.java
    │      DatabaseIdProvider.java
    │      DefaultDatabaseIdProvider.java
    │      Discriminator.java
    │      Environment.java
    │      FetchType.java
    │      MappedStatement.java			//解析mapper.xml得到,一个MappedStatement对应一个insert|delete|update|select,含有组件SqlSource
    │      package-info.java
    │      ParameterMap.java		//statementId,parameterType 的class或者parameterMap 的容器类
    │      ParameterMapping.java		//只有Builder构造者模式构造对象,有两个有用的方法:validate()应该是做一些校验的,resolveTypeHandler()确定具体的typeHandler属性类型
    │      ParameterMode.java
    │      ResultFlag.java
    │      ResultMap.java
    │      ResultMapping.java
    │      ResultSetType.java
    │      SqlCommandType.java		//枚举类:有 UNKNOWN, INSERT, UPDATE, DELETE, SELECT, FLUSH
    │      SqlSource.java		//I 从注解或者xml中解析得到BoundSql
    │      StatementType.java
    │      VendorDatabaseIdProvider.java
    │      
    ├─parsing
    │      GenericTokenParser.java		//GenericTokenParser 解析mapper.xml中的sql语句,变成JDBC能识别的语句,需要使用依靠组件TokenHandler的具体实现
    │      package-info.java
    │      ParsingException.java
    │      PropertyParser.java
    │      TokenHandler.java
    │      XNode.java
    │      XPathParser.java
    │      
    ├─plugin
    │      Interceptor.java
    │      InterceptorChain.java
    │      Intercepts.java
    │      Invocation.java
    │      package-info.java
    │      Plugin.java
    │      PluginException.java
    │      Signature.java
    │      
    ├─reflection
    │  │  ArrayUtil.java
    │  │  DefaultReflectorFactory.java
    │  │  ExceptionUtil.java
    │  │  Jdk.java
    │  │  MetaClass.java
    │  │  MetaObject.java
    │  │  OptionalUtil.java
    │  │  package-info.java
    │  │  ParamNameResolver.java
    │  │  ParamNameUtil.java
    │  │  ReflectionException.java
    │  │  Reflector.java
    │  │  ReflectorFactory.java
    │  │  SystemMetaObject.java
    │  │  TypeParameterResolver.java
    │  │  
    │  ├─factory
    │  │      DefaultObjectFactory.java
    │  │      ObjectFactory.java
    │  │      package-info.java
    │  │      
    │  ├─invoker
    │  │      AmbiguousMethodInvoker.java
    │  │      GetFieldInvoker.java
    │  │      Invoker.java
    │  │      MethodInvoker.java
    │  │      package-info.java
    │  │      SetFieldInvoker.java
    │  │      
    │  ├─property
    │  │      package-info.java
    │  │      PropertyCopier.java
    │  │      PropertyNamer.java
    │  │      PropertyTokenizer.java
    │  │      
    │  └─wrapper
    │          BaseWrapper.java
    │          BeanWrapper.java
    │          CollectionWrapper.java
    │          DefaultObjectWrapperFactory.java
    │          MapWrapper.java
    │          ObjectWrapper.java
    │          ObjectWrapperFactory.java
    │          package-info.java
    │          
    ├─scripting
    │  │  LanguageDriver.java
    │  │  LanguageDriverRegistry.java
    │  │  package-info.java
    │  │  ScriptingException.java
    │  │  
    │  ├─defaults
    │  │      DefaultParameterHandler.java
    │  │      package-info.java
    │  │      RawLanguageDriver.java
    │  │      RawSqlSource.java			//SqlSource实现类,描述XML配置文件中的SQL信息,sql为简单text或者只包含#{}	
    │  │      
    │  └─xmltags
    │          ChooseSqlNode.java			//解析mapper.xml中<choose>子标签
    │          DynamicContext.java
    │          DynamicSqlSource.java		//SqlSource实现类,描述SQL信息,sql中有动态sql或者有${}
    │          ExpressionEvaluator.java
    │          ForEachSqlNode.java		//解析mapper.xml中<foreach>子标签
    │          IfSqlNode.java			//<if>子标签
    │          MixedSqlNode.java		// 有List<SqlNode> contents 记录子标签集合
    │          OgnlCache.java
    │          OgnlClassResolver.java
    │          OgnlMemberAccess.java
    │          package-info.java
    │          SetSqlNode.java			// <trim prefix="SET"> 或者 <set> 标签
    │          SqlNode.java				//接口,用不同实现类的List 去描述mapper.xml中不同的sql节点/sql部分
    │          StaticTextSqlNode.java		//解析mapper.xml中某条sql语句到MappedStatement中的过程中 解析带有#{}号的SQL信息
    │          TextSqlNode.java			//解析mapper.xml中某条sql语句到MappedStatement中的过程中 解析带有${}号的SQL信息
    │          TrimSqlNode.java			//<trim> 标签
    │          VarDeclSqlNode.java			//<bind> 标签
    │          WhereSqlNode.java		//<trim prefix="WHERE"> 或者 <WHERE> 标签
    │          XMLLanguageDriver.java
    │          XMLScriptBuilder.java		//从mapper.xml构建SqlSource,如果包含${}或者动态sql,则isDynamic属性为true
    │          
    ├─session
    │  │  AutoMappingBehavior.java
    │  │  AutoMappingUnknownColumnBehavior.java
    │  │  Configuration.java
    │  │  ExecutorType.java
    │  │  LocalCacheScope.java
    │  │  package-info.java
    │  │  ResultContext.java
    │  │  ResultHandler.java
    │  │  RowBounds.java		//逻辑分页对象
    │  │  SqlSession.java
    │  │  SqlSessionException.java
    │  │  SqlSessionFactory.java
    │  │  SqlSessionFactoryBuilder.java
    │  │  SqlSessionManager.java
    │  │  TransactionIsolationLevel.java
    │  │  
    │  └─defaults
    │          DefaultSqlSession.java
    │          DefaultSqlSessionFactory.java
    │          package-info.java
    │          
    ├─transaction
    │  │  package-info.java
    │  │  Transaction.java
    │  │  TransactionException.java
    │  │  TransactionFactory.java
    │  │  
    │  ├─jdbc
    │  │      JdbcTransaction.java
    │  │      JdbcTransactionFactory.java
    │  │      package-info.java
    │  │      
    │  └─managed
    │          ManagedTransaction.java
    │          ManagedTransactionFactory.java
    │          package-info.java
    │          
    ├─type
    │      Alias.java
    │      ArrayTypeHandler.java		//TypeHandler实现类
    │      BaseTypeHandler.java			//实现TypeHandler的抽象类,模板方法模式,实现类都需要覆写抽象方法setNonNullParameter(...),getNullableResult(...)
    │      BigDecimalTypeHandler.java		//TypeHandler实现类
    │      BigIntegerTypeHandler.java
    │      BlobByteObjectArrayTypeHandler.java			//TypeHandler实现类		
    │      BlobInputStreamTypeHandler.java		//TypeHandler实现类
    │      BlobTypeHandler.java		//TypeHandler实现类
    │      BooleanTypeHandler.java		//TypeHandler实现类
    │      ByteArrayTypeHandler.java		//TypeHandler实现类
    │      ByteArrayUtils.java
    │      ByteObjectArrayTypeHandler.java		//TypeHandler实现类
    │      ByteTypeHandler.java		//TypeHandler实现类
    │      CharacterTypeHandler.java		//TypeHandler实现类
    │      ClobReaderTypeHandler.java		//TypeHandler实现类
    │      ClobTypeHandler.java		//TypeHandler实现类
    │      DateOnlyTypeHandler.java		//TypeHandler实现类
    │      DateTypeHandler.java		//TypeHandler实现类
    │      DoubleTypeHandler.java		//TypeHandler实现类
    │      EnumOrdinalTypeHandler.java		//TypeHandler实现类
    │      EnumTypeHandler.java		//TypeHandler实现类
    │      FloatTypeHandler.java		//TypeHandler实现类
    │      InstantTypeHandler.java		//TypeHandler实现类
    │      IntegerTypeHandler.java		//TypeHandler实现类
    │      JapaneseDateTypeHandler.java		//TypeHandler实现类
    │      JdbcType.java
    │      LocalDateTimeTypeHandler.java		//TypeHandler实现类
    │      LocalDateTypeHandler.java		//TypeHandler实现类
    │      LocalTimeTypeHandler.java		//TypeHandler实现类
    │      LongTypeHandler.java		//TypeHandler实现类
    │      MappedJdbcTypes.java			//注释,自定义TypeHandler实现类用
    │      MappedTypes.java				//注释,自定义TypeHandler实现类用
    │      MonthTypeHandler.java		//TypeHandler实现类
    │      NClobTypeHandler.java		//TypeHandler实现类
    │      NStringTypeHandler.java		//TypeHandler实现类
    │      ObjectTypeHandler.java		//TypeHandler实现类
    │      OffsetDateTimeTypeHandler.java		//TypeHandler实现类
    │      OffsetTimeTypeHandler.java		//TypeHandler实现类
    │      package-info.java
    │      ShortTypeHandler.java		//TypeHandler实现类
    │      SimpleTypeRegistry.java
    │      SqlDateTypeHandler.java		//TypeHandler实现类
    │      SqlTimestampTypeHandler.java		//TypeHandler实现类
    │      SqlTimeTypeHandler.java		//TypeHandler实现类
    │      SqlxmlTypeHandler.java		//TypeHandler实现类
    │      StringTypeHandler.java		//TypeHandler实现类
    │      TimeOnlyTypeHandler.java		//TypeHandler实现类
    │      TypeAliasRegistry.java		//mapper.xml中parameterType属性别名映射到具体的java Class
    │      TypeException.java
    │      TypeHandler.java			//接口,实现java类型和JDBC类型的相互转换.mybatis使用prepareStatement来进行参数设置的时候,需要通过typeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用PrepareStatement不同的set方法实现的;在获取结果返回之后,也需要将返回的结果转换成我们需要的java类型,这时候是通过调用ResultSet对象不同类型的get方法时间的;所以不同类型的typeHandler其实就是调用PrepareStatement和ResultSet的不同方法来进行类型的转换,有些时候会在调用PrepareStatement和ResultSet的相关方法之前,可以对传入的参数进行一定的处理. 
    │      TypeHandlerRegistry.java			//1.注册所有从JavaType到TypeHandler、从JdbcType到TypeHandler的映射,  2.借助UnknownTypeHandler做一个动态对象运行是确定,根据不同的javaType和JdbcType找到合适的TypeHandler实现类返回。
    │      TypeReference.java
    │      UnknownTypeHandler.java			//根据不同的javaType和JdbcType找到合适的TypeHandler实现类返回。
    │      YearMonthTypeHandler.java		//TypeHandler实现类
    │      YearTypeHandler.java		//TypeHandler实现类
    │      ZonedDateTimeTypeHandler.java		//TypeHandler实现类
    │      
    └─util
            MapUtil.java
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值