You are on page 1of 35

JDBC 基础知识

回顾 1

java.io 包中包含了一系列对输入 / 输出进行操作


的类
File 类用于访问文件系统,但只能访问文件(或
目录)的属性,而不能进行读 / 写操作
流是指一连串流动的数据信号,是以先进先出方
式发送信息的通道,从流动方向上区分,流可以
分为输入流和输出流,从格式上区分,可以分为
字节流和字符流
使用 FileInputStream 类和 FileOutputStream 类
以字节流的方式读写文件
回顾 2

FileReader 类和 FileWriter 类配合


BufferedReader 类和 BufferedWriter 类可以以
字符流的方式对文件进行读 / 写操作
要从控制台接受输入,需要将 System.in 对象进
行包装,使用如下语句:
InputStreamReader isr = new
InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

DataInputStream 类和 DataOutputStream 类在
读 / 写数据时可以区分数据类型
绝大部分的 IO 操作都有可能抛出 IOException
本章相关词汇

单 词 说 明
driver 驱动,驱动程序
connection 连接
manager 管理器
statement 语句
prepared 预备的,预编译的
result 结果
create 创建,创造
execute 执行
query 查询
本章目标

了解 JDBC 的概念和必要性
了解 JDBC 驱动程序类型
了解 java.sql 包
理解 JDBC 程序的结构
使用 JDBC 进行数据库编程
数据库访问技术简介

当今企业级应用程序大部分采用了客户机 /
服务器( C/S )模式;
客户端机器需要与服务器进行通讯,要操
作数据库中的数据,执行
SQL ( Structured Query Language 结构
化查询语言)语句以及检索查询结果;
在 Java 中实现这些活动的技术称作 JDBC

数据库编程示意图

数据库编程

执行 SQL 语句

客户机 / 服务器
应用程序 数据库

检索查询结果

JDBC
关于 DBMS

DBMS ( DataBase Management System )是指数


据库管理系统;
目前 DBMS 的生产商众多,产品也不尽相同,如:
– Oracle 公司的 Oracle 系列;
– Microsoft 公司的 Access 系列和 SQL Server 系列;
– Microsoft 公司早期的 FoxPro ;
– IBM 公司的 DB2 ;
– Sybase 公司的 Sybase ;
– 还有自由开源的 MySQL 等等。
这就意味着编程语言要针对不同的 DBMS 开发不同
版本的应用程序,这将是一项非常枯燥的工作。
ODBC

ODBC ( Open DataBase Connectivity )


指开放式数据库连接,是由 Microsoft 公
司提供的应用程序接口;
它负责连接各种不同产商和类型的 DBMS
,然后为各种不同的编程语言提供查询、
插入、修改和删除数据的功能;
如同在各种不同的 DBMS 和各种不同的编
程语言之间架设了一座通用的桥梁。
JDBC

JDBC ( Java DataBase Connectivity )


是由 Sun Microsystem 公司提供的
API ( Application Programming Interface
应用程序编程接口);
它为 Java 应用程序提供了一系列的类,
使其能够快速高效地访问数据库;
这些功能是由一系列的类和对象来完成的
,我们只需使用相关的对象,即可完成对
数据库的操作。
JDBC 工作方式示意图

Java 程序

JDBC 驱动程序

SQL 命令 结果

数据库
JDBC 驱动程序类型

使用 JDBC 连接数据库可以通过不同的驱
动方式来实现,有 4 种驱动类型:
– JDBC-ODBC 桥驱动
– 纯 Java 驱动
– 本地 API 部分 Java 驱动
– JDBC 网络纯 Java 驱动
不论采用哪种驱动方式,在程序中对数据
库的操作方式基本相同,只是加载不同的
驱动程序即可。
java.sql 包

java.sql 包也是 Java 内置的包,其中包含


了一系列用于与数据库进行通信的类和接
口;
如果要使用到这些类和接口的话,则必须
显式地声明如下语句:
import java.sql.*;
java.sql 包中的一些接口

接口名称 说 明

Connection 连接对象,用于与数据库取得连接

Driver 用于创建连接( Connection )对象

语句对象,用于执行 SQL 语句,并将数据检索


Statement 到结果集( ResultSet )对象中
预编译语句对象,用于执行预编译的 SQL 语句,
PreparedStatement 执行效率比 Statement 高

CallableStatement 存储过程语句对象,用于调用执行存储过程

