menu

在路上

我们走入生活,总以为前方会有莫大的幸福在等待着自己.但是蓦然回首,才发现幸福其实就在点点滴滴流逝的时光中

Avatar

JDBC 3.0 API与Oracle9i数据库

JDBC 3.0 API与Oracle9i数据库

JDBC(Java DataBase Connectivity)API是Java程序语言内的针对数据存取所设计的程序开发接口,主要是由一组Java语言编写的"类"和"接口"所构成。
JDBC 3.0 API已完全包含在JDK 1.4版本中。
使用JDBC API存取特定数据库系统前,必须拥有适当的JDBC驱动程序,可以在Sun网站查询http://java.sun.com/products/jdbc/jdbc.drivers.html,
也可以在OTN网站下载最新的JDBC驱动程序http://otn.oracle.com/software/tech/java/sqlj_jdbc/content.html。
JDBC分为两大部分,一、开发接口,提供给程序开发人员必要的java"类"或"方法",开发接口包括下面两个包java.sql和javax.sql
二、实现接口,定义JDBC的规格与需求,主要是由Sun公司提供给关系型数据库系统厂商,各厂商可以遵循标准规格设计出最佳的JDBC驱动程序。
所以开发JDBC驱动程序的厂商是将各种API通过驱动程序的形式来实现;使用这些JDBC驱动程序的开发人员,则是利用API所提供的Java"类"与"方法"来开发数据库应用程序。


ODBC与JDBC两种驱动程序的差异
(1)ODBC是通过C语言接口,不适合java程序直接调用(ODBC的C语言API大量使用指针,易产生安全问题)
(2)可以将JDBC API想象成"高级的ODBC API面向对象版本"

JDBC驱动共分成4种
1、type-1 JDBC-ODBC bridge plus ODBC driver
JDBC-ODBC桥接驱动程序,其底层通过ODBC驱动程序来连接数据库,如果目的数据库未提供适当的JDBC驱动程序(如Access)可以考虑使用type-1 JDBC驱动程序,使用此类型JDBC驱动程序仍然可以为Oracle、DB2等数据库开发java应用程序,不需考虑数据库底层连接问题。
注意:利用JDBC-ODBC桥接驱动程序将跨过ODBC连接数据库,所以客户端必须先安装适当的ODBC驱动程序。
java应用程序会先从JDBC Driver Manager驱动JDBC驱动程序,再调用ODBC Driver Manager去驱动ODBC驱动程序连接至数据库

2、type-2 Native-API partly-Java driver
此种方式会先将JDBC函数调用转换成数据库客户端函数库的API(位于客户端计算机),然后与数据库相连。OracleSybaseDB2等可使用此种驱动程序,必须在客户端操作系统内安装特定软件。
3、type-3 JDBC-Net pure Java driver
Type-3 JDBC驱动程序采用"间接连接"方式。首先JDBC驱动程序会将JDBC函数调用解释成与数据库无关的网络通信协议,经过中介服务器的第二次解析,最后才转换成相对应的关系型数据库通信协议,后台数据库发生变化时,只需更换中介层与数据库之间的JDBC驱动程序。
4、type-4 Native-protocol pure Java driver
此类JDBC驱动程序会将JDBC调用直接转换为关系型数据库本身使用的通信协议,也就是说客户端java应用程序可直接与数据库建立连接,适合局域网环境所使用,因为各厂商数据库可能有专属的通信协议,所以Type-4驱动程序通常是由关系型数据库厂商提供的,如果更换了后端数据库,也必须更换后端数据库。

基本的JDBC类与接口
DriverManager类 管理各种数据库驱动程序,建立新的数据库连接,以便将Java应用程序对应至正确的JDBC驱动程序,DriverManager允许在内存内同时加载多个JDBC驱动程序,分别指向不同数据库。
Driver接口 可以用来建立数据库连接。通常需传入表示连接方式的URL字符串,然后返回一个Connection对象。
Connection接口 代表应用程序与数据库之间的连接阶段(session),它允许用户将SQL查询语句建立成特定语句(Statement),或是读取该连接阶段内数据库与JDBC驱动程序的相关信息。
Statement接口 编写要执行的SQL语句,又分为两类:PreparedStatement与CallableStatement
PreparedStatement接口 包含预先编译的SQL语句,可重复执行
CallableStatement接口 用来调用数据库的预存程序(Stored procedure)

Java应用程序通过JDBC存取数据库时应该遵循以下几个步骤
(1)加载(注册)适当的JDBC驱动程序
(2)建立数据库连接
(3)建立与执行JDBC语句
(4)处理结果集
(5)关闭数据库连接

