MyBatis 3源码深度解析(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-13 16:07:50

点击下载

作者:江荣波

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

MyBatis 3源码深度解析

MyBatis 3源码深度解析试读:

前言

在写作本书时,SSM(Spring、Spring MVC和MyBatis)框架已经成为很多互联网公司的标配。笔者最早接触MyBatis框架是在2014年,当时接手的是一个非常成熟的网上银行系统,项目中使用的持久层框架就是MyBatis的前身—iBatis框架。后来换了两份工作,新的公司也都选择MyBatis作为持久层框架。从iBatis过渡到MyBatis框架几乎不需要任何学习成本,MyBatis延续了iBatis简单易用的特点,优化了SQL配置方式,引用OGNL表达式来支持动态SQL配置,使得动态SQL配置更加优雅,而且更容易理解。在笔者看来,MyBatis相对于iBatis框架最大的创新是引入了SQL Mapper的概念。我们可以将XML文件中的SQL配置与一个Java接口进行绑定,SQL配置的命名空间对应Java接口的完全限定名,而具体的每个SQL语句的配置对应Java接口中的一个方法,建立绑定后,可以通过调用Java接口中定义的方法来执行XML文件中配置的SQL语句。

MyBatis作为持久层框架,以其小巧轻便、SQL可配置、使用简单等特点深受广大Java开发者喜爱。然而大多数开发人员对MyBatis框架的理解仅局限于使用,并不理解框架底层的实现原理。作为一名开发人员,阅读开源框架的源码,可以学习源码中对设计模式及面向对象设计原则的应用,有助于提升自身编码能力。笔者在工作之余,深入研究了MyBatis框架的源码,本书将会从源码的角度分析MyBatis框架各个特性的实现原理。阅读准备

在阅读本书之前,读者需要准备如下开发环境:● JDK1.8或以上版本● Apache Maven构建工具● IntelliJ IDEA开发工具● Git版本控制工具内容概要

本书主要分为两篇:第1篇为MyBatis 3源码篇(第1~11章),主要介绍MyBatis框架各个特性的源码实现;第2篇章为MyBatis Spring源码篇(第12~13章),主要介绍MyBatis框架与Spring框架整合的原理及MyBatis Spring模块的实现细节。下面是本书的内容大纲。

第1章 搭建MyBatis源码环境

主要介绍如何搭建MyBatis源码调试环境,包括MyBatis框架源码获取途径、如何导入集成开发工具以及如何运行MyBatis源码中的测试用例。

第2章 JDBC规范详解

MyBatis框架是对JDBC轻量级的封装,熟练掌握JDBC规范有助于理解MyBatis框架实现原理。本章将详细介绍JDBC规范相关细节,已经全面掌握JDBC规范的读者可以跳过该章。

第3章 MyBatis常用工具类

介绍MyBatis框架中常用的工具类,避免读者因对这些工具类的使用不熟悉而导致对框架主流程理解的干扰,这些工具类包括MetaObject、ObjectFactory、ProxyFactory等。

第4章 MyBatis核心组件介绍

介绍MyBatis的核心组件,包括Configuration、SqlSession、Executor、MappedStatement等,包括这些组件的作用及MyBatis执行SQL语句的核心流程。

第5章 SqlSession的创建过程

主要介绍SqlSession组件的创建过程,包括MyBatis框架对XPath方式解析XML封装的工具类、MyBatis主配置文件解析生成Configuration对象的过程。

第6章 SqlSession执行Mapper过程

本章介绍Mapper接口注册的过程、SQL配置转换为MappedStatement对象并注册到Configuration对象的过程。除此之外,本章还将介绍SqlSession对象执行Mapper的过程。

第7章 MyBatis缓存

本章首先介绍MyBatis一级缓存和二级缓存的使用细节,接着介绍一级缓存和二级缓存的实现原理,最后介绍MyBatis如何整合Redis作为二级缓存。

第8章 MyBatis日志实现

基于Java语言的日志框架比较多,比较常用的有Logback、Log4j等,本章介绍Java的日志框架发展史,并介绍这些日志框架之间的关系,最后介绍MyBatis自动查找日志框架的实现原理。

第9章 动态SQL实现原理

本章主要介绍MyBatis动态SQL的使用、动态SQL配置转换为SqlSource对象的过程以及动态SQL的解析原理,最后从源码的角度分析动态SQL配置中#{}和${}参数占位符的区别。

第10章 MyBatis插件原理及应用

本章介绍MyBatis插件的实现原理,并以实际的案例介绍如何自定义MyBatis插件。在本章中将会实现两个MyBatis插件,分别为分页查询插件和慢SQL统计插件。

第11章 MyBatis级联映射与懒加载

本章介绍MyBatis中一对一、一对多级联映射和懒加载机制的使用细节,并介绍级联映射和懒加载的源码实现。

第12章 MyBatis与Spring整合案例

在介绍MyBatis框架与Spring整合原理之前,需要了解MyBatis整合Spring的基本配置,本章以一个用户注册RESTful接口案例作为MyBatis框架与Spring框架整合的最佳实践。

第13章 MyBatis Spring的实现原理

首先介绍Spring框架中的一些核心概念和Spring IoC容器的启动过程,接着介绍MyBatis和Spring整合后动态代理产生的Mapper对象是如何与Spring Ioc容器进行关联的,最后介绍MyBatis整合Spring事务管理的实现原理。随书源码

本书相关源码托管在Github上,读者可以从Github仓库获取随书源码。

源码地址:https://github.com/rongbo-j/mybatis-book。图书勘误

由于个人能力有限,书中可能有表述不到位或者对知识点理解欠妥的地方,欢迎读者批评指正。若有任何疑问,均可以在随书源码Github仓库上提交。

勘误地址:https://github.com/rongbo-j/mybatis-book/issues。致谢

本书从写作到完稿用了一年多时间,这个过程对于笔者来说是一个极大的考验。作为一名程序员,只有不断地提升,才会觉得充实。把大量的时间用在写作上,时常会因为没有摄入新知识而恐慌,感谢在本书写作过程中家人对我精神上的支持。另外,特别感谢夏毓彦老师和清华大学出版社的工作人员,有你们的帮助才有本书的顺利出版。著者2019年5月第1篇 MyBatis 3源码第1章 搭建MyBatis源码环境1.1 MyBatis 3简介

MyBatis源于Apache的一个开源项目iBatis。2002年,Clinton Begin开发了iBatis框架,并引入了SQL映射作为持久化层开发的一种方法,不久后Clinton Begin将iBatis捐献给Apache软件基金会。2010年,这个项目由Apache迁移到了Google Code,并改名为MyBatis。2013年11月,MyBatis迁移到目前最大的源代码托管平台Github。

MyBatis是一款在持久层使用的SQL映射框架,可以将SQL语句单独写在XML配置文件中,或者使用带有注解的Mapper映射类来完成数据库记录到Java实体的映射。与另一款主流的ORM框架Hibernate不同,MyBatis属于半自动的ORM框架,它虽然不能将不同数据库的影响隔离开,仍然需要自己编写SQL语句,但是可以灵活地控制SQL语句的构造,将SQL语句的编写和程序的运行分离开,使用更加便捷。

目前,Java实现的持久化框架比较多,名气相对较大的有Hibernate、Speedment、Spring Data JPA、ActiveJPA等。总结一下,MyBatis能够流行起来的主要原因有以下几点:(1)消除了大量的JDBC冗余代码,包括参数设置、结果集封装等。(2)SQL语句可控制,方便查询优化,使用更加灵活。(3)学习成本比较低,对于新用户能够快速学习使用。(4)提供了与主流IoC框架Spring的集成支持。(5)引入缓存机制,提供了与第三方缓存类库的集成支持。

MyBatis这些优秀的特性使它成为目前最受欢迎的ORM框架之一。读者在阅读本书时可能已经熟练掌握了MyBatis的基本使用,本书将从源码的角度介绍MyBatis框架的底层实现。1.2 环境准备

搭建MyBatis源码调试环境,我们首先需要安装JDK、Maven、Eclipse(或IntelliJ IDEA)、Git、MySQL(可选)等常用工具。需要注意的是,mybatis-spring源码中用到了Java8的新特性,例如Lambda表达式、Streams API等,所以JDK的版本必须是1.8以上。MyBatis源码使用Maven作为依赖管理和项目构建工具,我们需要安装Maven构建工具。另外,目前MyBatis源码托管在Github上,我们需要使用Git从远程仓库获取源码。最后,读者还需要安装一款自己比较熟悉的集成开发工具,例如Eclipse或者IntelliJ IDEA等。注意JDK1.8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html。Maven地址:http://maven.apache.org/download.cgi。Git下载地址:https://git-scm.com/。1.3 获取MyBatis源码

1.2节介绍了搭建MyBatis源码调试环境需要的工具,这些工具的安装比较简单,而且本书面向的读者为Java开发人员,相信大部分读者的机器上本身就具备这样的环境。如果缺少这些工具,读者可以自行安装。准备工作完成后,我们就可以获取MyBatis的源码了。MyBatis源码目前托管在Github上,源码地址为https://github.com/mybatis/mybatis-3。

MyBatis框架在Github上的仓库如图1-1所示,如果读者想为MyBatis项目贡献源码,可以注册Github账户,然后单击Fork按钮,在自己的仓库中创建MyBatis项目的副本,代码开发测试完毕后,向上游仓库提交Pull Request即可。当MyBatis源码维护者将我们提交的代码合并后,我们就可以成为MyBatis源码贡献者。关于Github的Fork+Pull Request工作流模式这里不做详细介绍,有兴趣的读者可以参考Github官方文档。

回归主题,我们的目的是获取MyBatis的源码,读者可以先单击图1-1中的Clone or download按钮再单击Download Zip按钮直接下载源码的压缩包。除了这种方式外,我们还可以使用Git客户端克隆一份代码到本地,具体操作如下:

打开Git Bash控制台,执行git clone命令:

上面的命令执行结束后,MyBatis源码项目就会克隆到本地。本书除了介绍MyBatis源码外,还会详细介绍MyBatis与Spring进行整合的原理,因此我们还需要获取mybatis-spring项目的源码,该项目同样托管在Github上,源码地址为https://github.com/mybatis/spring。图1-1 MyBatis源码Github仓库

我们同样可以使用git clone命令在本地克隆一份mybatis-spring项目源码,具体命令如下:

需要注意的是,MyBatis源码项目使用Maven作为项目构建工具,mybatis和mybatis-spring项目都依赖于一个公共的parent项目,该项目中没有任何代码,只是定义了一些公共的属性及项目依赖的插件信息,我们还需要把mybatis-parent项目(地址为https://github.com/mybatis/parent)克隆到本地。

我们依然使用git clone命令将mybatis-parent项目克隆到本地,具体如下:

3个项目全部克隆到本地后,需要放在同一个目录下。源码目录结构如下:

到此为止,我们获取了阅读本书所需要的MyBatis源码,一共3个项目,分别为mybatis源码项目、mybatis-spring项目以及这两个项目依赖的parent项目。1.4节介绍如何将这些源码导入集成开发工具中。1.4 导入MyBatis源码到IDE

MyBatis源码获取完毕后,为了便于对源码进行调试,我们需要将源码导入集成开发工具中。对于Java开发人员来说,目前主流的集成开发工具有Eclipse和IntelliJ IDEA。两者之间的优缺点本书不做比较,读者可根据个人偏好选择适合自己的开发工具。

接下来笔者以IntelliJ IDEA开发工具为例介绍如何将MyBatis源码导入IDEA中。

首先打开IntelliJ IDEA开发工具,单击File→New→Project菜单,如图1-2所示。图1-2 IntelliJ IDEA开发工具新建项目

单击Next按钮,进入下一步,输入项目名称和项目路径,如图1-3所示。然后单击Finish按钮完成空项目的创建。图1-3 IDEA新建项目对话框

到此为止,一个空项目已经创建完毕。接下来我们需要将MyBatis源码以模块(Module)的形式导入IntelliJ IDEA开发开发工具中,具体步骤如下:

单击File→New→Module from Existing Sources…菜单,在对话框中选择MyBatis源码所在的路径,然后单击OK按钮,如图1-4所示。图1-4 IDEA导入Module对话框

由于MyBatis源码项目使用Maven作为构建工具,因此我们需要在如图1-5所示的对话框中选择Maven选项。然后单击Next按钮,在后面的对话框中,我们可以保持默认的选项,一直单击Next按钮。最后单击Finish按钮即可完成MyBatis源码项目的导入。图1-5 导入MyBatis源码构建工具选项对话框

接下来,我们需要按照相同的方式把MyBatis的parent项目和mybatis-spring项目都导入IDEA开发工具中。

3个项目导入完成后,项目结构如图1-6所示,IDEA开发工具会自动获取Maven依赖。如果由于网络问题导致Maven依赖更新失败,就需要同时选中这3个项目,然后右击,选择Maven→Reimport菜单重新更新Maven依赖即可。图1-6 MyBatis源码导入IDEA后的项目结构

到此为止,我们的MyBatis源码调试环境已经搭建完毕。比较方便的是,MyBatis源码使用HSQLDB数据库的内存模式作为测试数据库,因此我们不需要额外安装数据库服务器。1.5 HSQLDB数据库简介

MyBatis源码项目中使用HSQLDB的内存模式作为单元测试数据库,本节我们就来简单了解HSQLDB数据库的使用。

HSQLDB是纯Java语言编写的关系型数据库管理系统,支持大部分 SQL-92、SQL:2008、SQL:2011规范。它提供了一个小型的同时支持内存和磁盘存储表结构的数据库引擎,支持Server模式和内存模式两种运行模式。

HSQLDB的Server模式是把HSQLDB作为一个单独的数据库服务运行,类似于我们常用的关系型数据库,例如Oracle、MySQL等。而内存模式则是把HSQLDB嵌入应用进程中,这种模式只能存储应用内部数据。由于HSQLDB能够很好地支持JDBC规范,因此我们可以使用它作为Java语言与关系型数据库交互的测试工具。

接下来以一个案例介绍HSQLDB内存模式的使用。HSQLDB内存模式的特点是数据库所有信息都存放在内存中,当HSQLDB进程结束时,数据也会随之丢失,因此这种模式只适合做单元测试。我们需要在HSQLDB进程启动后,额外执行建表语句和数据初始化语句。

为了便于测试,笔者准备了两个SQL脚本文件,分别为create-table.sql和init-data.sql,内容如下:

如上面的代码所示,SQL脚本创建了一张user表,并向user表中初始化了一些数据,SQL脚本完整内容可参考本书随书源码mybatis-common项目中对应的文件。HSQLDB数据库的使用案例可参考本书随书源码的mybatis-chapter01项目。

这里我们使用Maven来管理依赖,需要在项目的pom.xml文件中增加HSQLDB的依赖,配置如下:

引入HSQLDB数据库依赖后,就可以在程序中访问HSQLDB数据库了,具体数据库操作代码如下:

如上面的代码所示,笔者使用JUIT4作为单元测试工具。为了便于测试,上面的代码中使用MyBatis提供的ScriptRunner工具类执行create-table.sql和init-data.sql两个文件中的SQL脚本,进行数据初始化操作。

MyBatis源码中提供了一个SqlRunner工具类,我们可以使用该工具类完成数据库的增删改查操作。在上面的案例中,笔者调用SqlRunner的selectAll()方法进行数据查询,返回一个List对象。我们对List中的元素进行遍历,输入结果如下:

可以看到,HSQLDB中的数据全部被查询了出来。HSQLDB内存模式的使用非常简单,只需要将HSQLDB的相关Jar包添加到项目的classpath中,然后在程序中加载HSQLDB数据库驱动即可。HSQLDB数据库的使用就介绍这么多,有兴趣的读者可以参考HSQLDB的官方文档。

MyBatis源码中提供了大量的单元测试用例,都使用了HSQLDB的内存模式,我们不需要额外安装其他数据库就可以运行MyBatis源码中的测试用例。

如图1-7所示,读者可以打开MyBatis源码中的ScriptRunnerTest单元测试类,然后在shouldRunScriptsUsingConnection()方法中打上断点,右击,选择Debug菜单项就可以进行源码的调试。图1-7 运行MyBatis源码中的测试用例注意HSQLDB官方文档:http://hsqldb.org/doc/2.0/guide/index.html。SQL-92官方文档:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt。1.6 本章小结

本章对MyBatis做了简单的介绍,分析了MyBatis相对于其他ORM框架的优势以及MyBatis框架能够流行起来的原因。然后介绍了如何获取MyBatis的源码以及如何将MyBatis源码导入集成开发工具中。需要注意的是,mybatis和mybatis-spring项目都依赖于一个公共的parent项目,parent项目中统一管理这两个项目依赖的第三方工具包的版本及Maven插件。为了能够运行MyBatis源码中的测试用例,我们需要同时获取mybatis、mybatis-spring和mybatis-parent这3个项目的源码,然后将这3个项目导入集成开发工具中。

由于MyBatis源码中使用HSQLDB作为测试数据库,因此在第1.5节简单地介绍了HSQLDB内存模式的使用。在这个案例中,我们使用了MyBatis提供的两个工具类ScriptRunner和SqlRunner,分别用于批量执行数据库脚本和对数据库进行增删改查操作。ScriptRunner和SqlRunner类的使用及源码实现将会在后面的章节中详细介绍。第2章 JDBC规范详解

第1章中,我们获取到MyBatis的所有源码,并搭建好了MyBatis源码的调试环境。MyBatis框架对JDBC做了轻量级的封装,作为Java开发人员,我们对JDBC肯定不会陌生,但是要看懂MyBatis的源码,还需要熟练掌握JDBC API的使用。“磨刀不误砍柴工”,在开始学习MyBatis源码之前,我们有必要全面地了解JDBC规范的所有内容。

在写作本书时,JDBC规范的最新版本为4.2,所以本章我们就结合JDBC规范4.2版本的内容一起学习JDBC API的使用。如果读者已熟练掌握JDBC规范内容,可以跳过本章,从第3章开始阅读。注意JDBC 4.2规范文档:https://download.oracle.com/otndocs/jcp/jdbc-4_2-mrel2-spec/index.html。2.1 JDBC API简介

JDBC(Java Database Connectivity)是Java语言中提供的访问关系型数据的接口。在Java编写的应用中,使用JDBC API可以执行SQL语句、检索SQL执行结果以及将数据更改写回到底层数据源。JDBC API也可以用于分布式、异构的环境中与多个数据源交互。

JDBC API基于X/Open SQL CLI,是ODBC的基础。JDBC提供了一种自然的、易于使用的Java语言与数据库交互的接口。自1997年1月Java语言引入JDBC规范后,JDBC API被广泛接受,并且广大数据库厂商开始提供JDBC驱动的实现。

JDBC API为Java程序提供了访问一个或多个数据源的方法。在大多数情况下,数据源是关系型数据库,它的数据是通过SQL语句来访问的。当然,使用JDBC访问其他数据源(例如文件系统或者面向对象系统等)也是有可能的,只要该数据源提供JDBC规范驱动程序即可。

使用JDBC操作数据源大致需要以下几个步骤:(1)与数据源建立连接。(2)执行SQL语句。(3)检索SQL执行结果。(4)关闭连接。

后面的章节中会详细地介绍每个步骤以及需要使用到的JDBC接口和实现类。2.1.1 建立数据源连接

JDBC API中定义了Connection接口,用来表示与底层数据源的连接。JDBC应用程序可以使用以下两种方式获取Connection对象。(1)DriverManager:这是一个在JDBC 1.0规范中就已经存在、完全由JDBC API实现的驱动管理类。当应用程序第一次尝试通过URL连接数据源时,DriverManager会自动加载CLASSPATH下所有的JDBC驱动。DriverManager类提供了一系列重载的getConnection()方法,用来获取Connection对象,例如:(2)DataSource:这个接口是在JDBC 2.0规范可选包中引入的API。它比DriverManager更受欢迎,因为它提供了更多底层数据源相关的细节,而且对应用来说,不需要关注JDBC驱动的实现。一个DataSource对象的属性被设置后,它就代表一个特定的数据源。当DataSource实例的getConnection()方法被调用后,DataSource实例就会返回一个与数据源建立连接的Connection对象。在应用程序中修改DataSource对象的属性后,就可以通过DataSource对象获取指向不同数据源的Connection对象。同样,数据源的具体实现修改后,不需要修改应用程序代码。

需要注意的是,JDBC API中只提供了DataSource接口,没有提供DataSource的具体实现,DataSource具体的实现由JDBC驱动程序提供。另外,目前一些主流的数据库连接池(例如DBCP、C3P0、Druid等)也提供了DataSource接口的具体实现。

MyBatis框架中提供了DataSource接口的实现。下面是一个使用MyBatis的DataSource实例获取Connection对象的案例:

完整代码可参考随书源码mybatis-chapter02项目的com.blog4java.jdbc.Example02案例。

另外,MyBatis框架还提供了DataSource的工厂,即DataSourceFactory。我们可以使用工厂模式创建DataSource实例,例如:

完整代码可参考随书源码mybatis-chapter02项目的com.blog4java.jdbc.Example03案例。

JDBC API中定义了两个DataSource接口比较重要的扩展,用于支撑企业级应用。这两个接口分别为:● ConnectionPoolDataSource 支持缓存和复用Connection对象,这样能够在很大程度上提升应用性能和伸缩性。● XADataSource 该实例返回的Connection对象能够支持分布式事务。注意JDBC 4.0之前的版本,创建Connection对象之前,应用程序需要显式地加载驱动类,具体代码如下:2.1.2 执行SQL语句

通过2.1.1节的学习,我们了解到Connection是JDBC对数据源连接的抽象,一旦建立了连接,使用JDBC API的应用程序就可以对目标数据源执行查询和更新操作。JDBC API提供了访问SQL:2003规范中常用的实现特性,因为不同的JDBC厂商对这些特性的支持程度各不相同,所以JDBC API中提供了一个DatabaseMetadata接口,应用程序可以使用DatabaseMetadata的实例来确定目前使用的数据源是否支持某一特性。JDBC API中还定义了转意语法,让我们使用JDBC应用程序能够访问JDBC厂商提供的非标准的特性。

获取到JDBC中的Connection对象之后,我们可以通过Connection对象设置事务属性,并且可以通过Connection接口中提供的方法创建Statement、PreparedStatement或者CallableStatement对象。

Statement接口可以理解为JDBC API中提供的SQL语句的执行器,我们可以调用Statement接口中定义的executeQuery()方法执行查询操作,调用executeUpdate()方法执行更新操作,另外还可以调用executeBatch()方法执行批量处理。当我们不知道SQL语句的类型时,例如编写一个通用的方法,既可以执行查询语句,又可以执行更新语句,此时可以调用execute()方法进行统一的操作,然后通过execute()方法的返回值来判断SQL语句类型。最后可以通过Statement接口提供的getResultSet()方法来获取查询结果集,或者通过getUpdateCount()方法来获取更新操作影响的行数。

下面是一个通过Statement执行查询操作的案例:2.1.3 处理SQL执行结果

SQL语句执行完毕后,通常我们需要获取执行的结果,例如执行一条SELECT语句后,我们需要获取查询的结果,执行UPDATE或者INSERT语句后,我们需要通过影响的记录数来确定是否更新成功。JDBC API中提供了ResultSet接口,该接口的实现类封装SQL查询的结果,我们可以对ResultSet对象进行遍历,然后通过ResultSet提供的一系列getXXX()方法(例如getString)获取查询结果集。2.1.4 使用JDBC操作数据库

前面介绍了使用JDBC操作数据库的几个关键步骤,本节我们以一个具体的案例来介绍JDBC API的使用,案例代码如下:

完整代码读者可参考随书源码mybatis-chapter02项目的com.blog4java.jdbc.Example01类。如上面的代码所示,我们首先通过JDBC API中提供的DriverManager类获取一个表示数据库连接的Connection对象,然后调用Connection对象的createStatement()方法获取用于执行SQL语句的Statement对象。Statement对象是SQL语句的执行器,有了Statement对象后,我们就可以调用Statement对象的executeQuery()方法执行一个SQL查询操作了。该方法会返回一个ResultSet对象,ResultSet对象代表查询操作的结果集,我们可以调用ResultSet对象的getMetaData()方法获取结果集元数据信息。该方法返回一个ResultSetMetaData对象,我们可以通过ResultSetMetaData对象获取结果集中所有的字段名称、字段数量、字段数据类型等信息。在上面的案例代码中,我们通过ResultSetMetaData对象获取结果集所有字段名称,然后对结果集进行遍历,在控制台中打印所有查询结果。

运行上面的代码,会查询出user表中的所有记录并输出到控制台,控制台输出结果如下:

到此为止,我们使用JDBC API完成了一个完整的数据库查询功能。JDBC API的使用比较简单,遵循上面几个特定的步骤即可。2.2节我们继续学习JDBC API中的一些类和接口。2.2 JDBC API中的类与接口

通过前面几节的学习,我们了解了使用JDBC API操作数据源的步骤,并以一个案例介绍了如何使用JDBC API操作关系型数据库。JDBC API中的内容远不止这些,本节我们就来全面地学习JDBC API中的一些类和接口。JDBC API由java.sql和javax.sql两个包构成,接下来会分两个小节对这两个包的内容进行详细介绍。2.2.1 java.sql包详解

java.sql包中涵盖JDBC最核心的API,下面是java.sql包中的所有接口、枚举和类:

如上面的列表所示,java.sql包中的内容不多,大致可以分为数据类型接口、枚举类、驱动相关类和接口、异常类。

除这几部分外,剩下的就是作为Java开发人员需要掌握的API,主要包括下面几个接口:

这些接口都继承了java.sql.Wrapper接口。许多JDBC驱动程序提供超越传统JDBC的扩展,为了符合JDBC API规范,驱动厂商可能会在原始类型的基础上进行包装,Wrapper接口为使用JDBC的应用程序提供访问原始类型的功能,从而使用JDBC驱动中一些非标准的特性。

java.sql.Wrapper接口提供了两个方法,具体如下:

其中,unwrap()方法用于返回未经过包装的JDBC驱动原始类型实例,我们可以通过该实例调用JDBC驱动中提供的非标准的方法。

isWrapperFor()方法用于判断当前实例是否是JDBC驱动中某一类型的包装类型。

下面是unwrap()方法和isWrapperFor()方法的一个使用案例:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载