结果集对象,包含执行 SQL 语句后返回的数据


ResultSet 的集合
java.sql 包中的一些类

类 名 称 说 明
数据库异常类,是其它 JDBC 异常类的根类,继
SQLException 承于 java.lang.Exception ,绝大部分对数据库进
行操作的方法都有可能抛出该异常

驱动程序管理类,用于加载和卸载各种驱动程序,
DriverManager 并建立与数据库的连接

该类中包含有将 SQL 日期格式转换成 Java 日期


Date 格式的方法

TimeStamp 表示一个时间戳,能精确到纳秒
JDBC 程序访问数据库步骤

开 始 导入 java.sql 包

JDBC-ODBC 桥方式 纯 Java 驱动方式

建立数据源( ODBC ) 附加相应产商提供的驱动

加载并注册驱动程序

创建 Connection 对象 创建 Statement 对象

关闭 ResultSet 对象 使用 ResultSet 对象 执行 SQL 语句

关闭 Statement 对象 关闭 Connection 对象 结 束
步骤详解 1 :建立数据源

这里以 JDBC-ODBC 桥驱动方式为例,逐步详


细地讲解在 Java 程序中如何操作数据库,而对
于其它驱动方式,只需更换驱动程序即可,其余
不变;
首先建立 ODBC 数据源:
【开始】→ 【设置】→ 【控制面板】→【管理
工具】→【数据源( ODBC )】
新建数据源,名称可以任意,这里假设已经建立
了一个名为 myODBC 的数据源,连接到 SQL
Server 2005 中的 pubs 数据库。
步骤详解 2 :加载驱动程序

使用 Class 类的 forName 方法,将驱动程序类加载


到 JVM ( Java 虚拟机)中;
方 法 原 型 说 明

static Class forName(String className) 将由 className 指定完整名称的类


加载到 JVM 中,如果加载失败,
throws ClassNotFoundException 将抛出异常,必须捕捉

对于使用 JDBC-ODBC 桥的驱动方式,应该加载:


sun.jdbc.odbc.JdbcOdbcDriver 类
如:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
步骤详解 3 :获得连接对象

成功加载驱动后,必须使用 DriverManager 类的静态方


法 getConnection 来获得连接对象;
方 法 原 型 说 明
static Connection getConnection 参数 url 是连接字符串,参数 user 是数据库用
(String url, String user, 户名,参数 password 是登录口令,成功连接到
String password) 数据库返回 Connection 对象,连接失败则抛出
throws SQLException SQLException 异常,必须捕捉

对于使用 JDBC-ODBC 桥的连接方式,连接字符串的一


般形式是:“ jdbc:odbc: 数据源名称”,如:
Connection con =
DriverManager.getConnection("jdbc:odbc:myODBC",
"sa", "");
步骤详解释 4 :创建语句对象

一旦成功连接到数据库,获得 Connection 对象
后,必须通过 Connection 对象的
createStatement 方法来创建语句对象,才可以
执行方SQL 语句;
法 原 型 说 明

Statement createStatement() 成功创建返回 Statement 对象,


否则抛出 SQLException 异常,
throws SQLException 必须捕捉

如:
Statement sta = con.createStatement();
步骤详解 5 :执行 SQL 语句

使用语句对象来执行 SQL 语句,有两种情况:


一种是执行 DELETE 、 UPDATE 和 INSERT 之类的数
据库操作语句( DML ),这样的语句没有数据结果返回
,使用 Statement 对象的 executeUpdate 方法执行;
方 法 原 型 说 明

int executeUpdate(String sql) 参数 sql 是要执行的 SQL 语句,执行成功


返回受影响的行数,执行失败则抛出
throws SQLException SQLException 异常,必须捕捉

