文章目录
资源
中文文档:
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 主要接口和对象
最主要的接口或者对象就是
- SqlSession:SqlSessionFactoryBuilder 创建了SqlSessionFactory,SqlSessionFactory创建了SqlSession
- Executor (mybatis 4大对象之一):sql执行器,封装了query,update,commit,close等数据库操作方法,控制缓存等
- StatementHandler (mybatis 4大对象之一):真正控制执行sql语句的“实际管理者”
- ParameterHandler (mybatis 4大对象之一):负责从xml注解到sql语句的映射:将xml或者注解中的sql(例如:select * from user where id = #{id})翻译成JDBC Statement 接口能执行的sql 字符串(例如:select * from user where id = ?)
- 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方法中,会做如下几个动作
- 构建XpathParser对象,使用Xpath方式解析xml文件
- 使用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节点中内容 - 将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,在创建中,做了如下几个动作:
- 创建Transaction事务对象(先从environment中尝试获取transactionFactory,再创建Transaction对象),再跟源码时我们可以看见 标识事务隔离界别的枚举类:TransactionIsolationLevel中有对象:NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE,SQL_SERVER_SNAPSHOT(sql server特殊处理)
- 创建Executor,会在下文中介绍,这里我们看见ExecuterType:SIMPLE, REUSE, BATCH(这三个有什么区别大家可以网上找一下,这里不再细述https://www.cnblogs.com/wwct/p/12994222.html)
- 创建SqlSession对象:new DefaultSqlSession
到这里才真正创建了SqlSession对象
2.Configuration
2.1 incompleteResultMaps属性
- 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