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(); } |