文档库 最新最全的文档下载
当前位置:文档库 › 第11章 JDBC 编程

第11章 JDBC 编程

第11章 JDBC 编程
第11章 JDBC 编程

第11章 JDBC 编程

核心内容:

1. JDBC 的基本结构与原理

2. 2 JDBC 数据库访问的详细步骤.

11.1 JDBC 介绍

JDBC 的全称是Java Database Connectivity ,即Java 数据库连接,它是一种可以执行SQL 语句的Java API 。应用程序可以通过JDBC API 连接到关系数据库,并使用结构化查询语言SQL ( 数据库标准的查询语言)来完成对数据库的查询、更新。

与其他数据库编程环境相比,JDBC 为数据库开发提供了标准的API ,使用JDBC 开发的数据库应用可以跨平台运行,而且还可以跨数据库(如果全部使用标准的SQL 语句)。也就是说如果使用JDBC 开发一个数据库应用,则该应用既可以在Windows 操作系统上运行,又可以在Unix 等其他操作系统上运行,既可以使用MySQL 数据库,又可以使用Oracle 等其他的数据库,应用程序不需要做任何的修改。对于Java 语言的各种跨平台特性,其实他们都采用相似的结构。因为他们都需要让相同的程序在不同的平台上运行,所以需要中间的转换程序(为了实现Java 程序的跨平台,Java 为不同的操作系统提供了不同的Java 虚拟机)。同样,为了JDBC 程序可以跨平台,也需要相应的数据库驱动进行转换。数据库驱动是各个支持Java 的数据库生产厂商实现JDBC API 的实现类。程序员使用JDBC 时只要面向标准的JDBC API 编程即可,当进行数据库切换时只是更换不同的实现类而已。图11-1显示了JDBC 驱动的示意图。

图11-1 JDBC 驱动的示意图

正是通过JDBC 驱动的转换,才使得使用相同的JDBC API 编写的程序,可以在不同的数据库系统上运行。

Java 应用程序

JDBC API

JDBC API

JDBC API Oracle 数据库驱动

DB2数据库驱动

MySQL 数据库驱动

Oracle 数据库 DB2数据库 MySQL 数据库

11.2 JDBC 结构

JDBC提供了独立于数据库的统一API,用以执行SQL命令。JDBC API由以下常用的接口和类组成。

1.DriverManager

用于管理JDBC驱动的服务类。程序中使用该类的主要功能是获得Connection对象。该类包含如下方法:

public static Connection getConnection(String url, String user, String password) throws SQLException

试图建立到给定数据库URL 的连接。DriverManager 试图从已注册的JDBC 驱动程序集中选择一个适当的驱动程序。

2.Connection

代表数据库连接对象,每个Connection代表一个物理连接会话。要想访问数据库,必须先获得数据库连接对象。该接口的常用方法有:

Statement createStatement() throws SQLException

创建一个 Statement 对象来将SQL 语句发送到数据库。

PreparedStatement prepareStatement(String sql) throws SQLException

创建一个 PreparedStatement 对象来将参数化的SQL 语句发送到数据库。

CallableStatement prepareCall(String sql) throws SQLException

创建一个 CallableStatement 对象来调用数据库存储过程。

以上3个方法都是用于返回执行SQL语句的Statement对象,PreparedStatement、CallableStatement是Statement的子类,只有获取了Statement之后才可执行SQL语句。

3.Statement

用于执行SQL语句的工具接口。该对象既可以用于执行数据库的更新,还可用于执行数据库的查询。当执行SQL查询时,返回查询到的结果集。该接口常用的方法如下:

ResultSet executeQuery(String sql) throws SQLException

该方法用于执行查询语句,并返回查询结果对应的ResultSet对象。该方法只能用于执行查询语句。

int executeUpdate(String sql) throws SQLException

该方法用于执行更新语句,并返回受影响的行数;

boolean execute(String sql) throws SQLException

该方法可执行任何SQL语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或者没有任何结果,则返回false。

4.PreparedStatement

预编译的Statement对象。PreparedStatement是Statement的子接口,它允许数据库预编译SQL(这些SQL语句通常带有参数)语句,以后每次只改变SQL命令的参数,避免数据库每次都要编译SQL语句,因此性能更好。相对于Statement而言,使用PreparedStatement执行SQL语句时,无需传入SQL参数,因为它已经预编译了SQL语句。但PreparedStatement需要为预编译的SQL语句传入参数值。

