《JSP动态网页编程》-第5章_第1页
《JSP动态网页编程》-第5章_第2页
《JSP动态网页编程》-第5章_第3页
《JSP动态网页编程》-第5章_第4页
《JSP动态网页编程》-第5章_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

5.1JDBC简介JDBC(JavaDataBaseConnectivityJava数据库连接)是一种用于执行SQL语句的JavaAPI,它由一组Java类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API据此可以构建更高级的工具和接口,使数据库开发人员能够用纯JavaAPI编写数据库应用程序,同时,JDBC也是个商标名。

JDBC定义了许多接口和类,在JDBC3.0版本中,这些类包含在java.sqlIIIjavax.sql这两个包中。下一页返回5.1JDBC简介java.sql这个包中的类和接口主要针对基本的数据库编程服务,例如,生产连接,执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,如批处理更新,事物隔离和可滚动结果集等。

javax.sql这个包主要是为数据库的高级操作提供接口和类,如连接管理类、创建语句类和行集类等。虽然接口和类很多,但是经常使用的却不是很多。在这单介绍一下常用的接口和类的使用。上一页下一页返回5.1JDBC简介5.1.1DriverManagerDriverManager类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager类也处理诸如驱动程序矜录时间限制及矜录和跟踪消息的显小等事务。DriverManager类中一个重要的方法是DriverManager.getConnection(),该方法将建立与数据库的连接。JDBC允许用户调用DriverManager的方法getDriver(),getDrivers()和registerDriver()及Driver的方法connect()。上一页下一页返回5.1JDBC简介1.跟踪可用驱动程序

DriverManager类包含一系列的驱动程序(Driver)类,它们通过调用方法DriverManager.registerDriver()对自己进行了注册。所有Driver类都必须包含有一个静态部分。它创建该类的实例,然后在加载该实例时DriverManager类进行注册。这样,用户正常情况下将不会直接调用DriverManager.registerDriver(),而是在加载驱动程序时由驱动程序自动调用。加载Driver类,然后自动在DriverManager中注册的方式有以下两种。上一页下一页返回5.1JDBC简介(1)通过调用方法C1ass.forName()。这将显式地加载驱动程序类。由于这与外部设置尤关,因此推荐使用这种加载驱动程序的方法。以下代4i加载类acme.db.Driver:Class.forName("acme.db.Driver");其中acme.db.Driver为不同数据库的驱动,例如:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")//加载MSSQLServer驱动Class.forName("org.git.mm.mysql.Driver")//加载MySQLJDBC驱动C1ass.forName("oracle.]dbc.driver.OracleDriver")//加载OracleJDBC驱动如果将acme.db.Driver编写为加载时创建实例,并调用以该实例为参数的DriverManager.registerDriver(),则它在DriverManager的驱动程序列表中,并可用于创建连接。上一页下一页返回5.1JDBC简介(2)通过将驱动程序添加到java.lang.System的属性jdbc.drivers中。这是一个由DriverManager类加载的驱动程序类名的列表,由冒号分隔:初始化DriverManager类时,它搜索系统属性jdbc.drivers,如果用户己输入了一个或多个驱动程序,则DriverManager类将试图加载它们。对DriverManager方法的第一次调用将自动加载这些驱动程序类。这种加载驱动程序的方法需要持久的预设环境。如果对这一点不能保证,则调用方法C1ass.forName()显式地加载每个驱动程序就显得更为安全。一旦DriverManager类被初始化,将不再检查jdbc.drivers属性列表,这也是引入特定驱动程序的方法。上一页下一页返回5.1JDBC简介

在以上两种情况中,新加载的Driver类都要通过调用DriverManager.registerDriver类进行自我注册。如上所述,加载类时将自动执行这一过程。由于安全方面的原因,JDBC管理层将跟踪哪个类加载器提供哪个驱动程序。这样,当DriverManager类打开连接时,它仅使用本地文件系统或与发出连接请求的代码相同的类加载器提供的驱动程序。

2.建立连接加载Driver类并在DriverManager类中注册后,它们即可用来与数据库建立连接。当调用DriverManager.getConnection()方法发出连接请求时,DriverManager将检查每个驱动程序,查看它是否可以建立连接。上一页下一页返回5.1JDBC简介

