1.02k likes | 1.3k Views
Java 高级应用. 文立玉. Java JDBC 编程. JDBC 技术概述 JDBC 的结构 JDBC 应用 数据库存取优化. L2.1 JDBC 技术概述 什么是 JDBC. JDBC 是一种用于执行 SQL 语句的 Java API Java 数据库连接 ( Java Database Connectivity , JDBC ) 它由一组用 Java 编程语言编写的类和接口组成 JDBC API 是作为 Java 2 标准版( J2SE )和 Java 2 企业版( J2EE )平台的一个关键部分出现的。
E N D
Java高级应用 文立玉
Java JDBC编程 JDBC技术概述 JDBC的结构 JDBC应用 数据库存取优化
L2.1 JDBC技术概述什么是JDBC • JDBC • 是一种用于执行 SQL 语句的 Java API • Java 数据库连接(Java Database Connectivity,JDBC) • 它由一组用 Java 编程语言编写的类和接口组成 • JDBC API • 是作为 Java 2 标准版(J2SE)和 Java 2 企业版(J2EE)平台的一个关键部分出现的。 • 它是一种主要的基于标准的机制,能让 Java 语言通过编程来访问关系数据库。
L2.1 JDBC技术概述 • JDBC是Java程序连接和存取数据库的应用程序接口(API),此接口是Java核心API的一部分。JDBC向应用程序开发者提供了独立于数据库的统一的API。JDBC是由一组驱动程序实现的Java接口,驱动程序负责从标准JDBC调用向支持的数据库所需要的具体调用转变。除了向开发者提供统一的独立于DBMS之外的框架,JDBC还提供了让开发者保持数据库厂家提供的特定功能的办法。
将Java语言和Sql结合的一个很好的编程接口。 • 通用的一般的SQL数据库访问和存储结构。 • 支持基本SQL功能的一个通用低层的应用程序编程接口,在不同的数据库功能模块上提供了一个统一的用户界面。 • ODBC一样,建立在X/Open SQL CLI基础之上。 • 是为Java语言定义的一个SQL调用级(CLI)界面。
JDBC的特点 • 在SQL水平上的API 为Java语言定义的一个sql调用级界面,其中心在于执行 基本的SQL 声明和取回结果。在此基础上可以定义更高层次的API • 与SQL的一致性 • JDBC允许使用从属于DBMS的系统的任何查询语句,一个应用程序可以尽可能的使用SQL功能。 • 用户至少使用ANSI SQL 92 entry level标准 • 可在现有的数据库接口之上实现 • 比如可以在ODBC之上实现
JDBC的特点 • 提供与其他Java系统一致的java界面 • 简单易行,最大可能简单化 • 使用健壮、静态的通用数据类型。 • 使一般情形简单化 • 多种方法、多种功能
JDBC的任务 (1) 与一个数据库建立连接(2) 向数据库发送SQL语句(3) 处理数据库返回的结果
JDBC的两种主要接口 JDBC主要有两种接口,分别是面向程序开发人员的JDBC API和面向底层的JDBC DRIVER API. JDBC API使用一系列抽象的接口,它使得应用程序员能够进行数据库连接,执行SQL声明,并且得到返回结果 . JDBC Driver API是面向驱动程序开发商的编程接口,对于大多数数据库驱动程序来说,仅仅实现JDBC API提供 的抽象的类就可以了.
Java 应用程序 JDBC API JDBC Manager JDBC Drvier API JDBC-Net Driver JDBC-ODBC Bridge Driver Driver A Driver B 。。。 ODBC and DB Driver Pulblished protocol Proprietary Database access protocol
JDBC API 是一系列的接口,他使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。
L2.2 JDBC 的结构 • Java.sql.DriverManager用来装载驱动程序,并且为创建新的数据库联接提供支持。 • Java.sql.Connection完成对某一指定数据库的联接 • Java.sql.Statement在一个给定的连接中作为SQL执行声明的容器,他包含了两个重要的子类型。 • Java.sql.PreparedSatement用于执行预编译的sql声明 • Java.sql.CallableStatement用于执行数据库中存储过程的调用 • Java.sql.ResultSet对于给定声明取得结果的途径
JDBC Driver interface • 是面向驱动程序开发商的接口,每一个驱动程序都必须提供对于 • java.sql.Connection, java.sql.Statement, java.sql.PreparedStatement , java.sql .ResultSet等主要接口的实现方法。 • Java.sql.DriverManager需要装载驱动程序时,每个驱动程序需要提供一个能实现java.sql.Driver接口的类。 例如:sun.jdbc.odbc.JdbcOdbcDriver com.microsoft.jdbc.sqlserver.SQLServerDriver
JDBC API使用一系列抽象的接口: 1.java.sql.DriverManager:用来处理装载驱动程序并且为创建新的数据库连接提供支持. 2.java.sql.Connection:完成对一指定数据库连接的功能. 3.java.sql.Statement:在一个给定的连接中作为SQL执行声明的容器,他包含了两个重要的子类型. 4.java.sql.PreparedStatement:用于执行,编译的SQL声明. 5.java.sql.CallableStatement:用于执行数据库中存储的过程的调用.6.java.sql.ResultSet:控制对于某一给定声明取得结果列的途径.
JDBC可以不依赖于网络环境来工作 • Java成为编写世界级应用程序的一个最合适的语言平台,JDBC起了关键作用。 • JDBC允许Applet,Servlet程序以及独立的应用程序以通用的方式访问在RDBMS中的数据
JDBC提供一个标准的库,用以访问关系数据库. • 利用一个单独的标准的API(JDBC API)建立连接,不用考虑DBMS • JDBC的API类库位于 java. sql 包中 • JDBC不是嵌入式结构化查询语言 • JDBC API 不是标准的SQL语法 • JDBC API已经成为了许多不同API(如JNDI、JTS、JavaBeans)之间提供交互操作性能的核心 • 数据库已经不再是应用程序的数据源 • 数据库更大意义是为Java对象提供持续的服务。
安全性问题 java作为网络应用就相应的需要考虑安全性问题. • 在Java application这种使用方法下,Java的代码是本地的,因此是可信任的.同样出于安全性考虑,可信任的applet也可归为此类。 • 相反,如一个Java的applet是不可信任的,就不能允许存取本地机上的文件或是其它网络数据.
安全性问题 1)JDBC和不可信任的applets JDBC必须遵守标准的applet 的安全模式。 * JDBC必须保证普通的无标志的applet是不可信任的. * JDBC将不允许不可信任的applet存取本地的数据库系统的数据. * 如果下载了一个已向JDBC DriverManager注册的JDBC驱动程序,那么只有与该驱动程序从同一服务器上下载的代码中提出的连接要求,JDBC才能利用驱动程序来进行连接。 * 一个不可信任的applet通常只能对他所下载的服务器进行数据库连接。 * 在与远程数据库服务器进行连接时,JDBC应当避免自动或是盲目使用本地机上的私有信息。
安全性问题 2) JDBC和Java的应用程序(包括除不可信任的applet外的所有Java代码)。JDBC将很迅速的从本地路径上装载驱动程序,并且允许应用程序自由存取文件的远程服务器等,而对于applet来说,如果从一个远程服务器上下载一个不可信任的sun.sql.Driver类,那么这个Driver只能于从同一源服务器上下载的代码一起使用。 3) 网络的安全性:对于JDBC的用户来说,有关数据库操作的安全性以及在网络上尤其是在Internent上数据的传输问题也是一个很重要的值的考虑的问题.
在线资源 • Sun’s JDBC Site • http:// java. sun. com/ products/ jdbc/ • JDBC Tutorial • http:// java. sun. com/ docs/ books/ tutorial/ jdbc/ • List of Available JDBC Drivers • http:// industry. java. sun. com/ products/ jdbc/ drivers/ • API for java. Sql • http:// java. sun. com/ j2se/ 1.3/ docs/ api/ java/ sql/package- summary. html
JDBC的基本特征 • 调用级SQL接口 • JDBC是一个Java语言在客户机上使用的调用级接口 • JDBC完全独立于多种DBMS • JDBC是一个低级的应用程序编程接口 • 允许Java程序发出SQL语句并获取结果 • 同时也提供了管理和警告的方法 应用程序 DBMS mydb JDBC代码
JDBC的基本特征 • 与SQL的一致性 • JDBC允许使用属于DBMS的任何查询语句 • 支持ANSI SQL-92 Entry level标准 • 可以使用尽可能多的SQL功能 • 一致的API • JDBC使用健壮、静态的数据类型 • 方便、简单
JDBC组件 • JDBC连接数据库的典型结构通常由4个必要组件定义 • 应用程序 • 驱动程序管理器 • 驱动程序 • 数据源
JDBC组件——驱动程序 • JDBC 驱动程序可分为以下四类: • JDBC-ODBC 桥加 ODBC 驱动程序 • 本地 API - 部份用 Java 来编写的驱动程序 • JDBC 网络纯 Java 驱动程序 • 本地协议纯 Java 驱动程序
JDBC驱动程序分为以下四类 JDBC-ODBC 桥加 ODBC 驱动程序——驱动程序把JDBC转换成ODBC驱动器,靠ODBC驱动器和数据库通信。 Sun公司在JDK中提供了这样的一个驱动器:Java/JDBC网桥。使用JDBC-ODBC桥必须正确部署和配置一个ODBC驱动程序。我们不赞成使用它开发产品(目前,JDBC/ODBC网桥只有在Solaris操作平台和Windows上运行) JDBC-ODBC驱动程序 Java ODBC驱动程序 本地驱动程序 非Java 网络驱动程序 JDBC组件——驱动程序
JDBC驱动程序分为以下四类 本地 API - 部份用 Java 来编写的驱动程序——驱动程序的源代码由两部分组成:一部分是Java语言代码,另一部分是本地代码。这类驱动程序和一个数据库客户的API通信。当你使用这类驱动程序时,除了Java库外还必须安装能在指定平台上运行的代码。 JDBC驱动程序 Java 本地驱动程序 非Java 网络驱动程序 JDBC组件——驱动程序
JDBC驱动程序分为以下四类 JDBC 网络纯 Java 驱动程序——这种驱动程序将 JDBC 转换为与 DBMS 无关的网络协议,之后这种协议又被某个服务器转换为一种 DBMS 协议。这种网络服务器中间件能够将它的纯 Java 客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。 JDBC-网络驱动程序 Java JDBC组件——驱动程序
JDBC驱动程序分为以下四类 本地协议纯 Java 驱动程序——驱动程序是一个纯Java客户库,它使用一个独立于数据库的协议,把数据库请求传送给一个服务器组件,这个组件把数据库请求转换成指定数据库协议接收的请求。这种类型的驱动程序将 JDBC 调用直接转换为DBMS 所使用的网络协议。这将允许从客户机机器上直接调用 DBMS 服务器,是 Intranet 访问的一个很实用的解决方法。 JDBC驱动程序在Java中实现一项专用协议 Java JDBC组件——驱动程序
大部分数据库厂商给它们的数据库提供第三类或第四类驱动程序。大部分数据库厂商给它们的数据库提供第三类或第四类驱动程序。 JDBC的最终目的是实现下列目标: 程序员可以用Java编程语言开发这类应用程序,它在遵守Java语言规则的同时,可以用标准的SQL语句(或SQL某一扩展语句)访问任何数据库(所有JDBC驱动程序必须至少支持SQL92的初版) 数据库厂商和数据库工具厂商能提供较低层的驱动程序,这样她们可以在自己的产品中使用优化的驱动程序。 JDBC组件——驱动程序
JDBC组件——数据源 • 数据源 • 由用户应用程序想访问的数据源和自身参数组成 JDBC接口 Java应用程序 JDBC管理器 JDBC驱动程序接口 JDBC网络驱动程序A JDBC-ODBC桥 JDBC驱动程序C JDBC驱动程序D ODBC驱动程序B 原始驱动程序C 原始驱动程序C 数据源A 数据源B 数据源C 数据源D
JDBC中SQL消息和结果集 • SQL消息和结果集 mydb DBMS 语句 客户端 结果集
L2.3 JDBC的应用 • 应用JDBC的七个基本步骤 • 常用的JDBC API • 事务
应用JDBC的七个基本步骤 • 1. 装载驱动程序 • 2. 定义连接的URL • 3. 建立连接关系 • 4. 创建一个Statement 对象 • 5. 执行一个查询 • 6. 处理结果集 • 7. 关闭连接
Step1——装载驱动程序 • 装载驱动程序 • 应用Class类的forName()方法注册JDBC-ODBC桥驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 注册Oracle数据库厂商提供的JDBC驱动程序 Class.forName("oracle.jdbc.driver.OracleDriver");
Step2——定义连接的URL • 定义连接的URL • JDBC URL • 是提供识别数据库的途径的字符串 • JDBC URL分三部分<协议>:<子协议>:<子名>jdbc:subprotocol name:other_stuff • 在JDBC URL中,<协议>总是jdbc; • <子协议>是驱动程序的名字或一种数据库连通机制的名字 如果检索数据的机制是ODBC-JDBC桥驱动程序子协议必须是odbc • <子名>用于确定数据库 other_stuff(子名)参数的格式取决于使用的子协议。Sun建议:如果网址是other_stuff参数的一部分,最好用标准URL命名形式://hostname:port/other
定义连接的URL URL jdbc:mydbdrv://www.mydomain.net:8192/mydb JDBC www.mydomain.net JDBC port:8192 mydb
定义连接的URL • 例1 String url = "jdbc:odbc:MyDataSource"; 这个url表示用JDBC/ODBC网桥访问一个名为MyDataSource的ODBC源数据库。 • 例2 String url =“jdbc:oracle:thin:@172.18.0.26:1521:ORCL”; 这个url表示用Oracle数据库厂商提供的一个纯Java库驱动程序,直接把JDBC请求转换成指定数据库协议接收的请求。
Step3——建立连接关系 • 建立连接关系 • 驱动程序将在URL中寻找已登记的JDBC驱动程序,以使与指定的数据源建立连接。(注:也有其它方法) • Connection对象 • java.SQl.Connection • 表示和数据库的连接 • 在应用程序中可有多个连接对象连接到一个或多个数据库 • getConnection()方法 • 初始化Connection对象,如:String url = "jdbc:Odbc:MyDatasource";Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");connection con = DriverManager.getConnection(url);
应用案例 ■使用协议是JDBC ■ 使用的驱动程序是JDBC-ODBC 桥 ■ODBC数据源是mysource ■ 用户名是javauser ,密码是hotjava String URL = "jdbc:odbc:mysource" String username = "javauser"; String password = "hotjava"; Try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection connection =DriverManager.getConnection(URL,username,password); //…… connect.close() }catch(Exception e){ System.out.println("A problem occrued during the establish of the connection" + e) }
Step4——创建一个Statement 对象 • 创建一个Statement 对象 • 用Satement对象发送简单查询给数据库 • 创建语法 Statement statement = connection.createStatement(); • 用connection对象的createStatement()方法创建Statement对象
Step5——执行一个查询 • 执行一个查询 • 用Statement对象的executeQuery()方法执行一个简单的查询 • 编辑数据库时,可使用Statements对象的executeUpdate()方法 , 执行带 UPDATE , INSERT 或 DELETE 的SQL语句 • Statements对象的execute()方法执行一个SQL语句,可能返回多个结果 • 使用Statements对象的setQueryTimeout()方法,设置获得结果的最大延迟时间。 String query = "SELECT col1, col2, col3 FROM sometable"; resultSet result = statement. executeQuery(query);
Step6——处理结果集 • 处理结果集 • 结果集由数据行组成,可以在一个循环中使用resultSet.next()方法来访问并获取每行数据 • 一个结果集维持一个指向当前行的指针 • 最初这个指针指向第一行之前,所以需调用resultSet.next()方法访问第一行,然后再进行处理 • 连续调用next()方法将使指针依次指向结果集各行 • 当没有下一行时,返回值是false。 第一列的序号为1而不是0 resultSet.next(); ==== ===== ====== ======== ===== ====== ======== ===== ====== ======== ===== ====== ======== ===== ====== ==== 数据行 结果集
处理结果集 • 代码样例——获得行信息 while( resultSet.next()){ System.out.println( resultSet.getString(1) + " "+ resultSet.getString(2) + " " + resultSet.getString(3)); }
处理结果集 • 使用Metadata方法获得关于列和数据类型信息 • 因为组成基本表的某一行,可能由许多不同类型的列组成。 • 获得列数 int colNum = getMetaData().getColumnCount(); • 获得列名 String colName = getMetaData().getColumnLabel(int i);
处理结果集——访问列 • java.sql 中的接口 ResultSetMetaData • 可以利用一个列索引或列名循环来获得ResultSetMetadata对象中的列
处理结果集——访问列 • 通过getXXX()方法,可释放包含在结果集列中的值,以便访问行的内容
处理结果集——访问列 • getXXX()方法的两种形式 • 通过列索引访问 getXXX(int columnIndex) • 通过列名访问 getXXX(String columnName) java.sql Interface ResultSet java.sql.* java.io.*
处理结果集——更新数据库 • 包括修改,更新和删除记录,创建和删除表,以及增加和删除列.对应于数据库的insert,update ,delete,create,drop等. • 对数据库的更新操作也是通过Statement对象完成的. • 不使用executeQuery()方法,使用executeUpdate()方法. • executeUpdate的返回值是它影响的记录的行数.
处理结果集——更新数据库 • 例如 • String sql=“update Customer set address =‘Peking’ where lastname=‘Li’” • int i=Stmt.executeUpdate(sql) • 返回更新的行数.
Step7——关闭连接 • 关闭连接 connection. close();