ODBC和JDBC


ODBC:Open DataBase Connection

1.ODBC是什么

  ODBC是一种标准--不同语言的应用程序不同数据库服务器之间通讯的标准,可以配合很多高级语言来使用

2.ODBC的内容

  (1)一组API(应用程序接口),支持应用程序与数据库服务器的交互

  (2)应用程序通过调用ODBC API,实现

    1)与数据服务器的连接

    2)向数据库服务器发送SQL命令

    3)一条一条的提取数据库检索结果中的元组传递给应用程序的变量

  (3)具体的DBMS提供一套驱动程序,即Driver 库函数,供ODBC调用,以便实现数据库与应用程序的连接

3.应用程序如何通过ODBC连接一个数据库服务器

  (1)ODBC应用前,需要确认具体DBMS Driver被安装到ODBC环境中

  (2)当应用程序调用 ODBC API时,ODBC API 会调用具体DBMS Driver库函数,DBMS Driver库函数则与数据库服务端通讯,执行相应的请求动作并返回检索结果

  (3)ODBC应用程序首先要分配一个SQL环境,再产生一个数据库连接句柄

  (4)应用程序通过使用SQLConnect(),打开一个数据库连接,SQLConnect()的具体参数:

    1)connection handle,连接句柄

    2)the server,要连接的数据库服务器

    3)the user identifier,用户

    4)password,密码

    5)SQL_NTS类型说明前面的参数是空终止的字符串

  (5)举例

 1 int ODBCexample()
 2 {
 3     //分配数据库连接环境 
 4     RETCODE error;     //返回状态吗
 5     HENV env;    //环境变量 
 6     HDBC conn;    //连接句柄 
 7     SQLAllocEnv(&env);
 8     SQLAllocConnect(env,&conn);
 9     //打开一个数据库连接 
10     SQlConnect(conn,"aura.bell-labs.com",SQL_NTS,"avi",SQL_NTS,"avipasswd",SQL_NTS);
11     
12     {
13         ...Do actual work ...
14     } 
15     
16     //断开连接与释放环境 
17     SQLDisconnect(conn);
18     SQLFreeConnect(conn);
19     SQLFreeEnv(env);
20 }

4.应用程序如何通过ODBC与数据库服务器进行通讯

  (1)应用程序使用SQLExecDirect()函数向数据库发送SQL命令

  (2)使用SQLFetch()获取产生的结果元组

  (3)使用SQLBindCol()绑定C语言变量与结果中的属性

    1)当获取一个元组时,属性值会自动地传送到相应的C语言变量中

    2)SQLBindCol()的参数

    ODBC定义的stmt变量,查询结果中的属性位置

    SQL到C的类型变换,变量的地址

    对于类似字符数组一样的可变长度类型,应该给出

      a.变量的最大长度

      b.当获取一个元组后,实际长度的存储位置

      c.当返回的实际长度是负数时,说明是一个空值

5.ODBC的其他功能

  (1)动态SQL语句的预编译-动态参数传递功能

  (2)获取元数据特性

    1)发现数据库中的所有关系的特性

    2)发现每一个查询结果的列的名字和类型等

  (3)默认每一条SQL语句都被作为一个独立的能够自动提交的事务来处理

    1)应用程序可以关闭一个连接的自动提交特性

    2)有些事务要显式的给出提交和撤销的命令

JDBC:Java DataBase Connection

1.JDBC是什么?

  JDBC是一组Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接和通讯能力

2.JDBC API

  JDBC API分为两个程序包

  (1)Java.sql:核心API--使用java.sql.DriverManager类,java.sql.Driver和java.sql.Connection接口连接到数据库

  (2)javax.sql:可选扩展API--包含了JNDI的资源,以及管理连接池,分布式事务等,使用DataSource接口连接到数据库

3.JDBC的功能

  (1)核心API所包含的功能

    1)java.sql.DriverManager--处理驱动的调入并且对产生新数据库连接提供支持

    2)java.sql.Driver--通过驱动对数据库访问,连接到数据库的应用程序必须具有该数据库的特定驱动

    3)java.sql.Connection--代表对特定数据库的连接

    4)java.sql.Statement--对特定的数据库执行SQL操作

    5)java.sql.PreparedStatement--用于执行预编译的SQL语句

    6)java.sql.CallableStatement--用于执行对数据库内嵌过程的调用

    7)java.sql.ResultSet--从当前执行的SQL语句中返回结果数据

  (2)java自带的异常捕获及其处理

    Try(...) Catch(...)

4.应用程序使用 java api 访问数据库的过程

  (1)概念性的过程

    1)打开一个连接:创建“Statement”对象,并设置查询语句

    2)使用Statement对象执行查询,发送查询给数据库服务器和返回结果给应用程序

    3)处理错误的例外机制

  (2)实际过程

    1)传递一个Driver给DriverManager,加载数据库驱动  //Class.forName()

    2)通过URL得到一个Connection对象,建立数据库连接  //DriverManger.getConnection(sDBRrl) or DriverManger.getConnection(sDBUrl, sDBRserID, sDBPassword)

    3)创建一个Statement对象(PreparedStatement 或 CallableStatement),用来查询或修改数据库  //Satement stmt = con.createStatement     stmt是一个Statement类型的句柄

    4)查询返回一个ResultSet  //ResultSet rs = stmt.executeQuery(sSQL)

    5)错误捕获语句

  (3)更新操作Update to database

  (4)查询操作Execute query and fetch and print results

  (5)示例

 1 //Java 类
 2 public static void JDBCexample(String dbid, String userid, String passwd)
 3 {
 4     try{
 5         Class.forName("oracle.jdbc.driver.OracleDriver");
 6         Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@db.yale.edu:1521:univdb",userid,passwd);
 7         Statement stmt = conn.createStatement();
 8         try{
 9             stmt.executeUpdate("insert into instructor values('77978','Kim','Physics','98000')");
10         }catch(SQLException sqle){
11             System.out.println("Could not insert tuple."+sqle);
12         }
13         ResultSet rset = stmt.executeQuery("select dept_name, avg(salary)"+"from instructor group by dept_name");
14         while(rset.next())
15         {
16             System.out.println(rset.getString("dept_name")+""+rset.getFloat(2));
17         }
18         stmt.close();
19         conn.close();
20     }catch (SQLException sqle){
21         System.out.println("SQLException:"+sqle);
22     }    
23 } 

5.ODBC和JDBC比较

  (1)嵌入式SQL的思维模式:语句形式执行

    建立数据连接--声明一个游标--打开游标--获取一条记录--关闭游标--断开数据库连接

  (2)ODBC的思维模式:API函数形式执行

    建立数据库连接--分配语句句柄--用句柄执行SQL--建立高级语言变量与句柄属性的对应--获取一条一条的记录--释放语句句柄--断开数据库连接

  (3)JDBC的思维模式:对象形式执行

    建立数据连接--创建语句对象--用语句对象执行SQL,并返回结果对象--从结果对象获取一条一条记录--提取对象的属性值传给高级语言变量--释放语句对象--断开数据库连接

  (4)嵌入式SQL对数据库的访问

    用户<-->应用程序<-->数据库管理系统<-->操作系统

  (5)基于JDBC/ODBC的数据库访问

    用户<-->应用程序<-->通用编程接口(ODBC)<-->数据库管理系统<-->操作系统

    通用编程接口:使得不同数据库管理系统可以执行同一命令