如:
sta.executeUpdate("INSERT INTO Friends VALUES(' 田
七 ', ' 重庆 ', 456712, '2003-2-25', 7500)");
步骤详解 5 :执行 SQL 语句(续)

另一种是执行 SELECT 这样的数据查询语句( DQL


),这样的语句将从数据库中获得所需的数据,使
用 Statement 对象的 executeQuery 方法执行;

方 法 原 型 说 明

ResultSet executeQuery(String 参数 sql 是要执行的 SQL 语句,查询


sql) 成功返回包含有结果数据的
ResultSet 对象,否则抛出
throws SQLException SQLException 异常,必须捕捉

如:
ResultSet rs =
sta.executeQuery("SELECT * FROM Friend");
步骤详解 6 :关闭资源

当对数据库的操作结束后,应当将所有已经被打开的资
源关闭,否则将会造成资源泄漏;
Connection 对象、 Statement 对象和 ResultSet 对象都
有执行关闭的 close 方法;
函数原型都是: void close() throws SQLException
如:
rs.close(); // 关闭 ResultSet 对象
sta.close(); // 关闭 Statement 对象
con.close(); // 关闭 Connection 对象
有可能抛出 SQLException 异常,必须捕捉;
请注意关闭的顺序,最后打开的资源最先关闭,最先打
开的资源最后关闭。
数据库操作示例
import java.sql.*; // 导入 java.sql 包
public class JDBCDemo {
public static void main(String[] args) {
String strCon = "jdbc:odbc:myODBC"; // 连接字符串
String strUser = "sa"; // 数据库用户名
String strPwd = ""; // 口令
System.out.println(" 正在连接数据库 ...");
try { // 监控异常
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 加载驱动程序
Connection con;
// 获得连接对象
con = DriverManager.getConnection(strCon, strUser, strPwd);
System.out.println(" 成功连接到数据库。 ");
Statement sta = con.createStatement(); // 创建语句对象
// 执行 SQL 语句
String strSql = "DELETE FROM Friends WHERE [Name] = ' 郑六 '";
int count = sta.executeUpdate(strSql);
System.out.println(" 成功删除 " + count + " 行数据。 ");
sta.close(); con.close(); // 关闭所有已经打开的资源
} catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); }
catch (SQLException sqle) { sqle.printStackTrace(); } }
}
操作结果集

使用 Statement 对象的 executeQuery 方法成功执行


SELECT 语句后,将返回一个包含有结果数据的
ResultSet 对象,要从该对象中获取数据,将使用到如下
方法:
方 法 原 型 说 明

boolean next() 将结果集游标往下移动一行,如果已经到


达结果集最后,将会返回 false ,有可能抛
throws SQLException 异常,必须捕捉

X getX(String columnName) 获得某个字段的值, X 是指具体的数据类


throws SQLException 型,视数据库表中字段的具体情况而定,
该方法有一组,并且每个都有两种重载方
法,一种是以字段名称为参数,另一种是
X getX(int columnIndex) 以字段索引为参数(字段索引从 1 开始),
throws SQLException 有可能抛异常,必须捕捉
操作结果集示例

try {
String strCon = "jdbc:odbc:MyODBC";
System.out.println(" 正在连接数据库 ...");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con;
con = DriverManager.getConnection(strCon, "sa", "");
System.out.println(" 成功连接到数据库。 ");
Statement sta = con.createStatement();
ResultSet rs = sta.executeQuery("SELECT * FROM Friends");
System.out.println(" 查询到数据如下: ");
while (rs.next()) { // 循环将结果集游标往下移动,到达末尾返回 false
// 根据字段名称获得各个字段的值
System.out.print(rs.getString("Name") + "\t"); // 获得字符串
System.out.print(rs.getString("Address") + "\t"); // 获得字符串
System.out.print(rs.getInt("Telephone") + "\t"); // 获得整数
System.out.print(rs.getDate("HireDate") + "\t"); // 获得日期型数据
System.out.println(rs.getFloat("Salary")); // 获得浮点型数据
}
rs.close(); sta.close(); con.close();
} catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); }
catch (SQLException sqle) { sqle.printStackTrace(); }
PreparedStatement 接口 1

如果要多次执行相似的 SQL 语句,可以使用


PreparedStatemend (预编译语句对象)对象来执行;
通过 Connection 对象的 PreparedStatement 方法来创
建预编译语句对象;
方 法 原 型 说 明
PrepareStatement 参数 sql 是要执行的 SQL 语句,根据指定的 SQL
PrepareStatement(String sql) 语句创建 PrepareStatement 对象,有可能抛异常,
throws SQLException 必须捕捉

PreparedStatement 对象会将 SQL 语句预先编译,这样


将会获得比 Statement 对象更高的执行效率。
PreparedStatement 接口 2

包含在 PreparedStatement 对象中的 SQL 语句可以带有一个