5. ResultSet

结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或者列名称获取列数据。该

接口的常用方法如下:

void close( ) throws SQLException

释放ResultSet对象。

void beforeFirst( )

将ResultSet的记录指针定位到首行之前。这是ResultSet结果集记录指针的初始状态。记录指针的初始位置位于第一行之前。

boolean first( )

将ResultSet的记录指针定位到首行。如果移动后的记录指针指向一条有效的记录,则该方法返回true。

boolean previous( )

将ResultSet的记录指针定位到上一行。如果移动后的记录指针指向一条有效的记录,则该方法返回true。

boolean next( )

将ResultSet的记录指针定位到下一行。如果移动后的记录指针指向一条有效的记录,则该方法返回true。

boolean last( )

将ResultSet的记录指针定位到最后一行。如果移动后的记录指针指向一条有效的记录,则该方法返回true。

boolean absolute(int row)

将ResultSet的记录指针移动到第row行。如果给定的行数row为负数。则将ResultSet的记录指针移动到倒数第row行。如果移动后的记录指针指向一条有效的记录,则该方法返回true。

11.3 JDBC编程步骤

了解了JDBC的相关接口和类之后,下面就可以进行JDBC编程了,JDBC编程大致可以分为以下步骤(1)加载数据库驱动程序:各个数据库都会提供JDBC驱动程序开发包,直接把JDBC操作所需要的开发包(一般为*.jar或*.zip)配置到classpath路径即可。

(2)连接数据库:根据各个数据库不同,连接的地址也不同,此连接地址由数据库厂商提供。一般在使用JDBC连接数据库时都要求用户输入数据库连接的用户名和密码。用户在取得数据库连接之后,才能对数据库进行更新和查询操作。

(3)使用语句进行数据库操作:数据库操作分为查询和更新两种,除了可以使用标准的SQL外,对于各个数据库也可以使用其各自提供的命令。

(4)关闭数据库连接:数据库操作完毕之后需要关闭连接以释放资源。

11.4 通过JDBC连接数据库

11.4.1 加载数据库驱动程序