有时可能有多个JDBC驱动程序可以与给定的URL连接。例如,与给定远程数据库连接时,可以使用JDBC-ODBC桥驱动程序、JDBC到通用网络陇议驱动程序或数据库厂商提供的驱动程序。在这种情况下,测试驱动程序的顺序至关重要,因为DriverManager将使用它所找到的第一个可以成功连接到给定URL的驱动程序。首先DriverManager试图按注册的顺序使用每个驱动程序。它将跳过代码不可信任的驱动程序,除非加载它们的源与试图打开连接的代码的源相同。它通过轮流在每个驱动程序上调用方法Driver.connect(),并向它们传递用户开始传递给方法DriverManager.getConnection()的URL来对驱动程序进行测试,然后连接第一个认出该URL的驱动程序。上一页下一页返回5.1JDBC简介这种方法初看起来效率不高,但由于不可能同时加载数十个驱动程序,因此每次连接实际只需几个过程调用和字符串比较。以下代码是通常情况下用驱动程序(例如JDBC-ODBC桥驱动程序)建立连接所击所有步骤的小例。Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序Stringurl=”jdbc:0dbc:fred”;DriverManaqer.qetConnection(url,"user工D","passwd");对于不同的数据库,)商提供的驱动程序和连接的URL都不相同,见表5-1。上一页下一页返回5.1JDBC简介5.1.2ConnectionConnection对象代表与数据源进行的唯一会话。连接过程包括所执行的SQL语句和在该连接上所返回的结果。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。一种简单而有效的与数据库建立连接的方法是调用DriverManager.getConnection)方法。该方法接受含有某个JDBCURL的字符串。当调用方法getConnection()时,DriverManager类将尝试检查己经注册的Drive:类的清单中的每个驱动程序,直到找到可与JDBCURL中指定的数据库进行连接的驱动程序为止。Drive:的方法connect使用这个JDBCURL来建立实际的连接。上一页下一页返回5.1JDBC简介

下述代码显小如何打开一个与位于URL“jdbc:odbc:test”的数据库的连接。所用的用户名为“su,日令为“w”。

Stringurl=”jdbc:odbc:test”;nnectioncon=DriverManager.getConnection(url,”su",W);Connection接口是使用频繁的接口之一。下面列出Connection对象经常用到的方法以及属性(下文中提到的ConnectionObjectName是生成Connection类对象的名称)。

(1)close().关闭Connection对象以便释放所有关联的系统资源。方法调用如下:ConnectionObjectName.close();上一页下一页返回5.1JDBC简介(2)commit().提交数据库的更改,使更改生效。方法调用如下:ConnectionObjectName.commit();(3)createStatement().创建SQL语句对象。方法调用如下:Statementsqlstatementname=connectionname.createStatement();Statementsqlstatementname=connectionname.createStatement(inttype,intconcurency);

其中,connection_name为己经有的数据库连接对象的名称。第一种方法返回的SQL语句用于执行基本的SQL语句。第一种方法中参数type决定返回的语句在查询后的结果记录集。参数concurency决定是否用记录集更新数据库中的表。上一页下一页返回5.1JDBC简介①参数inttype。

ResultSet.TYPEFORWORDONLY结果集的游标只能向下滚动。

ResultSet.TYPESCROLLINSENSITIVE结果集的游标可以上下移动,当数据库变化时,当前结果集不变。

ResultSet.TYPESCROLLSENSITIVE返回可滚动的结果集,当数据库变化时,当前结果集同步改变。②参数intconcurrency。

ResultSet.CONCURREADONLY不能用结果集更新数据库中的表。

ResultSet.CONCURUPDATETABLE能用结果集更新数据库中的表。上一页下一页返回5.1JDBC简介(4)getAutoCommit():获取当前自动提交状态。返回值是一个布尔型,如果为自动提交状态返回true,否则返回false。方法调用如下:ConnectionObjectName.getAutoCommit();(5)isClosed():判断连接是否已经关闭。如果已经关闭返回true,否则返回false。方法调用如下:ConnectionObjectName.isClosed();(6)isReadOnly():判断连接是否在只读状态。如果是只读状态返回true,否则返回fasle。调用如下:ConnectionObjectName.isReadOnly();上一页下一页返回5.1JDBC简介(7)rollback():回滚上一次提交/回滚操作后的所有更改,并释放Connection当前保持的任何数据库锁,只有禁止自动提交的时候可以使用该方法。方法调用如下:ConnectionObjectName.rollback();C8)setAutoCommit():设置连接是否为自动提交状态。默认状态,处于自动提交。方法调用如下:ConnectionObjectName.setAutoCommit(booleanautoCommit)

参数autoCommit如果为true则启用自动提交,这个连接的所有SQL语句将被作为单个事物被提交,否则禁止自动提交,这个连接的所有SQL语句将被分为事物组。上一页下一页返回5.1JDBC简介(9)setReadOnly():设置一个连接为是否为只读模式。方法调用如下:ConnectionObjectName.setReadOnly(booleanreadOnly)