或多个参数,使用“ ?” 作为占位符,如 :
PreparedStatement ps = con.prepareStatement("UPDATE Friends
SET Address = ? WHERE Name = ?");
在执行 SQL 语句之前,必须使用 PreparedStatement 对象中
的 setX 方法设置每个“ ?” 位置的参数值;

方 法 原 型 说 明
void setX(int parameterIndex, X 将 parameterIndex 指定的“ ?” 位置指定为 x
x) 的值,这里 X 可以指代任意数据类型, “ ?”
throws SQLException 的索引从 1 开始。
如:
ps.setString(1, " 长沙 ");
ps.setString(2, " 王五 ");
PreparedStatement 接口 3

设置好每个参数的值之后,就可以使用
PreparedStatement 对象的 executeUpdate 和
executeQuery 方法来执行 SQL 语句,这一点和
Statement
方 法 原对象很相似:
型 说 明

int executeUpdate() 用于执行 INSERT 、 DELETE 和 UPDATE


语句,执行成功返回受影响的行数,否则抛
throws SQLException 出 SQLException 异常,必须捕捉

ResultSet executQuery() 用于执行 SELECT 语句,执行成功返回包


含有结果数据的 ResultSet 对象,否则抛出
throws SQLException SQLException 异常,必须捕捉
PreparedStatement 对象示例

String strCon = "jdbc:odbc:MyODBC";


System.out.println(" 正在连接数据库 ...");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con;
con = DriverManager.getConnection(strCon, "sa", "");
System.out.println(" 成功连接到数据库。 ");

PreparedStatement ps;
// 使用带参数的 SQL 语句创建 PreparedStatement 对象
ps = con.prepareStatement("UPDATE Friends SET Address = ? WHERE Name = ?");
// 设置 SQL 语句中的参数值
ps.setString(1, " 长沙 ");
ps.setString(2, " 王五 ");
int count = ps.executeUpdate(); // 执行命令

System.out.println(" 成功更新了 " + count + " 行数据。 ");


ps.close(); // 关闭资源
con.close();
纯 Java 驱动方式连接数据库

使用 JDBC-ODBC 桥方式连接数据库,其性能完
全取决于数据源( ODBC )的性能,并且无法脱
离 Microsoft 的平台,这样将带来不便;
大部分 DBMS 产商都为自己的产品开发了纯 Java
的驱动程序,我们只需要加载相应的驱动,就可以
直接连接到数据库,而无需通过 ODBC 桥连接;
鉴于 DBMS 产品太多,这里只针对当今比较流行
的 SQL Server 2000 和 Oracle 9i 进行介绍。
下载驱动程序包

要使用纯 Java 驱动,首先必须获得相应数


据库的驱动程序包;
根据数据库的类型,登录对应产商的官方网
站,一般都可以免费获得;
下载后,复制到本地磁盘,并将完整路径设
置到 classpath 环境变量中,如用开发工具
开发程序,还需在开发环境中设置路径。
纯 Java 驱动连接 SQL Server

使用纯 Java 驱动连接到 SQL Server 2000 数据库


,加载驱动程序应改成如下语句:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServ
erDriver");
连接字符串应如下格式:
"jdbc:microsoft:sqlserver:// 服务器名或 IP:1433;databaseName= 数据
库名 "
如:
Connection con =
DriverManager.getConnection("jdbc:microsoft:sqlserv
er://127.0.0.1:1433;databaseName=pubs", "sa", "");
纯 Java 驱动连接 Oracle

使用纯 Java 驱动连接到 Oracle 9i 数据库,加载


驱动程序应改成如下语句:
Class.forName("oracle.jdbc.driver.OracleDriver");
连接字符串应如下格式:
"jdbc:oracle:thin:@ 服务名或 IP:1521: 数据库名 "
如:
Connection con =
DriverManager.getConnection("jdbc:oracle:thin:@12
7.0.0.1:1521:NEWER", "scott", "tiger");
总结

JDBC 是使用 Java 程序操作数据库的技术;


使用 Class 类的 forName 方法可以将驱动程序加载到
Java 解释器中;
使用 DriverManager 类的 getConnection 方法获得
Connection 对象,从而建立与数据库的连接;
使用 Connection 对象的 createStatement 方法创建语句
对象,以便执行 SQL 语句;
使用 Statement 对象的 executeQuery 或 executeUpdate 方
法执行 SQL 语句,并使用 ResultSet 对象来操作结果数据

PreparedStatement 接口允许创建预编译的 SQL 语句,并
使得在后续阶段可以指定语句的参数。

You might also like