北京网站建设itcask,订单网站模块,深圳市网络营销推广品牌,个人建设视频网站制作概述
Mybatis 的核心组件如下所示#xff1a;
Configuration#xff1a;用于描述 MyBatis 的主配置信息#xff0c;其他组件需要获取配置信息时#xff0c;直接通过 Configuration 对象获取。除此之外#xff0c;MyBatis 在应用启动时#xff0c;将 Mapper 配置信息、类…概述
Mybatis 的核心组件如下所示
Configuration用于描述 MyBatis 的主配置信息其他组件需要获取配置信息时直接通过 Configuration 对象获取。除此之外MyBatis 在应用启动时将 Mapper 配置信息、类型别名、TypeHandler 等注册到 Configuration 组件中其他组件需要这些信息时也可以从 Configuration 对象中获取MappedStatement用于描述 Mapper 中的 SQL 配置信息是对 Mapper XML 配置文件中 select|update|delete|insert 等标签或者 Select/Update 等注解配置信息的封装SqlSession是 MyBatis 提供的面向用户的 API表示和数据库交互时的会话对象用于完成数据库的增删改查功能。SqlSession 是 Executor 组件的外观目的是对外提供易于理解和使用的数据库操作接口ExecutorMyBatis 的 SQL 执行器MyBatis 对数据库所有的增删改查操作都是由 Executor 组件完成的StatementHandler封装了对 JDBC Statement 对象的操作比如为 Statement 对象设置参数调用 Statement 接口提供的方法与数据库交互等等ParameterHandler当 MyBatis 框架使用的 Statement 类型为 CallableStatcment 和 PreparedStatement 时ParamelerHandler 用于为 Statement 对象参数占位符设置值ResultSetHandlerResultSetHandler 封装了对 JDBC 的 ResultSet 对象操作当执行 SQL 类型为 SELECT 语句时ResultSetHandler 用于将查询结果转换成 Java 对象TypeHandlerTypeHandler 是 MyBatis 中的类型处理器用于处理 Java 类型与 JDBC 类型之间的映射它的作用主要体现在能够根据 Java 类型调用 PreparedStatement 或 CallableStatement 对象对应的 set 方法为 Statement 对象设置值而且能够根据 Java 类型调用 ResultSet 对象对应的 get 获取SQL执行结果
在使用 MyBatis 时我们使用到 SqlSession 组件它是用户层面的 API。实际上 SqlSession 是Executor 组件的外观目的是为用户提供更友好的数据库操作接口这是设计模式中外观模式的典型应用。真正执行 SQL 操作的是 Executor 组件Executor 可以理解为 SQL 执行器它会使用 StatementHandler 组件对 JDBC 的 Statement 对象进行操作。当 Statement 类型为 CallableStatement 和 PreparedStatement 时会通过 ParameterHandler 组件为参数占位符赋值。ParameterHandler 组件中会根据 Java 类型找到对应的 TypeHandler 对象TypeHandler 会通过 Statement 对象提供的set 方法为 Statement 对象中的参数占位符设置值。StatementHandler 组件使用 JDBC 中的 Statement 对象与数据库完成交互后当 SQL 语句类型为 SELECT 时MyBatis 通过 ResultSetHandler 组件从 Statement 对象中获取 ResultSet 对象然后将 ResultSet 对象转换为 Java 对象 Configuration
MyBatis 框架的配置信息有两种一种是配置 MyBatis 框架属性的主配置文件另一种是配置执行 SQL 语句的 Mapper 配置文件。Configuration 的作用是描述 MyBatis 主配置文件的信息。Configuration 类中定义了一系列的属性用来控制MyBatis 运行时的行为这些属性代码如下
public class Configuration {protected boolean safeRowBoundsEnabled;protected boolean safeResultHandlerEnabled true;protected boolean mapUnderscoreToCamelCase;protected boolean aggressivelazyLoading;protected boolean multipleResultSetsEnabled true;protected boolean useGeneratedKeys;protected boolean useColumnLabel true;.......
}这些属性的值可以在MyBatis主配置文件中通过 setting 标签指定例如
settingssetting namecacheEnabled valuetrue/setting namelazyLoadingEnabled valuetrue/
/settings所有属性的作用及配置说明参考如下
cacheEnabled是否开启 Mapper 缓存即二级缓存默认 truelazyLoadingEnabled延迟加载的全局开关。当开启时所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态默认 falseaggressiveLazyLoading当开启时任何方法的调用都会加载该对象的所有属性。否则每个属性会按需加载默认 false3.4.1 之前默认为 truemultipleResultSetsEnabled是否允许单一语句返回多结果集默认 trueuseColumnLabel使用列标签代替列名不同的驱动在这方面会有不同的表现默认 trueuseGeneratedKeys允许 JDBC 支持自动生成主键需要驱动兼容。如果设置为 true则这个设置强制使用自动生成主键尽管一些驱动不能兼容但仍可正常工作默认 falseautoMappingBehavior指定 MyBatis 应该如何自动映射列到 Java 实体属性。NONE 表示取消自动映射PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。FULL 会自动映射任意复杂的结果集无论是否嵌套默认 PARTIALautoMappingUnknownColumnBehavior指定发现自动映射目标未知列或者未知属性的行为。NONE不做任何反应WARNING输出提醒日志FAILING映射失败抛出异常默认 NONEdefaultExecutorType配置默认的 Executor 类型SIMPLE 就是普通的 ExecutorREUSE 会复用 Statement 对象BATCH 会批量执行所有更新语句默认 SIMPLEdefaultStatementTimeout设置超时时间它决定驱动等待数据库响应的秒数可以说任意正整数默认为 null 未设置defaultFetchSize默认的 FetchSize用于设置 Statement 对象的 fetchSize 属性用于限制从数据库中获取数据的最大行数默认为 null 未设置SafeRowBoundsEnabled允许在嵌套语句中使用分页RowBounds如果允许使用则设置为 false默认 falsesafeResultHandlerEnabled允许在嵌套语句中使用分页ResultHandler如果允许使用则设置为 false默认 falsemapUnderscoreToCamelCase是否开启自动驼峰命名规则映射即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的映射localCacheScopeMyBatis 利用本地缓存机制防止循环引用和加速重复查询。默认值为 SESSION这种情况下会缓存个会话中执行的所有查询。若设置值为 STATEMENT本地会话仅用在语句执行上对相同 SqlSession 的不同调用将不会共享数据jdbcTypeForNuIl当没有为参数指定 JDBC 类型时指定 JDBC 类型的值为null。一些驱动需要指定 JDBC 类型多数情况下直接用一般类型即可比如 NULL、VARCHAR 或 OTHER默认 OTHERlazyLoadTriggerMethods指定哪个对象的方法会触发一次延迟加载参数是用逗号分割的方法列表defaultScriptingLanguage指定动态 SQL 生成的默认语言参数值为一个类型别名或完全限定类名默认值org.apache.ibatis.XMLLanguageDriverdefaultEnumTypeHandler指定 Java 枚举类型使用的默认 TypeHandler默认值org.apache.ibatis.type.EnumTypeHandlercallSettersOnNulls指定当结果集中的值为 null 的时候是否调用映射对象的Setter方法这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型int、boolean 等是不能设置成 null 的默认 falsereturnInstanceForEmptyRow当返回行的所有列都是空时MyBatis 默认返回null。当开启这个设置时MyBatis 会返回一个空实例。请注意也适用于嵌套的结果集collection、association默认 falselogPrefix指定 MyBatis 增加到日志名称的前缀默认未设置loglmpl指定MyBatis 所用日志的具体实现未指定时将自动查找可设置 SLF4J、LOG4J等默认未设置proxyFactory指定MyBatis 创建具有延迟加载能力的对象所用到的代理工具可选值有 JAVASSIST、CGLIB默认 JAVASSISTvfsImpl指定 VFS 的实现参数我 VFS 的实现类的全限定名以逗号分隔默认未设置
Configuration 除了提供上面的属性控制 MyBatis 的行为外还作为容器存放 TypeHandler类型处理器、TypeAlias类型别名、Mapper 接口及 MapperSQL 配置信息。这些信息在 MyBatis 框架启动时注册到 Configuration 组件中。Configuration 类通过下面的属性保存 TypeHandler、TypeAlias 等信息
protected final MapperRegistry mapperRegistry new MapperRegistry(this);
protected final InterceptorChain interceptorChain new InterceptorChain();
protected final TypeHandlerRegistry typeHandlerRegistry new TypeHandlerRegistry();
protected final TypeAliasRegistry typeAliasRegistry new TypeAliasRegistry();
protected final LanguageDriverRegistry languageRegistry new LanguageDriverRegistry();
protected final MapString, MappedStatement mappedStatements new StrictMapMappedStatement(Mapped Statements collection);
protected final MapString, Cache caches new StrictMapCache(Caches collection);
protected final MapString, ResultMap resultMaps new StrictMapResultMap(Result Maps collection);
protected final MapString, ParameterMap parameterMaps new StrictMapParameterMap(Parameter Maps collection);
protected final MapString, KeyGenerator keyGenerators new StrictMapKeyGenerator(Key Generators collection);
protected final SetString loadedResources new HashSetString();
protected final MapString, XNode sqlFragments new StrictMapXNode(XML fragments parsed from previous mappers);
protected final CollectionXMLStatementBuilder incompleteStatements new LinkedListXMLStatementBuilder();
protected final CollectionCacheRefResolver incompletecacheRefs new LinkedListCacheRefResolver()
protected final CollectionResultMapResolver incompleteResultMaps new LinkedListResultMapResolver();
protected final CollectionMethodResolver incompleteMethods new LinkedListMethodResolver();
protected final MapString, String cacheRefMap new HashMapString, String();这些属性的含义如下
mapperRegistry用于注册 Mapper 接口信息建立 Mapper 接口的 Class 对象和 MapperProxyFactory 对象之间的关系其中 MapperProxyFactory 对象用于创建 Mapper 动态代理对象interceptorChain用于注册 MyBatis 插件信息MyBatis 插件实际上就是一个拦截器typeHandlerRegistry用于注册所有的 TypeHandler并建立 Jdbc 类型、JDBC 类型与 TypeHandler 之间的对应关系typeAliasRegistry用于注册所有的类型别名languageRegistry用于注册 LanguageDriverLanguageDriver 用于解析 SQL 配置将配置信息转换为 SqlSource 对象mappedStatementsMappedStatement 对象描述 insert|selectlupdateldelete 等标签或者通过 Select|Delete|Update|Insert 等注解配置的 SQL 信息。MyBatis 将所有的 MappedStatement 对象注册到该属性中其中 Key 为 Mapper 的 Id Value 为 MappedStatement 对象caches用于注册 Mapper 中配置的所有缓存信息其中 Key 为 Cache 的 id也就是 Mapper 的命名空间Value 为 Cache 对象resultMaps用于注册 Mapper 配置文件中通过 标签配置的 ResultMap 信息ResultMap 用于建立 Java 实体属性与数据库字段之间的映射关系其中 Key 为 ResultMap 的 id该 id 是由 Mapper 命名空间和 标签的 id 属性组成的Value 为解析 标签后得到的 ResultMap 对象parameterMaps用于注册 Mapper 中通过 标签注册的参数映射信息。Key 为 ParameterMap 的 id由 Mapper 命名空间和 标签的 id 属性构成Value 为解析 标签后得到的 ParameterMap 对象keyGenerators用于注册 KeyGeneratorKeyGenerator 是 MyBatis 的主键生成器MyBatis 提供了三种KeyGenerator即 Jdbc3KeyGenerator(数据库自增主键、NoKeyGenerator无自增主键)、SelectKeyGenerator通过 select 语句查询自增主键例如 oracle 的 sequenceloadedResources用于注册所有 Mapper XML 配置文件路径sqlFragments用于注册 Mapper 中通过 标签配置的 SQL 片段Key 为 SQL 片段的 idValue 为 MyBatis 封装的表示 XML 节点的 XNode 对象incompleteStatements用于注册解析出现异常的 XMLStatementBuilder 对象incompleteCacheRefs用于注册解析出现异常的 CacheRefResolver 对象incompleteResultMaps用于注册解析出现异常的 ResultMapResolver 对象incompleteMethods用于注册解析出现异常的 MethodResolver 对象
MyBatis 框架启动时会对所有的配置信息进行解析然后将解析后的内容注册到 Configuration 对象的这些属性中。除此之外Configuration 组件还作为 Executor、StatementHandler、ResultSetHandler、ParameterHandler 组件的工厂类用于创建这些组件的实例。