[工学]JAVA程序设计第12章.ppt_第1页
[工学]JAVA程序设计第12章.ppt_第2页
[工学]JAVA程序设计第12章.ppt_第3页
[工学]JAVA程序设计第12章.ppt_第4页
[工学]JAVA程序设计第12章.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章 数据库与JDBC编程,12.1 JDBC概述 在介绍JDBC前,先来介绍一下ODBC(Open Database Connectivity,开放数据库连接)。ODBC是微软开发的一种技术,允许访问Windows平台(以及一些UNIX平台)上的完全不同的数据库系统。,JDBC是用于执行SQL语句的Java API,它由一系列Java 语言编写的类和接口组成。它的作用是向数据库发送SQL语句,对数据库进行各种操作。JDBC是一种Java程序与数据库之间的接口,它是建立在ODBC的理论基础上。因此,熟悉ODBC的程序员将发现JDBC很容易使用。 JDBC与ODBC相比有以下优点: (1) 易于使用:ODBC由C语言编写,很复杂。而JDBC由面向对象是Java语言编写,易于使用。,(2) 良好的移植性:而JDBC由纯Java代码编写,所以JDBC编写的程序具有跨平台的特点。 (3)安全性:JDBC编写的程序运行在Java虚拟机上具有很高的安全性。 12.2 JDBC 驱动程序的类型 JDBC 驱动程序可分为以下四个种类: (1)JDBC-ODBC桥接 通过JDBC-ODBC桥连接,开发者可以很容易的使用JDBC来访问一个ODBC数据源。该驱动的使用要求将每个客户机上都要安装ODBC驱动,同时还要求配置ODBC数据源。这种连接方式虽然简单但是效率很低,实际的开发过程中通常不建议使用。它的实现原理如图12.2。,(2)部分Java,部分本地驱动 在这种驱动方式下,JDBC驱动将标准的JDBC调用转为对数据库API的本地调用。它比第一种驱动方式要快。 (3)JDBC网络纯Java驱动程序 这种驱动程序接受JDBC请求,并把它们转换成一个与DBMS无关的网络协议。这些请求发送到服务器,由服务器把这些数据库请求转换成DBMS特有的协议。此类驱动程序很适合Internet应用。因为它不需要客户端安装数据库驱动程序,而且该类型的驱动程序是跨平台的。,(4)本地协议纯Java驱动程序 这种类型的驱动程序将JDBC请求直接转换为DBMS所使用的网络协议。这将允许从客户机上直接调用DBMS服务器。由于许多这样的协议都是专用的,因此数据库提供者是这类驱动程序的主要来源,如Oracle和SQL Server等DBMS都有自己的驱动程序,该类驱动原理如图12.3;,实现第 3、4 类驱动程序将成为JDBC访问数据库的首选方法,但它们要求服务器端安装特有的JDBC驱动程序。而JDBC-ODBC桥接的方式可以通过ODBC驱动访问绝大部分数据库,但这种方式要牺牲数据库连接的性能。所以实际开发中通常不使用桥接的方式,但在没有特定的数据库本地驱动时,可以使用桥接的方式连接。 12.3 JDBC URL,JDBC URL提供了一种标识数据库的方法,它的作用是使程序员编写的程序能找到相应的数据库驱动程序并进行连接。实际上,JDBC驱动程序的编程员将决定用什么JDBC URL来标识特定的驱动程序,而使用JDBC驱动程序的程序员不必关心如何来形成JDBC URL,他们只须知道URL的格式就可以了。 JDBC URL的标准语法如下所示。它由三部分组成,各部分间用冒号分隔: jdbc: JDBC URL中的协议总是jdbc。 子协议为驱动程序名或数据库连接机制(这种机制可由一个或多个驱动程序支持)的名称。子协议名的典型示例是 “odbc“,该名称是用于指定连接ODBC数据源。,子名称的作用是为定位数据库提供足够的信息。如果数据库存放在网络中的主机上,则要JDBC根据相应的驱动程序,设置对应的URL。 例如,通过JDBC-ODBC桥来访问某个数据库,可以用如下所示的 URL: jdbc:odbc:test 此URL的子协议为 “odbc“,子名称为“test“ 。”test”是本地ODBC数据源名,它是由JDBC程序开发人员在数据库端建立并设置的。 下面给出三个常用的JDBC URL: (1)桥接方式连接的URL,jdbc:odbc:datasource / datasource为数据源名 (2)本地驱动连接SQLServer2000的URL jdbc:microsoft:sqlserver:/:1433;DatabaseName=pubs / pubs为数据库名 (3)本地驱动连接Oracle的URL jdbc:oracle:thin:localhost:1521:orcl /orcl为数据库的SID,12.4 JDBC中主要的类和接口 在介绍JDBC的对象接口前,先引入一个JDBC访问Access数据库的例子。此例题采用数据库驱动的第一种JDBC-ODBC桥接的方式连接,实现这种方式要分3步: l 建立数据库和数据表 l 建立数据源 l 编写Java代码通过JDBC-ODBC桥访问数据库 首先,打开Access,点击“文件”菜单栏下的“新建”,建一个空“数据库”。输入数据库名,建立一个名为“TestJDBC”的数据库。点击生成的对话框中的“使用设计器创建表”来生成一个新的数据表,名为“TestStudent”,具体字段见表12.2:,表12.2 TestStudent表结构,表中的数据如下图12.4:,然后,我们来设置ODBC数据源。在98系统中ODBC数据源在“控制面板”下;2000/Xp系统中,它在“控制面板”,“管理工具”下,见图12.5:,在弹出的对话框中选择“Microsoft Access Driver(*.mdb)”,点击“完成”按钮后,弹出Access数据源的设置对话框。填写数据源名为“Student”,点击“选择”按钮,找到刚才建立的数据库。最后点击“确定”按钮,如图12.7。ODBC数据源的设置部分就完成了。,最后,编写代码运行结果如图12.8:,例12.1 TestJDBC_1.java源代码:,程序说明: 对数据库的操作要引入“java.sql”包。它包含DriverManager类,Connection接口,Statement接口,ResultSet接口,CallableStatement接口,PreparedStatement接口等API。下节我们对这个程序和“java.sql”包中几个常用的类和接口进行说明。,12.4.1 JDBC驱动设置类DriverManager,1、 概述 DriverManager类位于JDBC的管理层,作用于用户和驱动程序之间。它的作用是跟踪可用的驱动程序,管理JDBC驱动程序接口,并在数据库和相应驱动程序之间建立连接。另外,DriverManager 类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。,加载DriverManager类前要先调用Class.forName( )方法加载驱动程序类。以下代码用于加载驱动程序类: String jdbcDriver=“sun.jdbc.odbc.JdbcOdbcDriver“; try Class.forName(jdbcDriver); catch(ClassNotFoundException e) System.out.println(“未找到要加载的驱动类“); 注意:Class.forName()方法加载程序驱动类时,可能会发生“ClassNotFoundException”异常,所以要用try catch语句捕捉异常。,2、 建立连接 加载DriverManager类最常用的方法就是DriverManager.getConnection()方法,该方法用于建立与数据库的连接。DriverManager.getConnection()方法形式具体如下: getConnection(String url, String user, String password) getConnection(String url) 前一个方法针对SQLServer和Oracle数据库等服务器数据库,而Access数据库用后一个方法就行了。 以下代码是通常情况下用驱动程序建立连接所需所有步骤的示例:,String jdbcDriver=“sun.jdbc.odbc.JdbcOdbcDriver“; String jdbcURL=“jdbc:odbc:Student“; Class.forName(jdbcDriver); Connection con = DriverManager.getConnection(jdbcURL); 注意:getConnection方法可能导致“SQLException”异常,所以编写程序时要用try catch语句捕捉异常。,12.4.2连接接口Connection,下述代码的作用是打开一个URL为“ jdbc:odbc:Student “的数据库的连接。 String jdbcURL=“jdbc:odbc:Student“; Connection con = DriverManager.getConnection(jdbcURL); Connection接口的作用是建立Java程序与数据库之间的连接,并生成可以执行SQL语句的Statement对象。一个Java程序可与单个数据库有一个或多个连接。Connection对象是通过DriverManager.getConnection()方法获得的。,12.4.3语句接口Statement,Statement接口用于将 SQL 语句发送到已连接的数据库中。实际上有三种 Statement 接口:Statement、PreparedStatement(它从 Statement 继承而来)和 CallableStatement(它从 PreparedStatement 继承而来)。它们用于发送特定类型的SQL语句:Statement接口用于执行不带参数的简单SQL语句;PreparedStatement接口用于执行带或不带IN参数的预编译SQL语句;CallableStatement接口用于执行对数据库存储过程的调用。,1、 创建 Statement 接口对象 建立了到特定数据库的连接之后,就可用该连接发送SQL语句。Statement 对象用 Connection类的createStatement( )方法创建,以下是它两个重载方法: Statement stmt = con.createStatement(); Statement stmt = con.createStatement(int resultSetType, int resultSetConcurrency );,2、 使用 Statement 对象执行语句 实现Statement接口的对象有三种执行 SQL 语句的方法:executeQuery( )、executeUpdate( ) 和execute( )。具体使用哪一个方法由 SQL 语句所产生的内容决定。 (1)方法 executeQuery ( )用于返回单个结果集对象(ResultSet对象),它可以执行SELECT 查询语句。 (2)方法 executeUpdate( )用于执行INSERT、UPDATE或DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE等。,(3)方法 execute( )用于执行返回多个结果集、多个更新计数或二者组合的语句。 Statement 对象在执行SQL语句时,将关闭之前生成的ResultSet对象(如果存在)。这意味着Statement对象重新执行SQL语句之前,需要完成对当前 ResultSet 对象的处理。 3、关闭 Statement 对象 调用Statement对象的close( )方法关闭Statement对象。Statement 对象将由 Java 垃圾收集程序自动关闭。而作为一种好的编程风格,应在不需要 Statement 对象时显式地关闭它们。这将立即释放DBMS资源,有助于避免潜在的内存问题。当一个Statement对象调用close( )方法时,它产生的ResultSet对象也将被关闭。,注意:使用Statement接口进行查询时可能导致“SQLException”异常,所以编写程序时要用try catch语句捕捉异常。 12.4.4记录集对象ResultSet ResultSet对象是Statement对象执行SQL语句后生成的记录集。可以认为它是一个二维的表格,包含符合要查询的SQL语句的条件的所有行。 1、记录列,若想获得当前游标指向记录的列值,可通过调用getXXX方法来完成,见表12.3。其中XXX是与该参数相应的类型。例如,如果参数是int型数据,则使用的方法就是getInt。ResultSet对象的getXXX方法以一个列号(int型)或者一个列名(String型)为参数来表示要获取哪一列的值,假如要获得数据类型为int的学生的学号,可以用getInt(1)或getInt(“学号”),“1”的意思是记录集的第一列,“学号”为列名。 表 12.3 getXXX方法,2、记录行 使用next()可以向后移动游标,指向下一条记录。如果当前游标指向的记录有效,next( )方法将返回true,否则返回false。 注意:一个ResultSet对象开始时,指针是指向第一条记录的前一个位置。也就是说,如果要使用第一条记录就要先执行next( )方法让游标向后移动一条记录。,ResultSet rs = stmt.executeQuery(“select * from TestStudent“); while(rs.next() System.out.print(“ 号码:“ + rs.getInt(1); System.out.print(“ 姓名:“ + rs.getString(2); System.out.print(“ 性别“ + rs.getString(3); System.out.print(“ 年龄“ + rs.getInt(4); System.out.println(); ,上面举例使用的是顺序查询,若使用的是游动查询,即按如下格式创建Statement对象: Statement stmt = con.createStatement(int resultSetType, int resultSetConcurrency ); ResultSet rs = stmt.executeQuery(SQL语句); 那么stmt对象执行SQL语句返回的ResultSet对象,可以使用如下方法对记录集进行游动查询:,表12.4 实现游动查询的主要方法,当产生Resutl对象的Statement关闭时,虚拟机将自动关闭 ResultSet对象。不过立即关闭不再使用的资源是好的编程习惯,所以建议读者手动关闭Result对象。 12.4.5 PreparedStatement接口 以下程序使用PreparedStatement接口用于向数据表中添加一条学生的记录: 例12.2 TestJDBC_2.java的源代码 :,PreparedStatement接口继承 Statement,它与Statement接口有两个不同之处: (1)PreparedStatement语句包含编译好的SQL语句,而Statement的语句是当程序要执行时才去编译它们。 (2)PreparedStatement语句具有一个或多个参数,每个参数用“?”代替(见程序第11行),在执行 PreparedStatement对象之前(第18行),必须通过调用setXXX方法设置每个?参数的值(第13-17行)。其中XXX是与该参数相应的类型。setXXX方法的第一个参数是要设置的数据表的列号,第二个参数是设置给该参数的值。 注意:PreparedStatement接口的名字和Connection对象的prepareStatement( )方法的写法很相像,请读者注意区别。,由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement 对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。 12.4.6 CallableStatement 接口 很多DBMS都包含内部编程语言,允许数据库开发人员在数据库中直接嵌入过程应用代码,然后可从其他的应用中调用这些代码。使用内部编程语言可编写一些由若干SQL语句组成的过程,经过预编译存储起来,需要时再调用,这样的SQL语句称为存储过程。JDBC提供的CallableStatement接口用来对存储过程进行存取,该接口继承PreparedStatement接口。下面的程序片段将介绍如何使用CallableStatement接口:,如下名为myProcedure的存储过程。 CREATE PROCEDURE myProcedure (num in 学号, name in 姓名, sex in 性别, age in 年龄, speciality in专业) AS BEGIN INSERT INTO TestStudent(num, name, sex, age, speciality); END; Java调用存储过程的代码如下:,Java调用存储过程的代码如下: CallableStatement cstmt = con.prepareCall(“call myProcedure(?, ?, ?, ?, ?) “); cstmt.setInt(1, 5); cstmt.setString(2, “刘枫“); cstmt.setString(3, “男“); cstmt.setInt(4, 23); cstmt.setString(5, “经济管理“); cstmt.executeUpdate();,12.5 JDBC本地驱动连接SQLServer2000数据库,SQLServer2000的本地驱动程序是第四种JDBC驱动,它是Microsoft公司提供的纯Java驱动。使用本地驱动不用设置数据源,直接操作数据库,而且速度很快。所以这种连接方式在实际的开发中应用比较广泛。 第一步:下载SQL_JDBC本地驱动 SQL_JDBC本地驱动是免费的,可以在网上搜索自行下载或在微软的官方主页下载,URL如下: /downloads/details.aspx?FamilyID=07287b11-0502-461a-b138-2aa54bfd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论