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)<-->数据库管理系统<-->操作系统
通用编程接口:使得不同数据库管理系统可以执行同一命令