从JDBD的封装方面重新认识Mybaits

前言:SQLSession是对JDBC的封装

MyBatis 是一个 Java 持久化框架,它通过对 JDBC 的封装来简化数据库访问操作。核心的 SQLSession 对象是 MyBatis 的核心组件之一,负责管理数据库连接、执行 SQL 语句以及映射查询结果等功能。

具体来说,MyBatis 通过以下几个关键组件来实现对 JDBC 的封装:

1. SQLSession:
   SQLSession 是 MyBatis 提供的与数据库交互的主要接口。通过 SQLSession,可以执行 SQL 语句、提交事务、获取映射器(Mapper)等。在底层,SQLSession 使用 JDBC 的 Connection 对象来访问数据库。

2. Configuration:
   Configuration 是 MyBatis 的核心配置对象,它负责读取和解析 MyBatis 的配置文件,并构建相应的 SQLSession 和映射器(Mapper)等对象。Configuration 对象存储了包括数据库连接信息、映射器配置、类型处理器配置等在内的各种配置信息。

3. Mapper 接口和映射文件:
   MyBatis 使用 Mapper 接口和 XML 映射文件来定义与数据库的操作。Mapper 接口定义了与数据库相关的方法,映射文件定义了 Mapper 接口方法与 SQL 语句之间的映射关系。通过配置和使用映射文件,MyBatis 可以将 SQL 语句的执行结果映射到 Java 对象,并提供方便的查询语句编写和参数传递方式。

4. 映射器(Mapper):
   映射器是 MyBatis 的一个重要概念,负责定义与数据库交互的方法。MyBatis 根据 Mapper 接口的定义,动态生成对应的代理对象,实现了访问数据库的逻辑,包括执行 SQL 语句、参数传递、结果映射等。

通过以上组件的协作,MyBatis 封装了 JDBC 的底层细节,提供了更便捷和灵活的方式进行数据库操作。使用 MyBatis,可以通过定义 Mapper 接口和映射文件,以面向对象的方式进行数据库访问,而无需编写繁琐的 JDBC 代码。

一:SQLSession和JDBC的对照说明

Mybatis是对JDBC的封装,将JDBC封装成了一个核心的SQLSession对象
JDBC当中的核心对象:Connection、Statement、ResultSet

二:三种Statement补充说明


Statement:普通的Statement
PeparedStatement:预编译Statement
CallableStatement:适用于存储过程Statement

三:Statement的作用


MyBatis当中的配置信息一共有两种:mybatis-config.xml和DaoMapper.xml。
其中mybatis-config.xml封装成了org.apache.ibatis.session.Configuration对象,DAOMapper.xml封装成了MapperdStatement部分数据是在Configuration当中进行保存的。
 

Configuration对象


Configuration是数据存储类对象,是将Mybatis当中的mybatis-config.xml封装成Configuration对象,Mapper.xml封装成了MappedStatement对象,当然MappedStatement这样表述不是特别完整。

一:mybatis-config.xml与Configuration属性的映射关系
1:标签environments
mybatis-config.xml中的environments 标签:

    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"></property>
                <property name="username" value="root"></property>
                <property name="password" value="123456"></property>
            </dataSource>
        </environment>
    </environments>


Configuration当中的对应属性:

public class Configuration {

protected Environment environment;

}

标签settings


mybatis-config.xml中的标签:

     <settings>
         -- 应用二级缓存的一个内容。
         <setting name="cacheEnabled" value="true"/>
     </settings>
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;
  -- 应用二级缓存的一个内容
  protected boolean cacheEnabled = true;
  protected boolean callSettersOnNulls;
  protected boolean useActualParamName = true;
  protected boolean returnInstanceForEmptyRow;

标签typeAliases


mybatis-config.xml中的s标签:

<typeAliases>
    <typeAlias type="com.baizhiedu.entity.User" alias="User"/>
    <typeAlias type="com.baizhiedu.entity.Account" alias="Account"/>
</typeAliases>

Configuration当中的:

  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();


标签Mappers


mybatis-config.xml中的s标签:

    <mappers>
        <!--<package name=""-->
        <mapper resource="UserDAOMapper.xml"/>
        <mapper resource="AccountDAOMapper.xml"/>
    </mappers>

Configuration当中的:

protected final Set<String> loadedResources = new HashSet<String>();



mapper.xml与Configuration属性的映射关系


Configuration当中的:

  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");


caches,parameterMaps,resultMaps,MapperdStatement,keyGenerators 这些是把Mapper.xml文件中的内容进行了封装。
resultMaps:所有的Mapper.xml文件中resultMap标签。
parameterMaps:是对sql标签上的parameterMap是属性做了处理。

上边这些属性都加了S都代表了是复数,也就是他的数量不只一个。这玩意存储的不是公共的,而是所有的。里边存储了对于所有的Mapper.xml文件中的这些属性都封装到这里边了。

