详解Java中与数据库相关的包和类
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/59/ )。
很多时候,用Java编写的程序都需要和数据库打交道,这需要我们对Java中与数据库相关的包和类比较了解。
当然,目前很多ORM框架,例如MyBatis等,都会对数据库操作进行进一步的封装,但即使这样,在异常发生时,也会打印出和这些类相关的提示信息。因此无论何种使用场景,了解这些包和类都是十分必要的。本文也主要参考了《通用源码阅读指导书——MyBatis源码详解》一书,这是一本以MyBatis的源码为实例讲述源码阅读方法的书籍,并且附带有示例项目源码,MyBatis的全中文注解。
接下来,我们开始介绍,将先介绍Java提供的两个数据库操作包,然后介绍几个主要的类。
1 java.sql
包和javax.sql
包
Java提供的与数据库操作相关的包主要有两个,它们是java.sql
包和javax.sql
包。
java.sql
和javax.sql
共同为JAVA提供了强大的JDBC能力。我们接下来会介绍几个MyBatis中常接触到的类,它们都由java.sql
或javax.sql
提供。
1.1 java.sql
包
java.sql
通常被称为JDBC核心API包,它为Java提供了访问数据源中数据的基础功能。基于该包能实现将SQL语句传递给数据库、从数据库中以表格的形式读写数据等功能。
java.sql
提供了一个Driver
接口作为数据库驱动的接口。如下图所示。
不同种类的数据库厂商只需要根据自身数据库特点开发相应的Driver
实现类,并通过DriverManager
进行注册即可。这样,基于JDBC便可以连接不同公司不同种类的数据库。
除此之外,java.sql
还为数据库连接、SQL语句、结果集等提供了众多的类,例如表示数据库连接的Connection类、表示数据库操作语句的Statement类、表示数据库操作结果的ResultSet类等。
基于java.sql
包,Java程序能够完成各种数据库操作。通常完成一次数据库操作的流程如下所示:
- 建立DriverManager对象。
- 从DriverManager对象中获取Connection对象。
- 从Connection对象中获取Statement对象。
- 将SQL语句交给Statement对象执行,并获取返回的结果,结果通常放在ResultSet中。
1.2 javax.sql
包
javax.sql
通常被称为JDBC扩展API包,它扩展了JDBC核心API包的功能,提供了对服务器端的支持,是Java企业版的重要部分。
例如,javax.sql
提供了DataSource
接口,通过它可以获取面向数据源的Connection,与java.sql
中直接使用DriverManager
建立连接的方式相比更为灵活(实际上,DataSource
接口的实现中也是通过DriverManager对象获取的Connection对象)。除此之外,javax.sql
还提供了连接池、语句池、分布式事务等方面的诸多特性。
使用了javax.sql
包扩展了java.sql
包之后,建议使用DataSource
来获取Connection,而不是直接使用DriverManager。于是,一条SQL语句的执行过程如下:
- 建立DataSource对象。
- 从DataSource对象中获取Connection对象。
- 从Connection对象中获取Statement对象。
- 将SQL语句交给Statement对象执行,并获取返回的结果,结果通常放在ResultSet中。
2 DriverManager
DriverManager接口位于java.sql,它是JDBC驱动程序管理器,可以管理一组JDBC驱动程序。
DriverManager有一个重要的功能是能够给出一个面向数据库的连接对象Connection对象,该功能是由DriverManager中的getConnection
方法提供的。
当调用getConnection方法时,DriverManager会尝试已经加载的驱动程序中找出合适的一个,并用找出的驱动程序建立一个面向指定数据库的连接,最后将建立的连接返回。
DriverManager中主要有下面几个方法。这些方法都是静态方法,不需要建立DriverManager对象便可以直接调用。
- void registerDriver: 向DriverManager中注册给定的驱动程序。
- void deregisterDriver: 从DriverManager中删除给定的驱动程序。
- Driver getDriver: 查找能匹配给定URL路径的驱动程序。
- Enumeration
getDrivers:获取当前调用者可以访问的所有已加载的JDBC驱动程序。 - Connection getConnection:建立到给定数据库的连接。
3 DataSource
DataSource是javax.sql
的一个接口。故名思议,它代表了一个实际的数据源,它的功能是作为工厂提供数据库连接。
DataSource接口中只有两个接口方法,都用来获取一个Connection对象:
- getConnection():从当前的数据源中建立一个连接。
- getConnection(String, String):从当前的数据源中建立一个连接,输入的参数为数据源的用户名和密码。
javax.sql
中的DataSource仅仅是一个接口,不同的数据库可以为其提供多种实现。常见的实现有以下几种:
- 基本实现:生成基本的到数据库的连接对象Connection。
- 连接池实现:生成的Connection对象能够自动加入到连接池中。
- 分布式事务实现:生成的Connection对象能够参与分布式事务。
正因为DataSource接口可以有多种实现,与直接使用DriverManager获得连接对象Connection的方式相比更为灵活。在日常的开发过程中,建议采取使用DataSource来获取数据库连接。
而实际上在DataSource的具体实现中,最终也是基于DriverManager获得的Connection,因此DataSource只是DriverManager的进一步封装。
4 Connection
Connection接口位于java.sql
中,它代表对某个数据库的连接。基于这个连接,可以完成SQL语句的执行和结果的获取等工作。
Connection中常用的方法如下:
- Statement createStatement:创建一个Statement对象,通过它能将SQL语句发送到数据库。
- CallableStatement prepareCall:创建一个CallableStatement对象,通过它能调用存储过程。
- PreparedStatement prepareStatement:创建一个PreparedStatement对象,通过它能将参数化的SQL语句发送到数据库。
- String nativeSQL:将输入的SQL语句转换成本地可用的SQL语句。
- void commit:提交当前事务。
- void rollback:回滚当前事务。
- void close:关闭当前的Connection对象。
- boolean isClosed:查询当前Connection对象是否关闭。
- boolean isValid:查询当前Connection是否有效。
- void setAutoCommit:根据输入参数设定当前Connection对象的自动提交模式。
- int getTransactionIsolation:获取当前Connection对象的事务隔离级别。
- void setTransactionIsolation:设定当前Connection对象的事务隔离级别。
- DatabaseMetaData getMetaData:获取当前Connection对象锁连接的数据库的所有元数据信息。
上述方法主要是用来完成获取Statement对象、设置Connection属性等功能。
同时,Connection中存在事务管理的方法,如commit
、rollback
等。通过调用这些事务管理方法可以控制数据库完成相应的事务操作。
5 Statement
Statement接口位于java.sql
中,该接口中定义的一些抽象方法能用来执行静态SQL语句并返回结果。通常Statement对象会返回一个结果集对象ResultSet。
Statement接口中的主要方法有:
- void addBatch:将给定的SQL命令批量添加到Statement对象的SQL命令列表中。
- void clearBatch:清空Statement对象的SQL命令列表。
- int[] executeBatch:交给数据库批量执行一批命令。如果执行成功,返回影响数据数数组。
- boolean execute:执行一条SQL语句。
- ResultSet executeQuery:执行一条SQL语句,并返回结果集ResultSet对象。
- int executeUpdate:执行给定SQL语句,该语句可能为INSERT、UPDATE、DELETE语句或者DDL语句等。
- ResultSet getResultSet:获取当前结果集ResultSet对象。
- ResultSet getGeneratedKeys: 获取当前操作自增生成的主键。
- boolean isClosed:获取是否已关闭了此Statement对象。
- void close:关闭Statement对象,释放相关的资源。
- Connection getConnection:获取生成此Statement对象的Connection对象。
上述方法主要是用来完成执行SQL语句、获取SQL语句执行结果等功能。
6 总结
到这里,我们已经对Java中与数据库相关的包和类进行了介绍,并介绍了Java程序与数据库建立连接的流程。MyBatis作为一个出色的ORM框架,基于以上包和类封装了相关的数据库操作流程,并在此基础上完成记录和对象的转换等操作。要想了解以上包和类的使用,大家可以参考《通用源码阅读指导书——MyBatis源码详解》。
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。