数据库访问的编程技术.ppt

上传人:牧羊曲112 文档编号:6578694 上传时间:2023-11-14 格式:PPT 页数:71 大小:2.37MB
返回 下载 相关 举报
数据库访问的编程技术.ppt_第1页
第1页 / 共71页
数据库访问的编程技术.ppt_第2页
第2页 / 共71页
数据库访问的编程技术.ppt_第3页
第3页 / 共71页
数据库访问的编程技术.ppt_第4页
第4页 / 共71页
数据库访问的编程技术.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《数据库访问的编程技术.ppt》由会员分享,可在线阅读,更多相关《数据库访问的编程技术.ppt(71页珍藏版)》请在三一办公上搜索。

1、第10章,数据库访问的编程技术,第10章 数据库访问的编程技术,了解数据库编程的基本概念掌握JDBC的基本概念和工作原理掌握JDBC访问数据库的过程能用java进行简单的数据库编程,课程目标,目 录,10.1 JDBC概述10.2 JDBC中的主要接口和类10.3 JDBC访问数据库的基本过程10.4 SQL查询语言的执行10.5 综合应用举例,在开发企业级业务应用系统的过程中,需要使用数据库管理系统来存储、管理企业的业务数据。JDBC为在Java中开发数据库应用程序提供了良好的工具,掌握JDBC能够使得开发人员方便快捷地编写数据库应用程序。,10.1 JDBC概述,10.1 JDBC概述,J

2、DBC(Java DataBase Connectivity,Java数据库连接)是一种可用于执行SQL语句的Java API,它为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以方便地将各种SQL语句传送到任何关系数据库中。JDBC由一些Java语言编写的类和接口组成。用户使用这些类和接口就可以用统一的形式访问各种不同的关系数据库,并开发访问不同厂商数据库的应用程序。,JDBC的基本结构如图所示。从图中可以看出:顶层是Java应用程序,它既可以是Applet应用程序,也可以是独立运行的Application应用程序,甚至还可以是服务器端运行的Seve

3、rlet和EJB组件等。其他两层是JDBC接口,分别是面向程序员的JDBC API及面向数据库厂商的JDBC Driver API。,10.1.1 JDBC的基本结构,JDBC的基本结构,Java应用程序通过JDBC API接口,经由JDBC驱动程序管理器、JDBC Driver API和JDBC驱动程序访问下层的数据库。JDBC API屏蔽了不同的数据库驱动程序之间的差异,使得程序设计人员只能用一个标准的、纯Java的数据库程序设计接口,为在Java中访问任意类型的数据库提供支持。JDBC驱动程序程序管理器为应用程序装载数据库驱动程序,它与具体的数据库有关,用于向数据库提交SQL请求。,数据

4、库驱动程序一般是由生产数据库的厂家提供。不同的厂商为数据库提供不同的驱动程序,从而把访问操作数据库的复杂操作封装在自己的驱动程序中。例如,数据库厂商Oracle为Oracle10数据库提供了不同的驱动程序,但都实现了JDBC接口。对于应用程序开发人员而言,不必关心特定数据库的复杂操作,只需要掌握Java提供的访问数据库的接口,就可以编写访问不同类型的数据库的应用程序。,10.1.2 JDBC 驱动程序,(1)JDBC-ODBC 桥接器(Bridge)。它负责将JDBC调用转换为ODBC调用,应用程序是通过JDBC调用连接到一个使用ODBC驱动程序的数据库。要求每个客户端都安装上数据库对应的OD

5、BC和JDBC-ODBC Bridge两种驱动程序。(2)本地API,部分Java驱动程序(Native API,partly Java driver)。它是部分使用Java语言编写和部分使用本机代码编写的驱动程序,它将数据库厂商的特殊协议转换成Java代码及二进制类码,即把客户端的JDBC调用转换为Oracle、Sybase、DB2或其他DBMS的调用,使Java 数据库客户端与数据库服务器端通信。,10.1.2 JDBC 驱动程序,(3)JDBC-Net,纯Java驱动程序。它是纯Java的驱动程序,通过一定的网络协议与数据库服务器上的JDBC中间件通信,由中间件程序将网络协议指令转换成数