(1)注册JDBC驱动程序的方法通常分为下列两种
1、使用Class.forName(),其语法为Class.forName(驱动程序名称);
如Oracle JDBC驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
上述操作只是向JVM注册,并没有建立一个实例对象,如果需要在程序中参照Driver对象,必须用new进行实例化。
如 Driver oracledry = new oracle.jdbc.driver.OracleDriver();
2、使用DriverManager.registerDriver()
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

(2)建立数据库连接
使用DriverManger.getConnection(),内部运行机制大致如下
1、前端应用程序调用DriverManager.getConnection(JDBC URL字符串),JDBC URL表示要连接的Oracle9i数据库。
2、先解析(parse)JDBC URL,然后查找系统内所有已注册的JDBC驱动程序,直到符合JDBC URL指定的通信协议为止,查找的原则是先从系统属性列表(properties list)开始,然后才查找内存内已注册的JDBC驱动程序。
3、找到DriverManager就会建立一个新的数据库连接,如果最后也没有找到合适的JDBC驱动程序,java应用程序则会抛出一个SQLException异常事件。
JDBC URL由三部分组成:主通信协议、次通信协议和数据源
连接SQL server 2000数据库可设URL为jdbc:odbc:MSSQL,其中主通信协议为jdbc,次通信协议为odbc,MSSQL为ODBC的DSN
连接Oracle,可能是jdbc:oracle:thin:@rich:1521:ora9201,其中oracle:thin为次通信协议,代表Oracle JDBC thin driver,数据源则是rich服务器上的Oracle9i数据库,其Oracle SID为ora9201

建立数据库连接有两种方式DriverManager.getConnection()与Driver.Connection()
假设rich主机的Oracle9i数据库SID为ora9201,监听器所激活的连接端口为1521,可以用下列命令建立连接(用scott登录,密码为tiger)
1、Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@rich:1521:ora9201","scott",tiger");
2、Driver drv = new oracle.jdbc.driver.OracleDriver();
Connection conn = null;
Properties props = new Properties();
props.setProperty("user","scott");
props.setProperty("password","tiger");
try{
conn=drv.connect("jdbc.oracle:thin:@rich:1521:ora9201",props);
}catch(SQLException e)
{
//如果无法建立连接,则进行异常事件处理
}

(3)建立与执行JDBC语句
建立新数据库连接以后,必须先建立一个Statement对象才能送出SQL语句
Statement stmt=conn.createStatement();
建立Statement对象之后可利用3种方式送出SQL语句
executeQuery(SQL语句)、executeUpdate(SQL语句)、execute(SQL语句)
如:ResultSet rset=stmt.executeQuery(SELECT * FROM emp);
如果要执行INSERTUPDATEDELETE或DDL语句,必须改用executeUpdate(),
如:stmt.executeUpdate("CREATE TABLE table"+"(no CHAR(10),name CHAR(10))");
或是String CreateTable_table1="CREATE TABLE table1"+"(no CHAR(10),name CHAR(10))";
stmt.executeUpadate(CreateTable_table1);
两种特殊的SQL命令执行方式
1、使用PreparedStatement
如果某个SQL语句必须重复执行建议使用PreparedStatement,PreparedStatement代表"预先编译的SQL语句"。
执行基本SELECT语句
PreparedStatement prepStmt = conn.prepareStatement("SELECT * FROM emp");
ResultSet rset=prepStmt.executeQuery();
利用WHERE来限制SELECT语句的查询结果
PreparedStatement prepStmt=conn.prepareStatement("SELECT * FROM emp WHERE ename=? ")
prepStmt.setString(1,"SCOTT"); //setString设置要传入的参数值,表示第一个参数是SCOTT
ResultSet rset = prepStmt.executeQuery();
执行UPDATE语句
PreparedStatement prepStmt=conn.prepareStatement("UPDATE emp SET sal = ? WHERE ename = ? ");
prepStmt.setInt(1,100000);
prepStmt.setString(2,"Rich");
prepStmt.executeUpdate();
2、使用CallableStatement用来调用Oracle9i数据库的"预存程序"(Stored procedure)
语法: CallableStatement 变量名=conn.prepareCall(call 预存程序名称);
如 CallableStatement callStmt=conn.prepareCall("{call update_salary(?,?)}");
callStmt.setInt(1,7788);
callStmt.setInt(2,10000);
callStmt.execute();

(4)处理结果集
如以while循环打印出ResultSet对象内所有记录
while(rs.next()){
System.out.println(rs.getInt(1)); //1、2表示各字段相对位置
System.out.println(rs.getString(2));
}

(5)关闭数据库连接,最后一个操作是关闭Connection、Statement、ResultSet等对象
try{
rs.close();
stmt.close();
con.close();
} catch(SQLException e){
e.printStackTrace();
}
[/more]

评论已关闭