本文共 2302 字,大约阅读时间需要 7 分钟。
由发表在
相对于数据库而言,Web应用是数据库的客户端,我们需要为客户端与数据库之间建立连接,双方才能交互。
我们已经学习了SQL,这是操纵数据库的语言。我们现在开发Web应用使用的语言,那怎么让Web应用于数据库进行交互呢?这就需要使用JDBC了。
JDBC是Java Database Connectivity的缩写,是标准的Java API,是一套客户端程序与数据库交互的规范。JDBC提供了一套通过操纵数据库的完整接口。
JDBC API的实现,是由JDBC驱动程序实现的,不同的数据库对应有不同的驱动程序。需要使用某个具体的JDBC驱动,我们需要将其对应的Jar包引入到项目中。
当我们调用JDBC API时,JDBC将我们的请求交给JDBC驱动,最终由驱动完成与数据库的交互。此外,而数据库驱动会帮助我们打开数据库连接,关闭数据库连接,以及控制事务。
JDBC目标是做到“一次编写,到处运行”,当你使用JDBC API 访问数据库后,无论是更换数据库还是更换操作系统,都不需要修改代码。所以使用JDBC,我们可以使用相同的API访问不同的数据库服务(比如MySQL和Oracle等),这样就编写不依赖于具体数据库的程序。更高层的数据访问框架也是以JDBC为基础构建的。
在博客应用中,一次Web请求一般对应于一次对博客数据的增删改查,每一次建立数据库连接才能完成。创建数据库连接是一件耗时的事情,而且占用系统资源。对于访问量比较大的应用,频繁打开喝关闭数据库连接就会严重影响性能。而且数据库连接的数量如果不控制起来,系统资源可能无限制地被占用,最终可能导致内存泄漏,服务器崩溃。
为了解决这个问题,我们一般采用数据库连接池技术。其基本思想就是为数据库连接建立一个缓冲池,预先放入一定数量的连接,当需要使用时直接从缓冲池中取出即可使用,使用完了重新放回缓冲池。我们还可以通过设定连接池最大连接数来防止超过系统负载的数据库连接数量,这样能极大地提高系统的性能和稳定性。
现在已经有很多数据库连接池的实现,常用的有和。后面的内容中我们将会用到commons-dbcp,现在我们只需要了解其原理就行。
JDBC API提供了以下接与和类:
DriverManager
: 该类用来管理数据库驱动程序,当需要建立一个连接时,DriverManager将使用第一个满足要求的Driver来建立连接。
Driver
: 该接口负责处理所有与数据库的交互。
Connection
: 该接口表示一次数据库连接。所有的数据库操作都是在一次数据库连接中进行的,连接关闭后,将不能再进行数据库操作。
Statement
: 我们可以通过该接口执行SQL语句,并得到返回结果。
ResultSet
: 通过Statement
执行查询语句后,我们将得到类型为ResultSet
的返回结果。该结果是一个迭代器,存储了所有查询返回的数据。
SQLException
: 这个类处理的数据库应用程序中发生的任何错误。
基于JDBC API进行数据库访问,可以分解为以下三个步骤:
这些类的描述看起来很枯燥,我们按照这三个步骤,通过典型的JDBC数据库访问代码来进一步理解这些类。
Connection con = null;Statement stmt =null;try { // 1、加载MYSQL驱动,这是`Driver`的实现,MySQL的JDBC驱动类是com.mysql.jdbc.Driver Class.forName("com.mysql.jdbc.Driver").newInstance(); // 2、连接到MYSQL,通过`DriverManger`来操作`Driver`,获取数据库连接 con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tianmayingblog", "root", ""); // 3、创建用以执行SQL语言的声明 Statement stmt = con.createStatement(); // 4、执行SQL,获取结果 ResultSet rs = stmt.executeQuery("select * from `user`"); // 5、遍历并解析结果 while (rs.next()) { long id = rs.getLong("id"); // ... }} catch (Exception e) { // 如果有异常,进行异常处理 System.out.print("MYSQL ERROR:" + e.getMessage());} finally { // 6、关闭连接与声明 try { if (stmt != null) { stmt.close(); } if (con != null) { con.close(); } } catch (SQLException ignored) { }}
以上代码注释中的6个步骤就是一个相对完整的访问过程,在接下来的开发实例中我们会进一步深入理解。