加载数据库驱动程序是JDBC连接数据库的第一步,在此之前必须下载所要使用数据库相对应的驱动程序。如要使用MySQL数据库进行开发,在安装完MySQL数据库后(MySQL数据库可直接在

https://www.wendangku.net/doc/d518662417.html,/downloads/下载),必须下载MySQL数据库的驱动程序(MySQL数据库的驱动程序可直接在https://www.wendangku.net/doc/d518662417.html,/downloads/connector/下载)。然后将数据库驱动程序的路径配置到系统环境变量CLASSPA TH中。如果在系统环境变量中没有发现CLASSPA TH属性,则可以直接建立一个新的用户变量,但是建立时一定要注意变量的名称CLASSPA TH必须大写,在设置变量的值时要加入一个“.;”表示可以从当前所在的文件夹查找所要的类,之后每一个新添加的值与前面的值以“;”隔开。现假定MySQL 的数据库驱动程序保存在F:\mysql\mysql-connector-java-5.1.18.zip路径中,则驱动程序路径的配置如图11-2所示

图11-2 驱动路径配置图

将数据库驱动程序的路径配置到系统环境变量CLASSPA TH中后,我们就可以通过Class类中的静态方法forName(String className)加载数据库驱动程序。该方法需要传入数据库驱动包中类的完整名称,采用“包.类”名称的方式。不同的数据库,驱动包中类的完整名称不一样。如:

MySQL数据库驱动包中类的完整名称为:com.mysql.jdbc.Driver。

Oracle数据库驱动包中类的完整名称为:oracle.jdbc.driver.OracleDriver。

SQL Server数据库驱动包中类的完整名称为:com.microsoft.jdbc.sqlserver.SQLServerDriver。

【例11-1】ConnectionDemo01.java 加载驱动程序

public class ConnectionDemo01 {

//定义MySQL数据库驱动程序类名

static final String DBDRIVER = "com.mysql.jdbc.Driver";

public static void main(String[] args) {

try {

Class.forName(DBDRIVER);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

如果以上程序可以正常运行,则证明数据库驱动程序已经配置成功。

11.4.2 连接数据库

如果数据库驱动程序可以正常加载,下面就可以使用DriverManager类连接数据库。在DriverManager 类中,提供的主要操作就是得到一个数据库的连接。getConnection( )方法就是取得连接的Connection对象。调用该方法必须传入一个数据库的连接地址URL。JDBC虽然提供了与平台无关的数据库操作,但是各个数据库的连接地址URL是不同的。JDBC数据库的连接地址URL由JDBC协议、子协议、子名称共3个部分组成。JDBC URL中的协议总是jdbc。子协议是数据库驱动或数据库连接机制的名称。如mysql。子名称是一种标识数据库的方法。必须遵循“//主机名:端口/数据库名称”的标准URL命名约定。不同数据库的连接地址URL写法可能存在较大的差异。假设数据库名称为test,则MySQL数据库的连接地址URL 为:jdbc:mysql://localhost:3306/test; Oracle数据库的连接地址为:jdbc:orcale:thin:@lost:1521/test; SQL Server 数据库的连接地址为:jdbc:microsoft:sqlserver//localhost:1433;DatabaseName=test。在本章例子中我们将对一个MySQL数据库test进行数据库的连接和操作。

【例11-2】ConnectionDemo02.java 连接数据库

1 import java.sql.Connection;

2 import java.sql.DriverManager;

3 import java.sql.SQLException;

4

5 public class ConnectionDemo02 {

6 //定义MySQL数据库驱动程序类名

7 public static final String DBDRIVER = " com.mysql.jdbc.Driver ";

8 //定义MySQL数据库的连接地址

9 public static final String DBURL="jdbc:mysql://localhost:3306/test";

10 //定义MySQL数据库连接的用户名

11 public static final String DBUSER="root";

12 //定义MySQL数据库的连接密码

13 public static final String DBPASS="123456";

14 public static void main(String[] args) {

15 Connection conn=null;

16 try {

17 Class.forName(DBDRIVER);

18 } catch (ClassNotFoundException e) {

19

20 e.printStackTrace();

21 }

22 try {

23 conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);

24 } catch (SQLException e) {

25 // TODO Auto-generated catch block

26 e.printStackTrace();

27 }

28 System.out.println(conn);

29 try {

30 conn.close();

31 } catch (SQLException e) {

32 e.printStackTrace();

33 }

34

35 }

36 }

程序运行结果为:

com.mysql.jdbc.JDBC4Connection@7348e

程序运行的结果不为空,说明此时数据库已经连接成功。在程序操作中,数据库的资源非常有限的,这就要求开发者在操作完数据库之后必须将取得的连接对象关闭。可以通过Connection对象的close( )方法关闭数据库连接。

11.4.3 操作数据库

数据库连接后,即可对数据库进行具体的操作。如果要对数据库进行操作,则必须使用Statement接口完成。此接口可以通过Connection接口中的createStatement() 方法获得。Statement接口中定义了executeUpdate( )和executeQuery( )分别对数据库进行更新和查询操作。

【例11-3 】ConnectionDemo03.java 数据库的操作

1 public class ConnectionDemo03 {

2 //定义MySQL数据库驱动程序类名

3 public static final String DBDRIVER = "com.mysql.jdbc.Driver";

4 //定义MySQL数据库的连接地址

5 public static final String DBURL="jdbc:mysql://localhost:3306/test";

6 //定义MySQL数据库连接的用户名

7 public static final String DBUSER="root";

8 //定义MySQL数据库的连接密码

9 public static final String DBPASS="123456";

10 public static void main(String[] args) {

11 Connection conn=null;

12 Statement stat=null;

13 //在数据库test中创建表user的SQL语句

14 String createTable=" create table user(id int auto_increment primary key," +

15 "name varchar(30) not null,password varchar(32) not null,age int(3) ) ";

16 //插入一条数据到表user中的SQL语句

17 String insertV alue=" insert into user(name,password,age) values('小明','666666',28);";

18 try {

19 //加载数据库驱动程序

20 Class.forName(DBDRIVER);

21 //连接数据库test

22 conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);

23 //获取Statement对象

24 stat=conn.createStatement();

25 //在数据库test中创建表user

26 stat.executeUpdate(createTable);

27 //插入一条记录到表user中

28 stat.executeUpdate(insertV alue);

29 //关闭Statement对象

30 stat.close();

31 //关闭数据库的连接

32 conn.close();

33 } catch (Exception e) {

34 // TODO Auto-generated catch block

35 e.printStackTrace();

36 }

37

38 }

39 }

该程序正常执行,则说明已成功在数据库test中创建了表user,并向其添加了一条记录。在数据库操作中都存在关闭方法,连接有关闭,操作也有关闭。一般来说连接只要一关闭,则其他的所有操作都会关闭。在开发JDBC代码中一般习惯按顺序关闭,先关闭操作,后关闭连接。

对数据库进行增、删、改操作都属于数据库的更新操作,直接使用Statement接口中定义的executeUpdate( )方法即可完成。如果要对数据库进行查询操作,则需要使用Statement接口中定义的executeQuery( )方法。此方法的返回类型是一个ResultSet接口类型的对象。该对象中存放了所有的查询结果。该接口常用的方法有getInt( )、getString( )、getFloat( )、next( )等。

【例11-4 】ConnectionDemo04.java 从user表中查询数据

1 import java.sql.Connection;

2 import java.sql.DriverManager;

3 import java.sql.ResultSet;

4 import java.sql.Statement;

5

6 public class ConnectionDemo04 {

7 //定义MySQL数据库驱动程序类名

8 public static final String DBDRIVER = "com.mysql.jdbc.Driver";

9 //定义MySQL数据库的连接地址

10 public static final String DBURL="jdbc:mysql://localhost:3306/test";

11 //定义MySQL数据库连接的用户名

12 public static final String DBUSER="root";

13 //定义MySQL数据库的连接密码

14 public static final String DBPASS="123456";

15 public static void main(String[] args) {

16 Connection conn=null;

17 Statement stat=null;

18 ResultSet rs=null;

19 //查询表user当中得数据

20 String query="select id,name,password,age from user";

21 try {

22 //加载数据库驱动程序

23 Class.forName(DBDRIVER);

24 //连接数据库test

25 conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);

26 //获取Statement对象

27 stat=conn.createStatement();

28 //执行查询操作,获取包含查询结果的ResultSet对象

29 rs=stat.executeQuery(query);

30 while(rs.next()){

31 int id=rs.getInt("id"); //获取查询到的id字段的值

32 String name=rs.getString("name");//获取查询到的name字段的值

33 String password=rs.getString("password");//获取查询到的password字段的值

34 int age=rs.getInt("age");//获取查询到的age字段的值

35 System.out.println(id+"--->"+name+"--->"+password+"--->"+age);

36

37 }

38 rs.close(); //关闭结果集

39 stat.close();//关闭操作

40 conn.close(); //关闭数据库的连接

41 } catch (Exception e) {

42 e.printStackTrace();

43 }

44

45 }

46 }

输出结果:

1--->小明--->666666--->28

如果我们经常需要执行一条结构相似的SQL语句,例如下面两条SQL语句:

insert into user(name,password,age) values('小明','666666','28');

insert into user(name,password,age) values('小红','777777','25');

对于这两条SQL语句而言,他们的结构基本相似,只是执行插入时插入的值不同而已,在这种情况下,我们可以使用带占位符(?)参数的SQL语句来代替它:

insert into user(name,password,age) values(?,?,?);

但Statement执行SQL语句时不允许使用?占位符参数,而且这个?占位符参数必须获得值后才可以执行。为了满足这种功能,JDBC提供了PreparedStatement接口,它是Statement的子接口,它可以预编译SQL语句,预编译后的SQL语句存储在PreparedStatement对象中,然后可以使用该对象多次高效的执行该语句。创建PreparedStatement对象可以使用Connection的preparedStatement()方法。该方法需要传入一个SQL字符串,该字符串中可以包含占位符参数。如:

conn.preparedStatement(“insert into user(name,password,age) values(?,?,?)”);

使用PreparedStatement执行SQL语句时,同样通过调用execute( ),executeUpdate( ),executeQuery( )方法来执行SQL语句,只是与Statement相比,PreparedStatement对象在调用这些方法时,不需要传入参数。但在PreparedStatement对象执行SQL语句之前,必须调用PreparedStatement的setXxx(int index,int value)方法来为SQL语句中的占位符参数传值。

【例11-5】ConnectionDemo05.java 使用PreparedStatement对象操作数据库

1 import java.sql.Connection;

2 import java.sql.DriverManager;

3 import java.sql.ResultSet;

4 import java.sql.PreparedStatement

5

6 public class ConnectionDemo05 {

7 //定义MySQL数据库驱动程序类名

8 public static final String DBDRIVER = "com.mysql.jdbc.Driver";

9 //定义MySQL数据库的连接地址

10 public static final String DBURL="jdbc:mysql://localhost:3306/test";

11 //定义MySQL数据库连接的用户名

12 public static final String DBUSER="root";

13 //定义MySQL数据库的连接密码

14 public static final String DBPASS="123456";

15 public static void main(String[] args) {

16 Connection conn=null;

17 PreparedStatement ps=null;

18 try {

19 //加载数据库驱动程序

20 Class.forName(DBDRIVER);

21 //连接数据库test

22 conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);

23 ps=conn.prepareStatement("insert into user(name,password,age)values(?,?,?)");

24 for(int i=0;i<10;i++){

25 ps.setString(1,"name"+i); //设置第一个占位符的值

26 ps.setString(2,"6666"+i); //设置第二个占位符的值

27 ps.setInt(3, 20+i); //设置第三个占位符的值

28 ps.executeUpdate();

29 }

30

31 ps.close(); //关闭操作

32 conn.close(); //关闭数据库的连接

33 } catch (Exception e) {

34 e.printStackTrace();

35 }

36

37 }

38 }

