JDBC

JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源。

JDBC为访问不同的数据库提供了一种 统一的途径,为开发者屏蔽了一些细节问题。

JDBC的目标是使Java程序员 使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。

  • JDBC驱动程序

JDBC驱动程序实现JDBC API中定义的接口,用于与数据库服务器进行交互。

例如,使用JDBC驱动程序可以打开数据库连接,并通过发送SQL或数据库命令,然后收到结果与Java进行交互。

java.sql包中附带的JDK包含定义各种类与他们的行为和实际实现在第三方驱动程序。第三方供应商实现了他们的数据库驱动程序的 java.sql.Driver 接口。

  • 类型1:JDBC-ODBC桥驱动程序
  • 类型2:JDBC-Native API调用
  • 类型3:JDBC网络纯Java
  • 类型4:100%纯Java

 

 

  • JDBC连接数据库

在安装相应的驱动程序后,可以建立使用JDBC的数据库连接。

建立一个JDBC连接的四个步骤:

  • 导入JDBC包:添加import语句到Java程序导入所需的类在Java代码中。
  • 注册JDBC驱动程序:这一步会导致JVM加载所需的驱动程序实现到内存中,因此它可以实现JDBC请求。
  • 数据库URL制定:这是创建格式正确的地址指向到要连接的数据库。
  • 创建连接对象:最后,代码调用DriverManager对象的getConnection()方法来建立实际的数据库连接。

 

  • 导入JDBC包
import java.sql.* ;  // for standard JDBC programs
import java.math.* ; // for BigDecimal and BigInteger support

 

  • 注册JDBC驱动程序

使用它之前,必须注册你的驱动程序在程序。注册驱动程序是由Oracle驱动程序的类文件被加载到内存中以便它可以被用作JDBC接口的实现过程。

方法(1):Class.forName()

try {
   Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: unable to load driver class!");
   System.exit(1);
}

方法(2):DriverManager.registerDriver()

try {
   Driver myDriver = new oracle.jdbc.driver.OracleDriver();
   DriverManager.registerDriver( myDriver );
}
catch(ClassNotFoundException ex) {
   System.out.println("Error: unable to load driver class!");
   System.exit(1);
}

数据库URL制定

在注册驱动程序后,以建立程序中使用DriverManager.getConnection()方法的连接。

三个DriverManager.getConnection()方法:

  • getConnection(String url)

jdbc:oracle:driver:username/password@database
//在这种情况下,数据库的URL,包括用户名和密码
String URL = "jdbc:oracle:thin:username/password@amrood:1521:EMP";
Connection conn = DriverManager.getConnection(URL);
  • getConnection(String url, Properties prop)

import java.util.*;

String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
Properties info = new Properties( );
info.put( "user", "username" );
info.put( "password", "password" );

Connection conn = DriverManager.getConnection(URL, info);
  • getConnection(String url, String user, String password)

在这里,每个表单需要一个数据库URL。数据库的URL是指向数据库地址。

下表列出了下来流行的JDBC驱动程序名和数据库的URL。

创建连接对象

下面三种形式DriverManager.getConnection()方法来创建一个连接对象。getConnection()最常用形式要求传递一个数据库URL,用户名 username和密码 password。

对URL数据库部分databaseName的值:假设使用的是Oracle的瘦驱动程序,需要指定一个主机:端口。

假设有一台主机TCP/IP地址192.0.0.1 以及主机名和Oracle监听器被配置为在端口1521,数据库名称是EMP,然后完整的数据库URL是:

String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);

 关闭JDBC连接

JDBC程序的结束,它明确要求关闭所有的连接到数据库,以结束每个数据库会话。但是,如果忘了,Java垃圾收集器会关闭连接时,它会清除陈旧的对象。

conn.close();

 

  • JDBC Statements,PreparedStatement和CallableStatement

一旦获得一个连接,我们可以与数据库进行交互。在JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以发送SQL或PL/SQL命令和从数据库接收数据。

 

Statement对象:

可以使用Statement对象执行SQL语句,需要使用Connection对象的createStatement( )方法创建一个,如下面的示例所示: 

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

一旦创建了一个Statement对象,然后可以用它来与它的三个执行方法之一执行SQL语句。

  • boolean execute(String SQL) : 如果ResultSet对象可以被检索返回布尔值true,否则返回false。使用这个方法来执行SQL DDL语句,或当需要使用真正的动态SQL。

  • int executeUpdate(String SQL) : 返回受影响的SQL语句执行的行的数目。使用此方法来执行,而希望得到一些受影响的行的SQL语句 - 例如,INSERT,UPDATE或DELETE语句。

  • ResultSet executeQuery(String SQL) : 返回ResultSet对象。当希望得到一个结果集使用此方法,就像使用一个SELECT语句。

PreparedStatement对象:

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   ptmt.close();
}

 

在JDBC中所有的参数都被代表?符号,这是已知的参数标记。在执行SQL语句之前,必须提供值的每一个参数。

setXXX()方法将值绑定到参数,其中XXX表示希望绑定到输入参数值的Java数据类型。如果忘了提供值,将收到一个SQLException。

每个参数标记是由它的序号位置引用。第一标记表示位置1,下一个位置为2 等等。这种方法不同于Java数组索引,以0开始。

所有的Statement对象的方法来与数据库交互(a) execute(), (b) executeQuery(), 及(c) executeUpdate() 也与PreparedStatement对象的工作。然而,该方法被修改为使用SQL语句,可以利用输入的参数。

 

CallableStatement 对象:

 

posted @ 2017-04-02 09:42  dear_diary  阅读(284)  评论(0编辑  收藏  举报