6、据库指令。中间件可支持多种数据库,适合具有中间件的分布式应用。(4)本地协议,纯Java驱动程序。可这类驱动程序通过实现一定的数据库协议(如Oracle公司的SQLNet)能将JDBC调用转换为数据库直接使用的网络协议,使Java数据库客户端直接与数据库服务器通信。它不需要安装客户端软件,它是100%的Java程序,所以其效率很高。,目 录,10.1 JDBC概述10.2 JDBC中的主要接口和类10.3 JDBC访问数据库的基本过程10.4 SQL查询语言的执行10.5 综合应用举例,10.2 JDBC中的主要类和接口,JDBC由一系列的类和接口组成,包括:连接(Connection):实现

7、建立与数据库的连接 SQL语句(Statement):向数据库发起查询请求 结果集(ResultSet):处理数据库返回结果其中核心的类和接口包含在java.sql包和javax.sql包中。表中列出了java.sql包中访问数据库的重要类和接口及它们的功能说明。,访问数据库的重要类和接口,访问数据库的第一步是与数据源建立连接,只有建立了连接,才能在数据库和应用程序之间移动数据。DriverManager类是java.sql包中用于数据库驱动程序管理的类,用于在数据库和相应驱动程序之间建立连接,也处理像驱动程序登录时间限制、登录和跟踪消息的显示等事务。,10.2.1 DriverManager

8、类,DriverManager类的主要成员方法,DriverManager对象提供了三种建立数据库连接的方法。每种方法都返回一个Connection对象实例,区别是它们接收的参数不同。URL用于指定数据源和用于连接到该数据源的数据库的连接类型。其格式如下:jdbc:其中:jdbc:表示使用的协议是JDBC。:驱动程序或者连接机制的名称,可以有一个或者多个驱动程序支持:数据库的唯一标识符例如:通过JDBC-ODBC桥和数据库的标识符DBTest来访问数据库的URL为:“jdbc:odbc:DBTest”,java.sql.Driver接口规定了所有JDBC驱动程序必须实现的方法。加载或注册一个数

9、据库驱动程序,实际上就是创建了数据库驱动程序的一个实例,从而保证Java程序使用统一的形式,通过不同的数据库驱动器访问各种数据库。,10.2.2 Driver接口,java.sql.Connection是java.sql包中定义的一个接口,其功能是建立与数据库的连接。只有成功地建立与数据库的连接,才能够创建用于执行SQL语句的Statement对象,进而获取数据库执行SQL语句后返回的结果。,10.2.3 Connection接口,Connection接口的主要成员方法,10.2.4 Statement接口,Statement是在已经建立的连接的基础上向数据库发送SQL语句的对象。Statem

10、ent接口定义了执行SQL语句和获取返回结果的成员方法。它们都作为在给定连接上执行 SQL 语句的容器,每个都专用于发送特定类型的 SQL 语句。由于Statement为一个接口,它本身不能被实例化,必须通过调用Connection对象的createStatement()方法创建一个Statement对象。,Satatement接口的主要成员方法,Statement 接口提供了3种执行SQL语句的方法:(1)executeQuery()方法:执行返回单个ResultSet的SQL语句,如SELECT语句。(2)executeUpdate()方法:用于执行INSERT、UPDATE、DELETE

11、、CREATE TABLE以及 DROP TABLE语句返回值是一个整数,表示它执行的SQL语句所影响的数据库中的表的行数。(3)execute()方法:用于执行返回多个结果集或多个更新计数的语句,它的执行结果可能会产生多个ResultSet,或者改变多条记录。所以一般只有在用户不知道执行SQL声明后会产生什么结果或可能有多种类型的结果产生时才会使用。,10.2.5 ResultSet接口,结果集ResultSet是用来暂时存放执行SQL语句后产生的结果集合。它的实例对象一般是Statement类的子类通过方法execute()或executeQuery()执行SQL语句后产生的,包含有这些语