这些不仅仅要存还要用,所以是将他们存入到了一个Map中,他是有key的,他的key就是namespace.id。所以你就发现这一组。这些对象封装到Configuration对象中之后都是采用的Map<String,xxx>这样的形式,key是namespace.id的形式。

MappedStatement对象

public final class MappedStatement {

  private String resource;
  private Configuration configuration;
  private String id;
  private Integer fetchSize;
  private Integer timeout;
  private StatementType statementType;
  private ResultSetType resultSetType;
  private SqlSource sqlSource;
  private Cache cache;
  private ParameterMap parameterMap;
  private List<ResultMap> resultMaps;
  private boolean flushCacheRequired;
  private boolean useCache;
  private boolean resultOrdered;
  private SqlCommandType sqlCommandType;
  private KeyGenerator keyGenerator;
  private String[] keyProperties;
  private String[] keyColumns;
  private boolean hasNestedResultMaps;
  private String databaseId;
  private Log statementLog;
  private LanguageDriver lang;
  private String[] resultSets;

  }

MappedStatement和Mapper.xml关系


MappedStatement对像,也是一个存储了对象,存储的是Mapper文件中的Statement也就是我们定义的SQL标签,其中封装的是我们Mapper文件中的一个个标签,举例来讲 其中一个标签就会被封装成MappedStatement对象

我们的标签当中肯定会有id的属性,在我们的MappedStatement当中也会有id的属性。id属性完全唯一,他存储的是namespace.id所以,也是唯一,注定了在一个Mybatis当中会有N个MapperStatement对象。

这里边的statementType是什么意思,指的就是普通,预编译,存储过程。默认使用的就是preparedStatement,所以在我们的SQL标签上也肯定有这个属性,这个属性默认一定是prepared

四:MappedStatement和Configuration对象关系


MappedStatement当中可以找到Configuration对象,Configurantion对象可以找到MapperdStatement对象,他俩互相引用,双向关联,可以互相找到。

尾声

什么时候创建Configuration什么时候创建MappedStatement,以及他与我们的SQLSessions(Mybatis核心功能)是怎么交互的呀?我们后续再讲,操作类对象我们下篇文章在进行分析。

操作类对象大致有一下几种:

Excutor
StatementHandler
ParameterHandler
ResultSetHandler
TypeHandler

这些对象是Configuration对象进行创建的。有了操作类对象之后,我们基于上述存储类对象,我们就可以对数据库进行相应的操作了。

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

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

相关文章

Windows11恢复组策略编辑器功能的方法

原因分析 日常工作学习中,对 Windows 计算机上的问题进行故障排除时,有些高级用户经常使用组策略编辑器轻松修复它。通过其分层结构,您可以快速调整应用于用户或计算机的设置。如果搜索结果中缺少组策略编辑器,则可能必须使用注册表编辑器作为疑难解答工具,这是一种更复杂…

nmap指纹识别要点以及又快又准之方法

nmap指纹识别要点以及又快又准之方法 一. 前言:二. nmap识别实验:一. 实验一:IP配置:空间配置:扫描结果:详细输出二. 实验二:IP配置:空间配置:扫描结果:详细输出三. 实验三:IP配置:空间配置:扫描结果:详细输出四. 实验四:IP

力扣:147. 对链表进行插入排序(Python3)

题目&#xff1a; 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c…

调试人脸识别项目解决方法的链接

1、failed call to cuInit: CUDA_ERROR_NO_DEVICE https://blog.csdn.net/JoyceYa/article/details/104379697/ 2、tensorflow.python.framework.errors_impl.InternalError: Blas SGEMM launch failed https://blog.csdn.net/See_Star/article/details/108762531 3、Attri…

Golang Web3钱包开发指南

简介 以太坊&#xff08;Ethereum&#xff09;是目前最受欢迎的区块链平台之一&#xff0c;它提供了智能合约功能和去中心化应用&#xff08;DApps&#xff09;的开发能力。在以太坊生态系统中&#xff0c;Web3钱包扮演着关键角色&#xff0c;允许用户管理账户和密钥、发送交易…

0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)

在《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》我们介绍了不会有重复数据的时间滚动窗口。本节我们将介绍存在重复计算数据的时间滑动窗口。 关于滑动窗口&#xff0c;可以先看下《0基础学习PyFlink——个数滑动窗口&#xff08;Sliding Count Windows&#x…

韩国ORANGE橘子室内高尔夫—万万没想到除了打球还能唱歌、看电影

韩国ORANGE橘子室内高尔夫—万万没想到除了打球还能唱歌、看电影&#xff01; 你知道吗&#xff1f;室内高尔夫除了打球&#xff0c;还可以唱歌 看电影&#xff01; 在这个让人兴奋的室内高尔夫场地&#xff0c;你将体验到全新的娱乐方式。快来和小伙伴们一起挥杆&#xff0c;…

springboot医院绩效考核系统源码

