一、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:语句形式执行

  1. 建立数据库连接
  2. 声明游标
  3. 打开游标
  4. 将高级语言变量与结果集合的属性相绑定
  5. 访问检索记录集
  6. 关闭游标
  7. 断开数据库连接

②ODBC:API形式执行,所有对数据库的操作都变成了一个个函数,通过调用函数来让DBMS执行SQL语句

  1. 建立数据库连接
  2. 分配语句句柄
  3. 用句柄执行SQL
  4. 建立高级语言变量与句柄属性的对应
  5. 访问检索记录集
  6. 释放语句句柄
  7. 断开数据库连接

③JDBC:API形式执行,以语句对象为中心

  1. 建立数据库连接
  2. 创建语句对象
  3. 用语句对象执行SQL,并返回结果对象
  4. 从结果对象中提取检索记录集,并将对象的属性值传给高级语言变量
  5. 释放语句对象
  6. 断开数据库连接

四、基于ODBC/JDBC的数据库访问

1. 没有ODBC/JDBC的数据库访问:不同DBMS的嵌入式SQL语句不同,应用程序员编写的DBAP可能只适用于某一个DBMS

2. 基于ODBC/JDBC的数据库访问:ODBC/JDBC提供了统一的API,让应用程序员以对象为单位操纵数据库

第16讲:ODBC&JDBC简介的更多相关文章

  1. JDBC与ORM发展与联系 JDBC简介(九)

    概念回顾 回顾下JDBC的概念: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  2. JavaWeb技术(一):JDBC简介

    一.  JDBC简介 1. Java Database Connectivity(JDBC) 使用JDBC可以对数据库进行访问 2. JDBC的核心接口 1)DriverManager 驱动管理器接口 ...

  3. 第16讲- UI组件之TextView

    第16讲 UI组件之TextView Android系统所有UI类都是建立在View和ViewGroup这两类的基础上的. 所有View的子类称为widget:所有ViewGroup的子类称为Layo ...

  4. JDBC设计理念浅析 JDBC简介(一)

    概念 JDBC是J2EE的标准规范之一,J2EE就是为了规范JAVA解决企业级应用开发制定的一系列规范,JDBC也不例外. JDBC是用于Java编程语言和数据库之间的数据库无关连接的标准Java A ...

  5. JDBC驱动程序注册 JDBC简介(二)

    使用JDBC进行数据库操作的第一步就是驱动注册(当然你得先导入JAR). 驱动注册有多种方式,第一步必然是获得正确的驱动名称与URL格式 驱动名称与URL格式 RDBMS 驱动程序名称        ...

  6. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  7. Connection 对象简介 方法解读 JDBC简介(四)

    通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接     Connection conn = DriverManager.getConnection ...

  8. 执行对象Statement、PreparedStatement和CallableStatement详解 JDBC简介(五)

    执行对象是SQL的执行者,SQL是“安排好的任务”,执行对象就是“实际工作的人”. 执行对象有三种: Statement.PreparedStatement和CallableStatement,他们都 ...

  9. JDBC 异常简介 jDBC简介(六)

    SQL 异常简介 对于数据库的操作访问,必然也很可能抛出异常. JDBC中定义了SQLException,用于描述数据库相关操作中可能出现的异常情况. java.sql.SQLException    ...

随机推荐

  1. QT总结

    作为一个QT(C++/linux/windows)开发工程师,把自己在工作中遇到的一些QT问题持续总结给大家,一起分享: 一.隐藏鼠标:QApplication::setOverrideCursor( ...

  2. FreeRTOS临界保护

    下面的是个人笔记,所有的话都适用于我本人理解,可能存在不对的地方. 进入临界保护(支持嵌套):taskENTER_CRITICAL(); 退出临界保护(支持嵌套):taskEXIT_CRITICAL( ...

  3. 008.MongoDB分片群集概念及原理

    一 MongoDB分片介绍 1.1 分片 Mongodb另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足 ...

  4. 【cf1272】F. Two Bracket Sequences

    传送门 题意: 给出\(s,t\)两个合法括号序列,现在找到一个长度最小的合法的序列\(p\),使得\(s,t\)都为其子序列. 思路: 考虑\(dp:dp[i][j][d]\)表示第一个串在\(i\ ...

  5. 6.jenkins构建任务3-java项目

    java项目 部署java的maven项目 1.检查插件,新版的jenkins默认就会安装  maven的插件 没有的话手动安装一下. Maven Integration plugin 2.安装环境 ...

  6. 冒泡排序和sort,sorted排序函数

    冒泡: # 轮数 元素个数 比较次数# 1 6 5# 2 5 4# 3 4 3# 4 3 2# 5 2 1 # 列表有n个元素,则应比较n-1轮,即循环次数n-1 a=[85,7,4,89,34,2] ...

  7. LeetCode 1248. 统计「优美子数组」

    地址 https://www.acwing.com/solution/leetcode/content/5801/ 题目描述给你一个整数数组 nums 和一个整数 k. 如果某个子数组中恰好有 k 个 ...

  8. MYSQL高可用集群架构-MHA架构

    1  MHA简介:MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司 ...

  9. SQL Server 约束的增删改

    1. 非空约束 列的为空性决定表中的行是否可以包含空值.空置(NULL)不同于零(0)/空白或者长度为零的字符串(“”). (1)创建非空约束 create table orders ( docent ...

  10. Java 集成速卖通开发.

    一.申请成为开发者 申请入口:http://isvhz.aliexpress.com/isv/index.htm 说明文档:http://activities.aliexpress.com/open/ ...