MyBatis 核心组件 —— Configuration

概述

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 组件的外观,目的是对外提供易于理解和使用的数据库操作接口
  • Executor:MyBatis 的 SQL 执行器,MyBatis 对数据库所有的增删改查操作都是由 Executor 组件完成的
  • StatementHandler:封装了对 JDBC Statement 对象的操作,比如为 Statement 对象设置参数,调用 Statement 接口提供的方法与数据库交互等等
  • ParameterHandler:当 MyBatis 框架使用的 Statement 类型为 CallableStatcment 和 PreparedStatement 时,ParamelerHandler 用于为 Statement 对象参数占位符设置值
  • ResultSetHandler:ResultSetHandler 封装了对 JDBC 的 ResultSet 对象操作,当执行 SQL 类型为 SELECT 语句时,ResultSetHandler 用于将查询结果转换成 Java 对象
  • TypeHandler:TypeHandler 是 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> 标签指定,例如:

<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/>
</settings>

所有属性的作用及配置说明参考如下:

  • cacheEnabled:是否开启 Mapper 缓存,即二级缓存,默认 true
  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态,默认 false
  • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载,默认 false,3.4.1 之前默认为 true
  • multipleResultSetsEnabled:是否允许单一语句返回多结果集,默认 true
  • useColumnLabel:使用列标签代替列名,不同的驱动在这方面会有不同的表现,默认 true
  • useGeneratedKeys:允许 JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容,但仍可正常工作,默认 false
  • autoMappingBehavior:指定 MyBatis 应该如何自动映射列到 Java 实体属性。NONE 表示取消自动映射,PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。FULL 会自动映射任意复杂的结果集(无论是否嵌套),默认 PARTIAL
  • autoMappingUnknownColumnBehavior:指定发现自动映射目标未知列(或者未知属性)的行为。NONE:不做任何反应,WARNING:输出提醒日志,FAILING:映射失败,抛出异常,默认 NONE
  • defaultExecutorType:配置默认的 Executor 类型,SIMPLE 就是普通的 Executor;REUSE 会复用 Statement 对象;BATCH 会批量执行所有更新语句,默认 SIMPLE
  • defaultStatementTimeout:设置超时时间,它决定驱动等待数据库响应的秒数,可以说任意正整数,默认为 null 未设置
  • defaultFetchSize:默认的 FetchSize,用于设置 Statement 对象的 fetchSize 属性,用于限制从数据库中获取数据的最大行数,默认为 null 未设置
  • SafeRowBoundsEnabled:允许在嵌套语句中使用分页(RowBounds),如果允许使用,则设置为 false,默认 false
  • safeResultHandlerEnabled:允许在嵌套语句中使用分页(ResultHandler),如果允许使用,则设置为 false,默认 false
  • mapUnderscoreToCamelCase:是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的映射
  • localCacheScope:MyBatis 利用本地缓存机制防止循环引用和加速重复查询。默认值为 SESSION,这种情况下会缓存个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据
  • jdbcTypeForNuIl:当没有为参数指定 JDBC 类型时,指定 JDBC 类型的值为null。一些驱动需要指定 JDBC 类型,多数情况下直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER,默认 OTHER
  • lazyLoadTriggerMethods:指定哪个对象的方法会触发一次延迟加载,参数是用逗号分割的方法列表
  • defaultScriptingLanguage:指定动态 SQL 生成的默认语言,参数值为一个类型别名或完全限定类名,默认值:org.apache.ibatis.XMLLanguageDriver
  • defaultEnumTypeHandler:指定 Java 枚举类型使用的默认 TypeHandler,默认值:org.apache.ibatis.type.EnumTypeHandler
  • callSettersOnNulls:指定当结果集中的值为 null 的时候是否调用映射对象的Setter方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean 等)是不能设置成 null 的,默认 false
  • returnInstanceForEmptyRow:当返回行的所有列都是空时,MyBatis 默认返回null。当开启这个设置时,MyBatis 会返回一个空实例。请注意,也适用于嵌套的结果集(collection、association),默认 false
  • logPrefix:指定 MyBatis 增加到日志名称的前缀,默认未设置
  • loglmpl:指定MyBatis 所用日志的具体实现,未指定时将自动查找,可设置 SLF4J、LOG4J等,默认未设置
  • proxyFactory:指定MyBatis 创建具有延迟加载能力的对象所用到的代理工具,可选值有 JAVASSIST、CGLIB,默认 JAVASSIST
  • vfsImpl:指定 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 Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");
protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection");
protected final Set<String> loadedResources = new HashSet<String>();
protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous mappers");
protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<XMLStatementBuilder>();
protected final Collection<CacheRefResolver> incompletecacheRefs = new LinkedList<CacheRefResolver>()
protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<ResultMapResolver>();
protected final Collection<MethodResolver> incompleteMethods = new LinkedList<MethodResolver>();
protected final Map<String, String> cacheRefMap = new HashMap<String, String>();

这些属性的含义如下:

  • mapperRegistry:用于注册 Mapper 接口信息,建立 Mapper 接口的 Class 对象和 MapperProxyFactory 对象之间的关系,其中 MapperProxyFactory 对象用于创建 Mapper 动态代理对象
  • interceptorChain:用于注册 MyBatis 插件信息,MyBatis 插件实际上就是一个拦截器
  • typeHandlerRegistry:用于注册所有的 TypeHandler,并建立 Jdbc 类型、JDBC 类型与 TypeHandler 之间的对应关系
  • typeAliasRegistry:用于注册所有的类型别名
  • languageRegistry:用于注册 LanguageDriver,LanguageDriver 用于解析 SQL 配置,将配置信息转换为 SqlSource 对象
  • mappedStatements:MappedStatement 对象描述 <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:用于注册 KeyGenerator,KeyGenerator 是 MyBatis 的主键生成器,MyBatis 提供了三种KeyGenerator,即 Jdbc3KeyGenerator(数据库自增主键)、NoKeyGenerator(无自增主键)、SelectKeyGenerator(通过 select 语句查询自增主键,例如 oracle 的 sequence)
  • loadedResources:用于注册所有 Mapper XML 配置文件路径
  • sqlFragments:用于注册 Mapper 中通过 标签配置的 SQL 片段,Key 为 SQL 片段的 id,Value 为 MyBatis 封装的表示 XML 节点的 XNode 对象
  • incompleteStatements:用于注册解析出现异常的 XMLStatementBuilder 对象
  • incompleteCacheRefs:用于注册解析出现异常的 CacheRefResolver 对象
  • incompleteResultMaps:用于注册解析出现异常的 ResultMapResolver 对象
  • incompleteMethods:用于注册解析出现异常的 MethodResolver 对象

MyBatis 框架启动时,会对所有的配置信息进行解析,然后将解析后的内容注册到 Configuration 对象的这些属性中。除此之外,Configuration 组件还作为 Executor、StatementHandler、ResultSetHandler、ParameterHandler 组件的工厂类,用于创建这些组件的实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精选算法题(4)——字符串比较

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 好久没做题目了&#xff0c;近期刷抖音碰到一个题目&#xff0c;乍一看不是很难&#xff0c;但是手生了&a…

HTTP——HTTP报文内的HTTP信息

HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回客户端的响应。本章就让我们来了解一下请求和响应是怎样运作的。 HTTP 一、HTTP报文二、请求报文及响应报文的结构三、编码提升传输速率1、报文主体和实体主题的差异2、压缩传输的内容编码3、分割发送的分块传输编…

HCIP——前期综合实验

前期综合实验 一、实验拓扑二、实验要求三、实验思路四、实验步骤1、配置接口IP地址2、交换机配置划分vlan10以及vlan203、总部分部&#xff0c;骨干网配置OSPF分部总部骨干网 4、配置BGP建立邻居关系总部骨干网分部 5、发布用户网段6、将下一跳改为本地7、允许AS重复8、重发布…

【Linux】 UDP网络套接字编程

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统网络编程 文章目录 一、网络通信的本质&#xff08;port标识的进程间通信&#xff09;二、传输层协议UDP/TCP认识传输层协议UDP/TCP网络字节序问题&#xff08;规定大端&#xff09; 三、socket编…

前端面试题-react

1 React 中 keys 的作⽤是什么&#xff1f; Keys 是 React ⽤于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识在开发过程中&#xff0c;我们需要保证某个元素的 key 在其同级元素中具有唯⼀性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建…

第十三章 利用PCA简化数据

文章目录 第十三章 利用PCA简化数据13.1降维技术13.2PCA13.2.1移动坐标轴 13.2.2在NumPy中实现PCA13.3利用PCA对半导体制造数据降维 第十三章 利用PCA简化数据 PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种常用的降维技术&#xff0…

剑指offer41.数据流中的中位数

我一开始的想法是既然要找中位数&#xff0c;那肯定要排序&#xff0c;而且这个数据结构肯定要能动态的添加数据的&#xff0c;肯定不能用数组&#xff0c;于是我想到了用优先队列&#xff0c;它自己会排序都不用我写&#xff0c;所以addNum方法直接调用就可以&#xff0c;但是…