12、句的执行结果。ResultSet类似于数据库中的表,包含符合查询要求的所有行。ResultSet类提供了一套getXXX()方法对这些行中的数据进行访问。,如:boolean getBoolean(int columnIndex)、int getInt(int columnIndex)等,用于获取当前行中某一列的值,返回相应类型的值。它还提供了很多移动游标(cursor)的方法。cursor是ResultSet 维护的指向当前数据行的指针。最初它位于第一行之前,因此第一次访问结果集时通常调用 next()方法将游标置于第一行上,使它成为当前行。随后每次调用 next()使游标向下移动一行。另外

13、,还提供了isBeforeFirst()、isAfterLast()、isFirst()、isLast()等方法用于判断游标是否在结果集的头部、结果集的末尾、结果集的第一行和结果集的最后一行等。,10.2.6 PreparedStatement接口,当使用Statement对象执行SQL语句时,数据库中的SQL语句解释器首先将SQL语句进行编译,生成底层可理解的内部命令,然后执行。为了减少重复编译SQL语句所产生的开销,JDBC提供了PreparedStatement接口,由于PreparedStatement语句中包含了经过预编译的SQL语句,因此可以获得更高的执行效率。特别是当需要反复调用

14、某些SQL语句时,使用该接口具有明显的优势。,1、创建PreparedStatement 对于JDBC,当使用Connection与某个数据库建立了连接对象con后,则con可以调用PreparedStatement()方法创建PreparedStatement对象。例如:stmt=con.prepareStatement(SELECT*FROM Student);2、执行PreparedStatement 创建了PreparedStatement对象后,就可以执行它了,调用表10-4所示的成员方法进行各种操作。如:stmt.executeUpdate();,在PreparedStatemen

15、t语句中可以包含多个用通配符“?”代表的字段。在执行之前,必须为在创建PreparedStatement时定义的通配符提供实际的数据。可以利用setXXX()方法设置该字段的内容,从而增强程序设计的动态性。例如:如果要替换的值是一个int型,则可调用setInt()方法。基本上可以找到所有Java类型的setXXX()方法。setXXX()方法的第一个参数指定要替换的占位符的索引(索引从1开始)。通配符在预处理SQL语句中从左到右依次出现的顺序分别称为第1个,第2个第m个通配符。,10.2.7 CallableStatement接口,CallableStatement接口继承了Prepared

