JDBC
JDBC连接数据库的开发流程
使用JDBC连接数据库的开发流程的关键步骤如下。
(1)注册数据库驱动连接数据库前需要将数据库厂商提供的数据库驱动类注册到JDBC的驱动管理器中,通常情况下是将数据库驱动类的加载到JVM(Java Virtral Machine, Java虚拟机)。
(2)构建数据库连接URL建立数据库连接要构建数据库连接的URL,这个URL由数据库厂商制定。不同数据库的URL不同,但基本格式均为“JDBC协议+IP地址或域名+端口+数据库名称”。
(3)获取Connection对象在注册数据库驱动及构建数据库URL后,即可通过驱动管理器获取数据库的Connection对象,该对象是JDBC封装的数据库连接对象。有创建此对象后,才可以对数据执行相关操作,其获取方法如下:
1 | DriverManager.getConnection(url,username,password); |
获取Connection对象需要使用DriverManager对象,该对象的getConnection()方法通过数据库连接URL、数据库用户名及数据库密码创建Connection对象。
1 | package Test; |
JDBC核心API
JDBC核心API主要包括5个接口,即代表数据库连接的Connection接口、驱动程序管理类DriverManager、执行SQL语句的Statement接口、预编译SQL语句的PreparedStatement接口和结果集ResultSet接口。
驱动程序管理器DriverManager
DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层。作用于用户和驱动程序之间,负责跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接;另外,DriverManager类也处理诸如驱动程序登录时间限制,以及显登录和跟踪消息等。成功加载Driver类并在DriverManager类中注册后,DriverManager类即可用来建立数据库连接。
当调用DriverManager类的getConnection()方法请求建立数据库连接时,该类将试图定位一个适当的Driver类,并检查定位到的Driver类是否可以建立连接。如果可以,则建立连接并返回;否则抛出SQLException异常。
DriverManager类提供的常用方法如表1所示。
代表数据库连接的Connection接口
Connection接口用于创建数据库的连接(会话),只有获得该连接对象后才能访问数据库,并操作数据表。Connection接口的常用方法如表2所示。
表中列出是Connection接口的常用方法,如果要了解其他方法,请参考Java API或相关资料。
Connection接口创建与数据库连接的目的是与数据库通信,为此需要执行SQL语句。但是通过Connection实例并不能执行SQL语句,还需要通过Connection实例创建Statement实例。
执行SQL语句的Statement接口
Statement接口用于执行静态的SQL语句,并返回一个生成结果的对象,该接口的对象通过Connection实例的createStatement()方法获得。利用该对象把静态SQL语句发送到数据库编译执行,然后返回数据库的处理结果。该接口的常用方法如表3所示。
预编译执行SQL语句的PreparedStatement接口
Statement接口封装了JDBC执行SQL语句的方法,可以完成Java程序执行SQL语句的操作。在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件等,使用Statement接口操作这些SQL语句会过于烦琐,而且存在安全方面的缺陷。针对这一问题,JDBC API中提供了扩展的PreparedStatement接口。
PreparedStatement接口继承于Statement接口,拥有其中的方法。PreparedStatement对象保存并执行的SQL语句是预编译的,可以使用此对象高效地多次执行SQL语句。而且该接口扩展了带有参数SQL语句的执行操作,应用于该接口中的SQL语句可以使用占位符“? ”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。该接口的常用方法如表4所示。
注意在通过setXXX()方法为SQL语句中的参数赋值时,必须通过与输入参数的已定义SQL类型兼容的方法,也可以通过setObject()方法设置多种类型的输入参数。
结果集ResultSet接口
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集与数据库表字段相对应。即由行和列组成,并且在ResultSet结果集的行上提供指针。最初指针指向结果集的第1行之前,调用next()方法可将指针移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next()方法作为while循环的条件来迭代ResultSet结果集。
ResultSet接口的常用方法如表5所示。
ResultSet对象的get
及时关闭连接
每次操纵数据库结束后都要及时关闭数据库连接,释放连接占用的数据库和JDBC资源,以免影响系统的运行速度。
ResultSet、Statement和Connection接口均提供了关闭各自实例的close()方法释放各自占用的数据库和JDBC资源。建议在每次操纵数据库结束后依次关闭ResultSet、Statement和Connection实例,虽然直接关闭Statement实例也会关闭相关的ResultSet实例,并且JVM的垃圾回收机制会定时清理缓存并关闭长时间不用的数据库连接。但是如果不及时关闭,数据库连接达到一定数量,将严重影响数据库和计算机的运行速度,甚至瘫痪。
操作数据库
如果想要进行数据库的维护操作,则可使用Statement接口,数据库维护主要是进行增加、修改和删除等操作。
更新数据表
增加操作要编写增加的SQL语句:INSERT。因为涉及到了序列的概念,所以在使用的时候需要编写SQL语句进行增加操作,在SQL语句中直接写上序列的nextVal即可。形式为:序列名.nextVal。
1 | package Test; |
查询数据表
在Oracle中,可以通过SELECT语句查询数据库中的内容。在Oracle中直接查询的时候,可以看到Oracle能够将全部的查询结果返回给用户。而对于程序的操作中也是一样,所有的查询结果要返回到程序处输出查看,那么程序就可以通过ResultSet接口保存全部的查询结果,通过Statement接口中的executeQuery()方法查询。
查询之后的数据需要分别取出。通过next()方法找到返回的每一行数据,每一行中各个列的数据需要通过以下方法取得。
例如取得整型:
1 | getInt() |
取得字符串:
1 | getString() |
取得日期:
1 | getDate() |
取得浮点数:
1 | getFloat() |
1 | package Test; |
删除数据表
数据的增加、更新、删除等都是通过SQL语句完成的,所以在修改数据的时候,只需要更改该程序下的SQL语句即可实现目的。使用DELETE语句可以进行删除数据的操作。
删除数据的时候一般都是按照id删除。
1 | package Test; |
批处理
批处理(Batch)也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。
在批处理中,多条SQL语句可以一次性执行完毕,称为批处理操作。
批处理是在JDBC 2.0之后提出的概念,但是在JDBC 2.0之中还有很多其他的内容,包括可滚动的结果集,并使用结果集更新数据等,但是这些操作基本上都不使用。
首先在Statement接口上定义一个addBatch()方法,此方法可用于加入批处理,之后使用executeBatch()方法进行批处理的操作。
1 | package Test; |
JDBC在Java Web中的应用
在Java Web开发中JDBC的应用十分广泛,通常情况下Web程序操作数据库均通过JDBC实现。即使目前数据库方面的开源框架层出不穷,但其底层实现也离开不JDBC API。
开发模式
在Java Web开发使用JDBC应遵循MVC(Model-View-Controller)的设计思想,使Web程序拥有一定的健壮性和可扩展性。
MVC是一种程序设计理念,它将软件分成3层结构,即模型层、视图层与控制层。其中模型层泛指程序之中的业务逻辑,用于处理真正的业务操作;视图层指程序与用户相交互的界面,对用户呈现出的视图,但不包含业务逻辑;控制层分发处理用户各种请求,将指定的请求分配给指定的业务逻辑进行处理。
Java Web中的MVC如图所示。
客户端通过JSP页面与程序交互,对于数据的增加、删除、修改及查询请求由Servlet分发处理。如Servlet接收到添加数据请求,就会分发给添加数据的JavaBean对象,而数据库操作通过JDBC封装的JavaBean实现。
分页查询
分页查询是Java Web开发之中十分常用的技术,在数据库量非常大的情况下不适合将所有数据显示在一个页面中。这样既为查看带来不便,又占用了程序及数据库的资源,为此需要分页查询。
通过JDBC实现分页查询的方法有多种,而且不同的数据库机制也提供了不同的分页方式,两种典型的分页方法如下。
(1)通过ResultSet光标分页
ResultSet对象是JDBC API中封装的查询结果集对象,通过它可以实现数据的分页显示。在该对象中有一个“光标”的概念,光标通过上下移动定位查询结果集中的行获取数据。所以通过ResultSet移动光标,可以设置ResultSet对象中记录的起始和结束位置来实现数据的分页显示。
通过ResultSet的光标实现分页优点是在多种数据库上通用;缺点是占用大量资源,不适合于数据量大的情况。
(2)通过数据库机制分页
很多数据库提供了分页机制,如SQL Server中提供的“top”关键字和MySQL数据库中提供的“limit”关键字,它们都可以设置数据返回的记录数。
通过各种数据库提供的分页机制实现分页查询,其优点是减少数据库资源的开销,提高程序的性能;缺点是只针对某一种数据库通用。
由于通过ResultSet的光标实现数据分页存在性能方面的缺陷,所以在实际的开发之中,很多情况下都是采用数据库提供的分页机制来实现分页查询功能。