MAC电脑设置charles,连接手机的步骤说明(个人实际操作)

目录 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 2. 设置 Proxy-Proxy Settings 3. 设置 SSL Proxying 二、手机的设置 1. 安卓 2. ios 资料获取方法 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 Help-SSL Proxying-Inst…

sql group by 加条件

在SQL中&#xff0c;可以在GROUP BY子句中加入条件&#xff0c;以进一步过滤结果。你可以使用HAVING子句来添加条件。HAVING子句的使用方式类似于WHERE子句&#xff0c;但不同的是&#xff0c;它用于对GROUP BY子句生成的分组进行过滤。 以下是一个示例&#xff0c;演示如何在…

优化基于tcp,socket的ftp文件传输程序

原始程序&#xff1a; template_ftp_server_old.py&#xff1a; import socket import json import struct import os import time import pymysql.cursorssoc socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST 192.168.31.111 PORT 4101 soc.bind((HOST,PORT)) p…

是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...

华为是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在华为做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有9.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾讯…

Centos/Ubuntu 替换yum/apt源?

yum/apt源如果不满足要求, 可以考虑将源替换为阿里云的源。 1.CentOS更换阿里云yum源 1. 备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base-bak.repo 2. 下载 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Cent…

iphone卡在恢复模式怎么办?修复办法分享!

iPhone 卡在恢复屏幕问题是 iPhone 用户在软件更新或恢复期间的常见问题。如果你也遇到此问题&#xff0c;不要着急&#xff0c;接下来我们将探讨 iPhone 卡在恢复屏幕上的主要原因&#xff0c;以及如何轻松修复它。 iPhone卡在恢复屏幕问题上没有一个特别的原因&#xff0c;但…

数字资产管理是做什么的?

显然&#xff0c;单纯依靠人力来管理和盘点固定资产已经不能满足公司日益增长的需求。合理使用固定资产管理系统来帮助管理实物资产已经成为一种趋势。  有鉴于此&#xff0c;依靠信息技术的支持&#xff0c;选择RFID固定资产管理系统可以有效解决资产管理盘点等难题&#xf…

Maven右侧依赖Dependencies消失

项目右侧的Maven依赖Dependencies突然消失&#xff0c;项目中的注解都出现报错&#xff0c;出现这种情况应该是因为IDEA版本早于maven版本&#xff0c;重新检查项目中的Maven路径&#xff0c;选择File->Settings->搜索Maven&#xff0c;检查Maven home directory&#xf…

可以写进简历的kafka优化-----吞吐量提升一倍的方法

冲突 在看到项目工程里kafka 生产端配置的batch.size为500&#xff0c;而实际业务数据平均有1K大小的时候&#xff1b;我有点懵了。是的&#xff0c;这里矛盾了&#xff1b;莫非之前的作者认为这个batch.size是发送的条数&#xff0c;而不是kafka生产端内存缓存记录的大小&…

GDAL C++ API 学习之路 (7) Dataset篇 代码示例 翻译 自学

CreateLayer virtual OGRLayer *CreateLayer(const char *pszName, OGRSpatialReference *poSpatialRef nullptr, OGRwkbGeometryType eGType wkbUnknown, char **papszOptions nullptr) 此方法尝试在数据集上创建一个具有指定名称、坐标系、几何类型的新图层 参数: pszN…

HackSudo2靶机 通关详解

环境配置 发现vmWare的kali扫不到virtualbox的靶机 网上找了挺久资料都没解决 索性全桥接上物理机了 信息收集 漏洞发现 扫个目录 都看了一眼 没什么有用的 然后回到file.php 感觉之前做过类似的靶场,猜测存在文件包含 随便传个file试试 确实有 考虑日志文件包含 之前看…

hbase优化:客户端、服务端、hdfs

hbase优化 一.读优化 1.客户端&#xff1a; scan。cache 设置是否合理&#xff1a;大scan场景下将scan缓存从100增大到500或者1000&#xff0c;用以减少RPC次数使用批量get进行读取请求离线批量读取请求设置禁用缓存&#xff0c;scan.setBlockCache(false)以指定列族或者列进行…

Spring Framework 提供缓存管理器Caffeine

说明 Spring Framework 提供了一个名为 Caffeine 的缓存管理器。Caffeine 是一个基于 Java 的高性能缓存库&#xff0c;被广泛用于处理大规模缓存数据。 使用 Caffeine 缓存管理器&#xff0c;可以轻松地在 Spring 应用程序中添加缓存功能。它提供了以下主要特性&#xff1a;…