16、Statement接口,用于执行对数据库存储过程的调用。它提供了gettXXX()方法获取某字段的内容。如果要获取的值是一个int型,则可调用getInt()方法。setXXX()方法的第一个参数指定要替换的占位符的索引(索引从1开始)。通配符在预处理SQL语句中从左到右依次出现的顺序分别称为第1个,第2个第m个通配符。,1、创建CallableStatement 对象CallableStatement对象是用Connection接口的prepareCall()方法创建的。例如:CallableStatement cstm=con.prepareCall(call getTestData(?,

17、?);其中被调用的存储过程的名字为getTestData。该存储过程有两个变量,但不含结果参数。“?”通配符为IN、OUT或INOUT参数,取决于存储过程本身。,在JDBC中调用存储过程的语法如下:call 过程名:不带参数的存储过程的调用。call 过程名(?,?,.):需要若干参数的存储过程的调用。?=call 过程名(?,?,.):需要若干参数并返回结果参数的存储过程的调用。,2、执行CallableStatement 对象创建CallableStatement 对象后,就可以调用其相关成员方法完成所需的操作。例如:try CallableStatement cstm=con.prepa

18、reCall(call getStudentID(?,?);cstm.setString(1,06070010);/向存储过程传递参数 cstm.registerOutParameter(2,Type.REAL);/如需存储过程返回结果,需先调用registerOutParameter()方法设置输出参数类型 cstm.executeQuery();float x=cstmt.getFloat(1);/用get方法获取执行结果catch(SQLException e),目 录,10.1 JDBC概述10.2 JDBC中的主要接口和类10.3 JDBC访问数据库的基本过程10.4 SQL查询语言

19、的执行10.5 综合应用举例,10.3 JDBC 访问数据库的基本过程,利用JDBC访问数据库需要经历下面几个基本步骤:(1)注册数据源;(2)加载JDBC驱动程序;(3)创建数据库连接;(4)创建Statement;(5)执行Statement;(6)处理查询结果集;(7)关闭数据库连接。,一、注册ODBC数据源,在创建数据库连接之前,必须要先创建数据源。下面以Windows XP为例说明注册ODBC数据源的过程。我们要把一个Oracle 10i的数据库Student注册为一个ODBC数据源,命名成DBTest。注册步骤如下:,1在Windows XP中选择“控制面板”、“性能和维护”、“管

20、理工具”和“数据源(ODBC)”,弹出如图所示的“ODBC数据源管理器”对话框。,2单击其中的某个驱动程序,或者选择“用户DSN”选项卡,然后单击“添加(D)”按钮,弹出如图所示的“创建新数据源”对话框。,在这个对话框中,选择Oracle公司提供的驱动程序Oracle OraDb10g_home1(如果要创建其他数据库的数据源,例如Microsoft SQL Server 或Microsoft Access数据库的数据源,可以在“创建新数据源”对话框中选择SQL Server或Microsoft Access驱动程序)。,3单击“完成”按钮,出现如图所示的“Oracle ODBC Driver

21、 Configuration”对话框。,在图示的对话框中的“Data Source Name”(数据源名)输入框中输入数据源的名字(如:DBTest),该名字将被用来在Java程序中建立与数据库的连接。可以在“服务器”(TNS Server Name)输入框中输入相应的数据库服务器的名称或者IP地址(如:MyServer),然后单击“Test Connection”按钮,以测试连接是否可用。测试成功后,Java程序才能够通过JDBC访问该数据源。,在访问数据库之前,必须将JDBC驱动程序加载到Java虚拟机中。加载驱动程序有两种基本方法:(1)使用DriverManager 类的静态方法reg

22、isterDriver加载;(2)使用 java.lang.Class类的forName 方法加载。,二、加载JDBC驱动程序,使用DriverManager类加载Oracle JDBC驱动程序的Java代码如下:DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver();如果加载的驱动程序不存在,就会出现异常,此时需要应用程序对这种异常进行处理。,1)加载Oracle JDBC驱动程序,使用 java.lang.Class类加载Oracle JDBC驱动程序的Java代码如下所示:Class c=Class.forNa

23、me(oracle.jdbc.driver.OracleDriver);如果加载的的驱动程序不存在,Class.forName()方法将会抛出ClassNotFoundException 异常。此时同样需要应用程序处理异常。,2)加载Microsoft SQL Server JDBC驱动程序 用DriverManager类加载Microsoft SQL Server JDBC驱动程序的Java代码如下所示:DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver();使用 java.lang.Cl

24、ass类加载Microsoft SQL Server JDBC驱动程序的Java代码如下所示:Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);其中,“com.microsoft.jdbc.sqlserver.SQLServerDriver”是Microsoft SQL Server JDBC驱动程序的类名。,3)加载InterClient JDBC驱动程序 InterClient JDBC驱动程序的类名是interbase.interclient.Driver。用DriverManager类加载InterClient JD

25、BC驱动程序的Java代码如下所示:DriverManager.registerDriver(new interbase.interclient.Driver();使用 java.lang.Class类加载JDBC-ODBC驱动程序的Java代码如下所示:Class.forName(interbase.interclient.Driver);,4)加载PostgreSQL JDBC 驱动程序 PostgreSQL JDBC驱动程序的类名是org.postgresql.Driver。用DriverManager类加载PostgreSQL JDBC驱动程序的Java代码如下所示:DriverMan

26、ager.registerDriver(new corg.postgresql.Driver();使用 java.lang.Class类加载PostgreSQL JDBC驱动程序的Java代码如下所示:Class.forName(org.postgresql.Driver).newInstance();其中,org.postgresql.Driver是PostgreSQL JDBC驱动程序的类名。,5)加载MySQL JDBC驱动程序MySQL JDBC驱动程序的类名是org.gjt.mm.mysql.Driver。用DriverManager类加载MySQL JDBC驱动程序的Java代码如