若程序正常运行,则表明数据插入成功。也可再次运行例11-4验证。

11.4.4 关闭操作数据库连接

在数据库操作完毕之后需要关闭连接以释放资源。包括关闭ResultSet、Statement和Connection 资源。通过调用close()方法来完成。

本章小结

本章介绍了JDBC的基本结构与原理。详细讲解了DriverManager、Statement、PreparedStatement、ResultSet 等类的用法,重点讲解了JDBC数据库访问的详细步骤,包括加载数据库的驱动、获取数据库连接,执行SQL语句、处理执行结果等。

习题

一.简答题

1. JDBC编程的步骤。

2. boolean execute(sql) 此boolean值的意义是什么?

3. executeQuery(sql)方法的返回值是何类型?

4.executeUpdate(sql)方法的返回值是何类型?返回值的意义是什么?

5.请简述一下Statement 和PreparedStatement之间的区别。

二.选择题(从每题A、B 、C、D四个选项中选择一个符合条件的正确选项)

1.()用于执行SQL语句并将数据检索到ResultSet中。

A. Statement

B. Connection

C. CalledStatement

D. ResultSet

2. ()用于保存数据查询的结果集。

A. Connection

B. Statement

C. PreparedStatement

D. ResultSet

3. ()现在有默认ResultSet类型的对象rs,那么获取下一行的数据正确的语句是()

A. rs.next( )

B. rs.nextRow( )

C. rs.getNext( )

D. rs.getNextRow( )

4.()类试图找到一个能够连接到URL中指定的驱动程序。

A. DriverManager

B. Connection

C. PreparedStatement

D. CalledStatement

5.()JDBC使用SQL语句操作数据库数据时,()是必须捕获的异常。

A. EOFException

B. SQLException

C. InteruptedException

D. ArimeticException

三.编程题

1.编写一个程序,可以通过JDBC建立到数据库,如连接数据库成功,则输出“数据库连接成功”,若连接数据库失败,则输出“数据库连接失败”。

2. 编写一个程序,可以通过JDBC建立到数据库,如连接数据库成功,则在该数据库中创建一张表,向表中添加若干条记录。然后输出“数据库连接成功”,若连接数据库失败,则输出“数据库连接失败”。

3. 编写一个程序,可以通过JDBC建立到数据库,如连接数据库成功,则查询出上题中所创建表中的所有数据并输出,若连接数据库失败,则输出“数据库连接失败”。

相关文档
相关文档 最新文档