参数readOnly如果为true,则可以设置只读模式,否则禁止只读模式,即不能在事物执行时调用setReadOnly()。5.1.3StatementStatement对象用于执行静态sQL语句并返回它所生成结果的对象。在默认情况下,同一时间每个Statement对象只能打开一个ResultSet。因此,如果读取一个ResultSet对象与读取另一个交义,则这两个对象必须是由不同的Statement对象生成的。如果当前ResultSet对象己经被打开,则Statement接口中的所有执行方法都会隐式关闭它。上一页下一页返回5.1JDBC简介Statement对象用于将SQL语句发送到数据库中。实际上有3种Statement对象,它们都作为在给定连接上执行SQL:Statement,PreparedStatement(它从Statement继承而来)和CallableStatement(它从PreparedStatement继承而来)。它们都专用于发送特定类型的语句:Statement对象用T.执行不带参数的简单SQL;PreparedStatement对象用T.执行带或不带IN参数的预编译SQL语句;CallableStatement对象用于执行对数据库己存储过程的调用。

Statement接口提供了执行语句和获取结果的基本方法。PreparedStatement接口添加了处理参数的方法;而CallableStatement添加了处理参数的方法。上一页下一页返回5.1JDBC简介Statement常用的方法如下。(1)cancel()。如果DBMSIII驱动程序都支持中止SQL,则取消此Statement。方法调用如下:StatementObjectName.cancel();(2)clearBatch()。清空此Statement对象的当前SQL命令列表。方法调用如下:StatementObjectName.clearBatch();(3)close()。立即释放此Statement对象的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作。方法调用如下:StatementObjectName.close();上一页下一页返回5.1JDBC简介(4)execute(Stringsql)。执行给定的SQL,该语句可一能返回多个结果。方法调用如下:StatementObjectName.execute(Stringsql):(5)executeBatch()。将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。方法调用如下:StatementObjectName.executeBatch();(6)executeQuery(Stringsql)。执行给定的SQL语句,该语句返回单个ResultSet对象。方法调用如下:StatementObjectName.executeQuery(Stringsql);上一页下一页返回5.1JDBC简介(7)executeUpdate(Stringsql)。执行给定SQL语句,该语句可一能为INSERT,UPDATE或DELETE语句,或者不返回任何内容的SQL语句(如SQLDDL语句)。方法调用如下:StatementObjectName.executeUpdate(Stringsql);(8)getMaxRows()。获取由此Statement对象生成的ResultSet对象可以包含的最大行数。方法调用如下:StatementObjectName.getMaxRows();(9)getResultSet()。以ResultSet对象的形式获取当前结果。方法调用如下:StatementObjectName.getResultSet()上一页下一页返回5.1JDBC简介(10)getUpdateCount()。以更新计数的形式获取当前结果;如果结果为ResultSet对象或没有更多结果,则返回-1。方法调用如下:StatementObjectName.qetUpdateCount();5.1.4PreparedStatementPreparedStatement对象封装了一条预编译的SQL语句,可用于高效地多次执行该语句。从Statement继承,它继承了Statement的所有功能。另外还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。同时,3种方法execute(),executeQuery()和executeUpdate()已被更改,不再需要参数。这些方法的Statement形式(接受SQL语句参数的形式)不应该用于PreparedStatement对象。上一页下一页返回5.1JDBC简介1.创建PreparedStatement对象以下的代码段(其中con是Connection对象)创建包含带两个IN参数占位符的SQL语句的PreparedStatement对象:PreparedStatementpstmt=con.prepareStatement("UPDATEtableSETn=?WHEREx=?”);pstmt对象包含语句”UPDATEtableSETn=?WHEREx=?",它已发送给DBMS,并为执行做好了准备。上一页下一页返回5.1JDBC简介2.传递IN参数在执行PreparedStatement对象之前,必须设置每个参数的值。这可一通过调用setXXX方法来完成,其中XXX是与该参数相应的类型。例如,如果参数具有Java类型long,则使用的方法就是setLong()osetXXX方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为987654321,第一个参数设为100000000:pstmt.setLong(1,987654321);pstmt.setLong(2,100000000);上一页下一页返回5.1JDBC简介

一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters方法清除它为止。在连接的默认模式下(启用自动提交),当语句完成时将自动提交或还原该语句。如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个PreparedStatement可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement对象代替Statement对象来提高性能是没有意义的。

3.IN参数中数据类型的一致性

setXXX方法中的XXX是Java类型。它是一种隐含的JDBC类型(一般SQL类型),因为驱动程序将把Java类型映射为相应的JDBC类型,并将该JDBC类型发送给数据库。上一页下一页返回5.1JDBC简介5.1.5CallableStatementCallableStatement对象为所有的数据库管理系统提供了一种以标准形式调用已存储过程(已经存在数据库中)的方法。CallableStatement接口允许使用SQL语句来调用存储过程。这些程序可以拥有输入和输出参数;可以有返回值;有能力返回多个ResultSet。在JDBC中,存储过程调用在概念上是对数据库的单一调用,但与存储过程相关联的程序可以拥有数以百计的数据库清求。存储过程程序还可以执行许多其他通常不是使用SQL语句执行的程序任务。上一页下一页返回5.1JDBC简介

由于CallableStatement遵循将准备与处理阶段分开这种PreparedStatement模型,所以它们有可能进行最优贡新使用。由于存储过程的SQL语句绑定到程序中,所以可以将它们作为静态SQL处理,并A能够以该方式获得进一步的性能增益。一个以最优方式使用存储过程的小例是将许多数据库工作封装在单一可贡新使用的数据库调用中。

1.创建CallableStatementCallableStatement对象是用Connectiond对象的prepareCall()方法来创建的。对于prepareStatement方法,必须在创建CallableStatement对象时提供SQL语句。在那个时候,对SQL语句进行预编译。例如,假定已存在名为myConn的Connection对象,以下程序语句将创建CallableStatement对象并完成用于获取已可以在数据库中进行处理的SQL语句的准备阶段:上一页下一页返回5.1JDBC简介PreparedStatementps=myConn.prepareStatement(”?=CALLaddStudent(?,?,?”));addStudent存储过程对新学生姓名、班级号以及系别标识接收输入参数。根据此信息,可使用关于学生的信息(如他的入学日期等)来更新多个学生数据库表。

addStudent存储过程带有返回值。返回码可以是成功代码,也可以是在发生故障时可由调用程序使用的故障代码,还可以将返回值定义成新学生的学号。最后,存储过程程序可以以内部方式处理查询并保持来自那些查询的ResultSet处于打开状态目可供调用程序使用。通过所返回的ResultSet来查询有关新学生的所有信息并使其可供调用者使用是合理的。上一页下一页返回5.1JDBC简介5.1.6ResultSetResultSet对象提供对通过运行查询生成的结果的访问。在概念上,可以将ResultSet的数据想象成一个带有特定数目个列以及特定数目个行的表。在默认情况下,表的行是按顺序检索的。在一行中,可以用get()方法按任何次序访问列值。可以通过使用列的索引或名字来获取。列索引从1开始,通常使用列的索引更有效。

ResultSet对象的常用方法如下所小(如下所有的StatementObjectName是生成的Statement类对象的名称)。上一页下一页返回5.1JDBC简介(1)absolute()。记录游标可以上下移动时,此方法用来移动当前游标。方法调用如下:StatementObjectName.absolute(introw);

参数如果是正数,表示记录从开始起移动的指定个数,如果为负数,则表示倒数。如果移动到第一行的前面或最后一行的后面,此方法返回false。

(2)afterLast()。将游标移到结果集最后一行之后。方法调用如下:StatementObjectName.afterLast();(3)beforeFirst()。将游标移动到结果集的初始位置,即在第一行之前。方法调用如下:StatementObjectName.beforeFirst();上一页下一页返回5.1JDBC简介(4)close()。(5)first()。将游标移到结果集的第一行。方法调用如下:StatementObjectName.first();(6)get***()。取当前行的列值。其中***代表,BooleanByteBytesDateDoubleFloatInt,LongShort或String等。根据列值的类型不同采用不同的方法来处理。方法调用如下:StatementObjectName.get***(intcolumn工ndex);

或StatementObjectName.get***(StringcolunmName),上一页下一页返回5.1JDBC简介(7)getRow()。得到当前游标所指向行的行号,行号从1开始,如果结果集没有行,返回0。方法调用如下:StatementObjectName.getRow();(8)isAfterLast()。判断游标是否在最后一行之后。方法调用如下:StatementObjectName.isAfterLast();(9)isBeforeFirst()。判断游标是否在第一行之前。方法调用如下:StatementObjectName.isBeforeFirst();(10)isFirst()。判断游标是否指向结果集的第一行。方法调用如下:StatementObjectName.isFirst();上一页下一页返回5.1JDBC简介(11)last()。将游标移到结果集的最后一行。方法调用如下:StatementObjectName.last();(12)next()。该方法把当前记录游标往下移动一行。ResultSet初始定位于它的第一行之前。如果当前行有效返回true,否则返回false。方法调用如下:StatementObjectName.next();(13)previous()。将游标向上移动,该方法返回Boolean型数据,当移到结果集第一行之前时,返回false。方法调用如下:StatementObjectName.previous();上一页返回5.2访问Access

介绍完数据库操作的方法,现在用这个方法实现数据库的操作。

温馨提示

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

评论

0/150

提交评论