上一个任务/上一节 下一个任务/下一节
目录
示例1
2.1.1 JDBC 的基本使用
在之前的学习中,新闻标题等数据的存储和显示都是在 JSP 中直接通过变量来实现
的。但是当页面中需要显示大量的数据信息时,就不能再使用变量来实现了。使用数据
库来存储数据,通过访问数据库实现数据的读取和编辑,是进行项目开发必须要掌握的
一门技术。
1.JDBC 技术
(1)JDBC 的概念
JDBC (Java DataBase Connectivity) 是一种 Java 数据库连接技术,能实现 Java 程
序对各种数据库的访问。由一组使用 Java 语言编写的类和接口组成,这些类和接口称为
JDBC API ,它们位于 java.sql 以及 javax.sql 包中。
(2)JDBC 的作用
在项目开发中,使用 JDBC 可以实现应用程序与数据库之间的新闻通信,简单来说,
JDBC 的作用有以下 3 点。
1)建立与数据库之间的访问连接。
2)将编写好的 SQL 语句发送到数据库执行。
3)对数据库返回的结果进行处理。
(3) JDBC 的工作原理
JDBC 在执行时有一套固定的流程,图 2-1 所示为 JDBC 的工作原理。
从 图 2.1 中可以看到一个 JDBC 程序有几个重要的组成要素。顶层是自己编写的 Java
应用程序,Java 应用程序可以使用 javax.sql 和 javax.sql 包中的 JDBC API 来连接和操作
数据库。了解 JDBC 的工作原理请扫描二维码。
2.使用JDBC 访问数据库
(1)JDBC API
使用JDBC 访问数据库,就必须要使用到 JDBC API 。JDBC API 可以完成 3 件事情:
与数据库建立连接、发送 SQL 语句和处理数据库返回的结果,如图 2.2 所示。
图2.2 JDBC API
图2.2 展示了在使用 JDBC API 时,JDBC API 工作的4个重要环节涉及的相关类和
接口。
1)DriverManager 类:负责依据数据库的不同,管理 JDBC 驱动。
2 ) Connection (连接) 接口:负责连接数据库并担任传送数据的任务。
3) Statment 接口:由 Connection 产生,负责执行 SQL 语句。
4)ResultSet 接口:负责保存 Statement 执行后所产生的执行结果。
(2) JDBC 访问数据库的步骤
实现数据库的访问,需要执行以下几个步骤。
1) 使用 Class.forName() 方法加载 JDBC 驱动类。如果系统中不存在给定的类,则
会引发已异常,异常类型为 "ClassNotFoundException"。 加载驱动的语法如下:
Class.forName("JDBC 驱动类的名称");
2)使用 DriverManager 类获取数据库的连连接。
DriverManager 类跟踪已注册的驱动程序,当调用 getConnection() 方法时,它会搜
索整个驱动程序列表,知道找到一个能够连接至数据库连接字符串中指定的数据库的驱
动程序。加载此驱动程序之后,将使用 DreverManager 类的 getConnection() 方法建立与
数据库的连接。此方法接收 3 个参数,分别表示数据库 URL 、数据库用户名和密码。其中,
数据库用户名和密码是可选的。获取数据库连接的语法如下:
Connection connection = DriverManager.getConnection(数据库 URL,数据库用户名,密码);
例 1 示
使用 JDBC 访问新闻系统数据库,加载数据库驱动,获取数据库连接。
关键代码:
public void getNewsList(){
try {
//(1) 使用 Class.forName() 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//(2) 获取数据库连接
Connection connection = DriverManager.getConnection("jdbc.mysql://localhost:3306/news"),"root","root");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
使用 JDBC 访问数据库的第一步就是要加载驱动,然后是获取数据库连接,这个过
程可能会产生异常,所以在代码中使用了 try-catch 语句对异常进行捕捉处理。
3) 发送 SQL 语句,并得到结果集。一旦建立连接,就可以使用该连接创建 Statement
接口的实列,并将 SQL 语句传递给他所连接的数据库,若执行的是查询语句,会返回
类型为 ResultSet 的对象,它包含执行 SQL 查询语句的结果。
创建 Statement 接口实列 的语句如下。
Statement stmt = connection.createStatement();
获取结果集对象的语句如下。
ResultSet rs = stmt.executeQuery("SELECT a,b,c FROM tabe 1");
示例 2
在示例 1 的基础上,执行 SQL 语句并获得结果集。
关键代码:
……
//(1) 使用 Class.forName() 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//(2) 获得数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/news"),"root","root");
//(3)获得 Statement 对象,执行 SQL 语句
String sql = "select*from news_detail";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
4) 处理结果。
执行 SQL 查询语句后,会返回一个结果集 ResultSet 对象。对结果集进行处理的步
骤概括如下。
- 使用 ResultSet 对象的 next() 方法判断结果集是否包含数据。
- 在 next() 方法返回 ture 的情况下调用 ResultSet 对象的 getXxx() 方法,得到记录
- 中字段对应的值。
示例 3
在示例 2 的基础上 ,对结果集 进行处理。
关键代码:
……
//(4) 处理执行结果 (ResultSet)
while(rs.next()){
int id= rs.getInt("id");
String title = rs.getString("title");
String summary = rs.getString("summary");
String content = rs.getString("content");
String author = rs.getString("author");
Timestamp time = rs.getTimestamp("createdate");
System.out.println(id +"\t" +title = "\t"+summary +"'t"+
content+"\t" +author +"\t" +time);
}
……
5)释放资源。在结束数据库访问后,应及时地释放资源。释放资源时需要注意如
下两个问题。
1) 释放资源应按照创建顺序逐一释放,先创建的后释放,后吃创建的先释放。
2) 由于资源释放不考虑程序本身运行是否正常,所以将释放资源至于 finally 语句
块中,确保程序最终会执行资源释放的语句。
示例 4
结束数据库访问后,释放资源。
关键代码:
……
finally{
//(5) 释放资源
try{
if(rs!=null){
rs.close(); // 关闭结果集对象
}
if(stmt!=null){
stmt.close(); //关闭 Statement 对象
}
if(connection!=null){
connection.close(); //关闭连接对象
}
}catch (SQLException e){
e.printStackTrace();
}
}
……
注意
如果对一个已经关闭的或者没有实列化的 Connection 对象进行关闭,系统会
抛出异常。所以在关闭时,一个良好的习惯是,首先对关闭对象进行判断,判断
其是否为 NULL ,然后再确定是否关闭。