医院绩效考核系统是一种以人力资源管理为基础&#xff0c;选用适合医院组织机构属性的绩效理论和方法&#xff0c;基于医院战略目标&#xff0c;构建全方位的绩效考评体系&#xff0c;在科学、合理的绩效管理体系基础上&#xff0c;采用科学管理的方法&#xff0c;如平衡计分卡…

DNEAT: 一个全新的用于OD需求预测的动态节点-边注意力网络

文章信息 本周阅读的论文是一篇2020年发表在《Transportation Research Part C》上关于OD需求预测的文章&#xff0c;题目为《DNEAT: A novel dynamic node-edge attention network for origin-destination demand prediction》。 摘要 近年来&#xff0c;网约车服务平台在全球…

MCU HardFault_Handler调试方法

一.获取内核寄存器的值 1.在MDK的DEBUG模式下&#xff0c;当程序出现跑飞后&#xff0c;确定卡死在HardFault_Handler中断处 2. 通过Register窗口读取LR寄存器的值来确定当前系统使用堆栈是MSP还是PSP LR寄存器值堆栈寄存器0xFFFFFFF9MSP寄存器0xFFFFFFFDPSP寄存器 如下图所…

机器学习-特征工程

一、特征工程介绍 1.1 什么是特征 数值特征&#xff08;连续特征&#xff09;、文本特征&#xff08;离散特征&#xff09; 1.2 特征的种类 1.3 特征工程 特征是机器学习可疑直接使用的&#xff0c;模型和特征之间是一个循环过程&#xff1b; 实际上特征工程就是将原始数据…

程序员福利,免费好用的API汇总

全国快递物流地图轨迹查询&#xff1a;【H5物流轨迹、单号识别】通过物流单号和收寄件地址&#xff0c;自动评估物流时效&#xff0c;并在地图中展示包裹运输轨迹。包括顺丰、圆通、申通等主流快递公司。自动识别快递公司及单号&#xff0c;实时查询&#xff0c;稳定高效&#…

js的垃圾回收机制?

JavaScript 的垃圾回收机制是自动进行的&#xff0c;开发者不需要手动管理内存。垃圾回收机制的主要目标是找出不再使用的变量&#xff0c;并释放其占用的内存空间。在 JavaScript 中&#xff0c;当一个变量或对象不再被引用时&#xff0c;垃圾回收器会认为它不再需要&#xff…

Redsync 源码简单分析

Redsync 源码简单分析 加锁自动续期解锁 加锁 使用 setnx 进行加锁&#xff0c;没有实现分布式锁的可重入性。 func (m *Mutex) acquire(ctx context.Context, pool redis.Pool, value string) (bool, error) {conn, err : pool.Get(ctx)if err ! nil {return false, err}def…

在Photoshop中如何校正倾斜的图片

在Photoshop中如何校正倾斜的图片呢&#xff1f;今天就教大家如何操作。 将需要操作的图片拉到PS软件中&#xff0c;自动形成项目。 点击上方“滤镜”中的“镜头校正”。 进入“镜头校正”窗口&#xff0c;点击左侧的“拉直工具”。文章源自设计学徒自学网-http://www.sx1c.co…

Incremental Object Detection via Meta-Learning【论文解析】

Incremental Object Detection via Meta-Learning 摘要1 介绍2 相关工作3 方法3.1 问题描述3.2元学习梯度预处理3.3增量式目标检测器摘要 摘要:在真实世界的情境中,目标检测器可能会不断遇到来自新类别的物体实例。当现有的目标检测器应用于这种情景时,它们对旧类别的性能会…

java虚拟机参数

一、设置参数&#xff1a;java虚拟机可以使用JAVA_HOME/bin/java&#xff08;JAVA_HOME为jdk的安装目录&#xff09;。java进程命令行语法&#xff1a; java [options] class [args...] classpath path&#xff1a;指定Java虚拟机应该搜索类文件的路径。与javac编译器选项-cp相…

Docker(1)——安装Docker以及配置阿里云镜像加速

目录 一、简介 二、安装Docker 1. 访问Docker官网 2. 卸载旧版本Dokcer 3. 下载yum-utils&#xff08;yum工具包集合&#xff09; 4. 设置国内镜像仓库 5. 更新yum软件包索引 6. 安装Docker 7. 启动Docker 8. 卸载Docker 三、阿里云镜像加速 1. 访问阿里云官网 2. …

ElasticSearch快速入门实战

全文检索 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档&#xff0c;并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中&#xff0c;如搜索引擎、文档管理系统、电子…

Scan2BIM实战:从3D扫描到BIM模型生成

最近&#xff0c;我被问过很多次这个问题&#xff0c;所以我想我会尽力传达答案。 我应该指出&#xff0c;以下是概述&#xff0c;而不是非常详细的分步过程。 有很多因素会决定这项工作&#xff1b; 详细程度、扫描设备、点云配准软件和 CAD 软件等。 由于不知道你可能拥有或感…