第16讲:ODBC&JDBC简介
一、ODBC简介
1. ODBC的概念
①ODBC:Open DataBase Connection,即开放数据库连接
②ODBC是一种标准,它规定了不同语言的应用程序与不同数据库服务器之间通讯的方式
③ODBC包含一组API,用于实现应用程序与数据库服务器的交互,应用程序通过调用API,完成下列功能:
- 连接数据库服务器
- 向数据库服务器发送SQL命令
- 一条一条地提取数据库检索结果中的元组,并传递给应用程序中的变量
④具体的DBMS提供一套驱动程序(Driver库函数),供ODBC调用,以便实现应用程序与数据库的连接
⑤ODBC可以配合许多高级语言来使用,如C、C++、C#、Visual Basic、Power-Builder等
2. ODBC在数据库系统中扮演哪种角色
①有了ODBC,应用程序员编写DBAP时就无需针对特定的DBMS,因为ODBC对应用程序员提供了统一的接口
②对于不同的DBMS,ODBC通过不同的驱动程序(Driver库函数)将程序员的代码解释成各DBMS可以理解的SQL语句
③当应用程序调用ODBC API时,ODBC API会调用具体DBMS Driver库函数,DBMS Driver库函数则与数据库服务器通讯,执行相应的请求动作并返回检索结果
3. 应用程序如何通过ODBC连接到数据库服务器
①ODBC应用前,需要确认具体DBMS Driver被安装到ODBC环境中
②ODBC应用程序首先要分配一个SQL环境,再产生一个数据库连接句柄
③应用程序使用SQLConnect(),打开一个数据库连接,SQLConnect()的具体参数如下:
- connection handle:连接句柄
- the server:要连接的数据库服务器
- the user identifier:用户
- password:密码
- SQL_NTS类型说明前面的参数是空终止的字符串
/* 分配数据库连接环境 */ RETCODE error; // 返回状态码 HENV env; // 环境变量 HDBC conn; // 连接句柄 SQLAllocEnv(&env); SQLAllocConnect(env, &conn); /* 打开一个数据库连接 */ SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS, "avipassword", SQL_NTS); /* 与数据库通讯 */ // ... // ... /* 断开连接与释放环境 */ SQLDisconnect(conn); SQLFreeConnect(conn); SQLFreeEnv(env);
4. 应用程序如何通过ODBC与数据库服务器进行通讯
①应用程序使用SQLExecDirect()向数据库发送SQL命令
②应用程序使用SQLFetch()获取产生的结果元组
③应用程序使用SQLBindCol()绑定C语言变量与结果中的属性:当获取一个元组时,属性值会自动地传送到相应的C语言变量中
④SQLBindCol()的参数包含:
- ODBC定义的stmt变量,查询结果中的属性位置
- SQL到C的类型变换,变量的地址
- 对于类似字符数组一样的可变长度类型,应给出①变量的最大长度;②当获取到一个元组后,实际长度的存储位置
char branchname[80]; float balance; int lenOut1, lenOut2; /* 分配一个与指定数据库连接的新的语句句柄 */ HSTMT stmt; SQLAllocStmt(conn, &stmt); /* 执行查询,stmt句柄指向结果集合 */ char *sqlquery = "select branch_name, sum (balance) from account group by branch_name"; error = SQLExecDirect(stmt, sqlquery, SQL_NTS); if (error == SQL_SUCCESS) { //绑定高级语言变量与stmt句柄中的属性 SQLBindCol(stmt, 1, SQL_C_CHAR, branchname, 80, &lenOut1); SQLBindCol(stmt, 2, SQL_C_FLOAT, &balance, 0, &lenOut2); //提取一条记录,结果数据被存入高级语言变量中 while (SQLFetch(stmt) >= SQL_SUCCESS) { printf(" %s %g\n", branchname, balance); } } /* 释放语句句柄 */ SQLFreeStmt(stmt, SQL_DROP);
5. ODBC具备的其他功能
①动态SQL语句的预编译-动态参数传递功能
②获取元数据特性:发现数据库中的所有关系的特性以及发现每一个查询结果的列的名字和类型等
③默认每一条SQL语句都被作为一个独立地能够自动提交的事务来处理
- 应用程序可以关闭一个连接的自动提交特性:SQLSetConnectOption(conn, SQL_AUTOCOMMIT, 0)
- 此时事务就需要显式地给出提交和撤消的命令:SQLTransact(conn, SQL_COMMIT/ROLLBACK)
二、JDBC简介
1. JDBC的概念
①JDBC:Java DataBase Connection
②JDBC是一组Java版本的API,规定了Java应用程序与数据库服务器之间通讯的方式
③JDBC API分为两个程序包
- java.sql 核心API:J2SE的一部分,使用java.sql.DriverManager类、 java.sql.Driver类和java.sql.Connection接口连接到数据库
- java.sql 可选扩展API:J2EE的一部分,包含了基于JNDI的资源,以及管理连接池、分布式事务等,使用DataSource接口连接到数据库
2. JDBC的核心类
- java.sql.DriverManager:处理驱动的调入并且对产生新数据库连接提供支持
- java.sql.Driver:通过驱动进行数据库访问,连接到数据库的应用程序必须具备该数据库的特定驱动
- java.sql.Connection:代表对特定数据库的连接
- java.sql.Statement:对特定的数据库执行SQL语句
- java.sql.PreparedStatement:用于执行预编译的SQL语句
- java.sql.CallableStatement:用于执行对数据库内嵌过程的调用
- java.sql.ResultSet:从当前执行的SQL语句中返回结果数据
- try{...} catch{...}:异常捕获及其处理
3. Java程序使用JDBC API访问数据库的过程
概述:打开一个连接;创建Statement对象,并设置查询语句;使用Statement对象执行查询,发送查询给数据库服务器和返回结果给应用程序。
①加载数据库驱动,传递一个Driver给DriverManager
- Class.forName()
②建立数据库连接,通过URL得到一个Connection对象
- DriverManager.getConnection(sDBUrl)
- DriverManager.getConnection(sDBUrl,sDBUserID,sDBPassword)
③查询或修改数据库,创建一个Statement对象
- Statement stmt=con.createStatement()
④查询返回一个ResultSet
- ResultSet rs=stmt.executeQuery(sSQL)
/* 加载数据库驱动,并建立数据库的连接 */ Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@db.yale.edu:1521:univdb", userid, passwd); /* 创建一个Statement对象 */ Statement stmt = conn.createStatement(); /* 与数据库通讯 */ // ... // ... /* 关闭Statement对象,关闭连接 */ stmt.close(); conn.close(); /* 查询与更新语句 */ ResultSet rset = stmt.executeQuery("select dept_name, avg(salary) from instructor group by dept_name"); while(rset.next()){ System.out.println(rset.getString(dept_name) + " " + rset.getFloat(2)); } stmt.executeUpdate("insert into instructor values('77987', 'Kim', 'Physics', 98000)");
三、嵌入式SQL & ODBC & JDBC 在执行SQL语句上的异同
1. 执行过程
①嵌入式SQL:语句形式执行
- 建立数据库连接
- 声明游标
- 打开游标
- 将高级语言变量与结果集合的属性相绑定
- 访问检索记录集
- 关闭游标
- 断开数据库连接
②ODBC:API形式执行,所有对数据库的操作都变成了一个个函数,通过调用函数来让DBMS执行SQL语句
- 建立数据库连接
- 分配语句句柄
- 用句柄执行SQL
- 建立高级语言变量与句柄属性的对应
- 访问检索记录集
- 释放语句句柄
- 断开数据库连接
③JDBC:API形式执行,以语句对象为中心
- 建立数据库连接
- 创建语句对象
- 用语句对象执行SQL,并返回结果对象
- 从结果对象中提取检索记录集,并将对象的属性值传给高级语言变量
- 释放语句对象
- 断开数据库连接
四、基于ODBC/JDBC的数据库访问
1. 没有ODBC/JDBC的数据库访问:不同DBMS的嵌入式SQL语句不同,应用程序员编写的DBAP可能只适用于某一个DBMS
2. 基于ODBC/JDBC的数据库访问:ODBC/JDBC提供了统一的API,让应用程序员以对象为单位操纵数据库