27、下所示:DriverManager.registerDriver(new org.gjt.mm.mysql.Driver();使用 java.lang.Class类加载MySQL JDBC驱动程序的Java代码如下所示:Class.forName(org.gjt.mm.mysql.Driver).newInstance();其中,org.gjt.mm.mysql.Driver是MySQL JDBC驱动程序的类名。,6)加载JDBC-ODBC桥驱动程序用DriverManager类加载JDBC-ODBC桥驱动程序的Java代码如下所示:DriverManager.registerDriver(n

28、ew sun.jdbc.JdbcOdbcDriver();使用 java.lang.Class类加载JDBC-ODBC驱动程序的Java代码如下所示:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);其中,sun.jdbc.odbc.JdbcOdbcDriver是数据库驱动程序的类名。,加载了数据库的JDBC驱动程序之后,就可以创建与数据库的连接了。与数据库建立连接的常用方法是调用DriverManager 类的静态方法getConnection(String connect_string)。其代码如下:Connection conn=DriverMana

29、ger.getConnection(URL,User,Password);其中,URL、User、Password是连接数据库需要指定的连接参数。,三、创建数据库连接、加载JDBC驱动程序,连接数据库的连接参数,目 录,10.1 JDBC概述10.2 JDBC中的主要接口和类10.3 JDBC访问数据库的基本过程10.4 SQL查询语言的执行10.5 综合应用举例,在建立了与数据库的连接后,应用程序可以在此连接上创建SQL语句对象,以便执行用户定义的SQL语句。,10.4 SQL查询语言的执行,在建立了与数据库的连接后,应用程序可以在此连接上创建SQL语句对象,以便执行用户定义的SQL语句。在

30、Connection中,提供了3种createStatement()成员方法,用于创建Statement对象:Statement createStatement()throws SQLException;Statement createStatement(int resultSetType,int resultSetConcurrency)throws SQLException;Statement createStatement(int resultSetType,int resultSetConcurrency,int resultSetHoldability)throws SQLExcep

31、tion;,10.4.1 创建Statement对象,例如:利用不带参数的createStatement方法创建Statement对象的代码如下:Statement stmt=conn.createStatement()/conn是已经建立好的数据库连接另外,还可以利用JDBC提供的preparedStatement接口和CallableStatement接口来创建SQL语句对象。,由于SQL语句可以分成两大类:一类是数据定义和更新语句,如CREATE、INSERT、UPDATE和DELETE等语句;另一类是SELECT查询语句。因此,JDBC中的Statement对象提供了执行不同SQL语句

32、的基本处理方法:Statement中定义的executeUpdate()成员方法用于执行数据定义和更新语句,Statement中定义的executeQuery()成员方法用于执行SELECT查询语句。,10.4.2 执行Statement,SQL中的SELECT查询语句,可以使用如下代码:Statement stmt=conn.createStatement();/创建Statement对象ResultSet rset=stmt.executeQuery(SELECT name,major FROM student);/执行查询语句SQL中的数据更新语句,如DELETE语句,则可以使用如下的代

33、码片段:Statement stmt=conn.createStatement();/创建Statement对象int rowcount=stmt.executeUpdate(DELETE FROM student WHERE number=06070001);/执行更新语句,10.4.2 执行Statement,如果只能在运行时才能确定SQL语句的类型,则可以使用Statement 中的execute()成员方法动态地执行未知类型的SQL语句。这个成员方法将返回一个表示SQL语句类型的布尔值。如果返回真,说明SQL语句是查询语句,否则是更新语句或数据定义语句。示例代码如下:,Statemen

34、t stmt=conn.createStatement();/用execute方法执行SQL语句boolean result=stmt.execute(statement);if(result)/statement是一个查询语句/获取结果集ResultSet rset=stmt.getResultSet();/处理结果/.else/statement 是更新语句或数据定义语句 int updateCount=stmt.getUpdateCount();/处理结果/.,Statement执行SQL语句之后,将返回一个结果集对象ResultSet。每一个ResultSet对象都有一个游标(curs

35、or)指向结果集的当前位置,游标的初始位置是在结果集的第一行之前。第一次调用next()方法使游标移动到第一行,它返回一个boolean型的数据,当游标移动到最后一行之后返回false。,10.4.3 处理查询结果集,用户可以通过ResultSet对象提供的定位游标的成员方法对结果集进行遍历,进而用一组getXXX方法获取,或用一组updateXXX方法更新结果集中每一个记录(Record)中的属性值。,ResultSet中定位游标的方法,在完成任务之后,程序必须自己关闭结果集ResultSet对象和Statement对象,而不能像一般的Java对象那样等待Java虚拟机进行垃圾回收。因为这些

36、对象并不是利用new运算符创建的对象,而是由底层JDBC驱动程序创建的,因此必须用Java代码通知底层驱动程序释放它们,否则就有可能造成内存的泄漏,导致数据库服务器资源不足。,10.4.4 关闭数据库连接,下面是一些关闭结果集ResultSet对象和Statement对象的代码:rset.close();/关闭结果集对象rsetstmt.close();/关闭Statement对象stmt在关闭了结果集对象ResultSet和Statement对象后,还要关闭连接对象。代码为:conn.close();/关闭连接对象conn 对于服务器端的缺省连接则不需要关闭。,目 录,10.1 JDBC概述

37、10.2 JDBC中的主要接口和类10.3 JDBC访问数据库的基本过程10.4 SQL查询语言的执行10.5 综合应用举例,10.5 综合应用举例,本章主要介绍了使用JDBC访问数据库的一些技术,包括Java访问数据库的类和接口的使用方法、利用JDBC访问数据库的基本访问过程和一些使用技巧。本节将通过一些数据库的高级访问功能进一步展示综合应用这些知识的基本方法与技巧。,10.5.1 可滚动查询集,虽然通过ResultSet的next()方法可以顺序查询数据,但有时候需要在结果集中前后滚动,或者需要显示结果集中特定的某条记录。这时,可使用Java提供的可滚动结果集。为了得到一个可滚动的结果集,

38、须使用下述方法先获得一个Statement对象:Statement stmt=con.createStatement(int Type,int Concurrency);然后根据Type和Concurrency的情况,stmt返回相应类型的结果集:ResultSet rs=stmt.executeQuery(SQL语句);,Type的取值方式决定滚动方式,取值情况为:TYPE_FORWARD_ONLY:结果集游标只能向前移动。TYPE_SCROLL_INSENSITIVE:结果集的游标可前后滚动,当数据库内容变化时,当前结果集不变。TYPE_SCROLL_SENSITIVE:结果集的游标可前后

39、滚动,当数据库内容变化时,当前结果集同步改变。第二个参数Concurrency的取值决定是否可以用结果集更新数据库,Concurrency取值为:CONSUR_READ_ONLY:结果集不能用于更新数据库 CONCUR_UPDATABLE:结果集可以用于更新数据库,滚动查询经常用到的ResultSet的方法有以下几种:absolute(int row):把游标移至给定的行 afterLast():把游标移动到最后一行后面。beforeFirst():把游标移动到第一行前面。first():把游标移动到第一行。last():把游标移动到最后一行。previous():把游标移动到所在行的前一行。

40、next():把游标移动到所在行的后一行。relative():把游标相对移动几行。,例10-5 实现滚动查询,以多种滚动方式查看结果 问题分析:利用JDBC访问数据库的基本过程完成相关操作后,在创建Statement对象时,应通过指定相应的属性,建立滚动集,并设置游标的不同位置,可以实现向前滚动和向后滚动等不同的查看方式。设计说明:为了实现滚动查询,应先创建一个滚动集,并设置滚动集的相关属性。然后利用滚动集的相关方法实现不同滚动方式下的查询。,可以在SQL语句中使用ORDER BY子句对记录排序,按照不同的字段进行排序,输出排序后的结果。例10-6 对学生成绩实现排序及模糊查询,并能够实现倒序显示。问题分析:利用JDBC访问数据库的基本过程完成相关操作后,在创建Statement对象时,应通过指定相应的属性,建立滚动集,而排序及模糊查询也可利用SQL语句实现。设计说明:为了实现倒序显示,应先创建一个滚动集,并设置滚动集的相关属性。为了实现排序及模糊查询然,可充分利用SQL语句中的ORDER BY子句和like执行查询。,10.5.2 排序查询以及模糊查询,第10章小结,本章学习了Java的数据编程技术会进行简单的数据库编程,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号