⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbctm 指南:入门 - 连接.htm

📁 写给JSP初级程序员的书
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>

  <table><tbody>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>JDBCTM 指南:入门2 - 连接 
      <BR><FONT size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>内容:&nbsp;2&nbsp;-&nbsp;连接本概述是从《JDBCTM&nbsp;Database&nbsp;Access&nbsp;from&nbsp;JavaTM:&nbsp;A&nbsp;Tutorial<BR>and&nbsp;Annotated&nbsp;Reference&nbsp;》这本书中摘引来的。JavaSoft&nbsp;目前正在准备这本书。这本书是一本教程,同时也是&nbsp;JDBC&nbsp;的重要参考手册,它将作为&nbsp;Java&nbsp;系列的组成部份在&nbsp;1997&nbsp;年春季由&nbsp;Addison-Wesley&nbsp;出版公司出版。<BR>2.1&nbsp;概述<BR>Connection&nbsp;对象代表与数据库的连接。连接过程包括所执行的&nbsp;SQL&nbsp;语句和在该连接上所返回的结果。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。<BR>2.1.1&nbsp;打开连接与数据库建立连接的标准方法是调用&nbsp;DriverManager.getConnection<BR>方法。该方法接受含有某个&nbsp;URL&nbsp;的字符串。DriverManager&nbsp;类(即所谓的&nbsp;JDBC&nbsp;管理层)将尝试找到可与那个&nbsp;URL&nbsp;所代表的数据库进行连接的驱动程序。DriverManager&nbsp;类存有已注册的&nbsp;Driver&nbsp;类的清单。当调用方法&nbsp;getConnection&nbsp;时,它将检查清单中的每个驱动程序,直到找到可与&nbsp;URL&nbsp;中指定的数据库进行连接的驱动程序为止。Driver&nbsp;的方法&nbsp;connect&nbsp;使用这个&nbsp;URL&nbsp;来建立实际的连接。<BR>用户可绕过&nbsp;JDBC&nbsp;管理层直接调用&nbsp;Driver&nbsp;方法。这在以下特殊情况下将很有用:当两个驱动器可同时连接到数据库中,而用户需要明确地选用其中特定的驱动器。但一般情况下,让&nbsp;DriverManager&nbsp;类处理打开连接这种事将更为简单。<BR>下述代码显示如何打开一个与位于&nbsp;URL&nbsp;"jdbc:odbc:wombat"&nbsp;的数据库的连接。所用的用户标识符为&nbsp;"oboy"&nbsp;,口令为&nbsp;"12Java":&nbsp;<BR>String&nbsp;url&nbsp;=&nbsp;"jdbc:odbc:wombat";<BR>Connection&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;"oboy",&nbsp;"12Java");<BR>2.1.2&nbsp;一般用法的&nbsp;URL由于&nbsp;URL&nbsp;常引起混淆,我们将先对一般&nbsp;URL&nbsp;作简单说明,然后再讨论&nbsp;JDBC&nbsp;URL。<BR>URL(统一资源定位符)提供在&nbsp;Internet&nbsp;上定位资源所需的信息。可将它想象为一个地址。<BR>URL&nbsp;的第一部份指定了访问信息所用的协议,后面总是跟着冒号。常用的协议有&nbsp;"ftp"(代表“文件传输协议”)和&nbsp;"http"&nbsp;(代表“超文本传输协议”)。<BR>如果协议是&nbsp;"file",表示资源是在某个本地文件系统上而非在&nbsp;Internet&nbsp;上(下例用于表示我们所描述的部分;它并非&nbsp;URL&nbsp;的组成部分)。<BR>ftp://javasoft.com/docs/JDK-1_apidocs.zip<BR>http://java.sun.com/products/jdk/CurrentRelease<BR>file:/home/haroldw/docs/books/tutorial/summary.html<BR>URL&nbsp;的其余部份(冒号后面的)给出了数据资源所处位置的有关信息。如果协议是&nbsp;file,则&nbsp;URL&nbsp;的其余部份是文件的路径。对于&nbsp;ftp&nbsp;和&nbsp;http&nbsp;协议,URL&nbsp;的其余部份标识了主机并可选地给出某个更详尽的地址路径。例如,以下是&nbsp;JavaSoft&nbsp;主页的&nbsp;URL。该&nbsp;URL&nbsp;只标识了主机:&nbsp;<BR>http://java.sun.com从该主页开始浏览,就可以进到许多其它的网页中,其中之一就是<BR>JDBC&nbsp;主页。JDBC&nbsp;主页的&nbsp;URL&nbsp;更为具体,它看起来类似:&nbsp;http://java.sun.com/products/jdbc<BR>2.1.3&nbsp;JDBC&nbsp;URL&nbsp;JDBC&nbsp;URL&nbsp;提供了一种标识数据库的方法,可以使相应的驱动程序能识别该数据库并与之建立连接。实际上,驱动程序编程员将决定用什么&nbsp;JDBC&nbsp;URL&nbsp;来标识特定的驱动程序。用户不必关心如何来形成&nbsp;JDBC&nbsp;URL;他们只须使用与所用的驱动程序一起提供的&nbsp;URL&nbsp;即可。JDBC&nbsp;的作用是提供某些约定,驱动程序编程员在构造他们的&nbsp;JDBC&nbsp;URL&nbsp;时应该遵循这些约定。<BR>由于&nbsp;JDBC&nbsp;URL&nbsp;要与各种不同的驱动程序一起使用,因此这些约定应非常灵活。首先,它们应允许不同的驱动程序使用不同的方案来命名数据库。例如,&nbsp;odbc&nbsp;子协议允许(但并不是要求)&nbsp;URL&nbsp;含有属性值。第二,JDBC&nbsp;URL&nbsp;应允许驱动程序编程员将一切所需的信息编入其中。这样就可以让要与给定数据库对话的&nbsp;applet&nbsp;打开数据库连接,而无须要求用户去做任何系统管理工作。<BR>第三,&nbsp;JDBC&nbsp;URL&nbsp;应允许某种程度的间接性。也就是说,JDBC&nbsp;URL&nbsp;可指向逻辑主机或数据库名,而这种逻辑主机或数据库名将由网络命名系统动态地转换为实际的名称。这可以使系统管理员不必将特定主机声明为&nbsp;JDBC&nbsp;名称的一部份。网络命名服务(例如&nbsp;DNS、&nbsp;NIS&nbsp;和&nbsp;DCE&nbsp;)有多种,而对于使用哪种命名服务并无限制。JDBC&nbsp;URL&nbsp;的标准语法如下所示。它由三部分组成,各部分间用冒号分隔:&nbsp;<BR>jdbc:&lt;&nbsp;子协议&nbsp;&gt;:&lt;&nbsp;子名称&nbsp;&gt;JDBC&nbsp;URL&nbsp;的三个部分可分解如下:&nbsp;jdbc&nbsp;─&nbsp;协议。JDBC&nbsp;URL&nbsp;中的协议总是&nbsp;jdbc。<BR>&lt;子协议&gt;&nbsp;─&nbsp;驱动程序名或数据库连接机制(这种机制可由一个或多个驱动程序支持)的名称。子协议名的典型示例是&nbsp;"odbc",该名称是为用于指定&nbsp;ODBC&nbsp;风格的数据资源名称的&nbsp;URL&nbsp;专门保留的。例如,为了通过&nbsp;JDBC-ODBC&nbsp;桥来访问某个数据库,可以用如下所示的&nbsp;URL:&nbsp;<BR>jdbc:odbc:fred本例中,子协议为&nbsp;"odbc",子名称&nbsp;"fred"&nbsp;是本地ODBC&nbsp;数据资源。<BR>如果要用网络命名服务(这样&nbsp;JDBC&nbsp;URL&nbsp;中的数据库名称不必是实际名称),则命名服务可以作为子协议。例如,可用如下所示的&nbsp;URL&nbsp;:&nbsp;<BR>jdbc:dcenaming:accounts-payable本例中,该&nbsp;URL&nbsp;指定了本地&nbsp;DCE&nbsp;命名服务应该将<BR>数据库名称&nbsp;"accounts-payable"&nbsp;解析为更为具体的可用于连接真实数据库的名称。&lt;子名称&gt;&nbsp;─&nbsp;一种标识数据库的方法。子名称可以依不同的子协议而<BR>变化。它还可以有子名称的子名称(含有驱动程序编程员所选的任何内部语法)。使用子名称的目的是为定位数据库提供足够的信息。前<BR>例中,因为&nbsp;ODBC&nbsp;将提供其余部份的信息,因此用&nbsp;"fred"&nbsp;就已足够。然而,位于远程服务器上的数据库需要更多的信息。例如,如果数据库是通过&nbsp;Internet&nbsp;来访问的,则在&nbsp;JDBC&nbsp;URL&nbsp;中应将网络地址作为子名称的一部份包括进去,且必须遵循如下所示的标准&nbsp;URL&nbsp;命名约定:&nbsp;<BR>//主机名:端口/子协议假设&nbsp;"dbnet"&nbsp;是个用于将某个主机连接到&nbsp;Internet&nbsp;上的协议,则&nbsp;JDBC&nbsp;URL&nbsp;类似:<BR>jdbc:dbnet://wombat:356/fred&nbsp;2.1.4&nbsp;"odbc"&nbsp;子协议<BR>子协议&nbsp;odbc&nbsp;是一种特殊情况。它是为用于指定&nbsp;ODBC&nbsp;风格的数据资源名称的&nbsp;URL&nbsp;而保留的,并具有下列特性:允许在子名称(数据资源名称)后面指定任意多个属性值。odbc&nbsp;子协议的完整语法为:&nbsp;jdbc:odbc:&lt;&nbsp;数据资源名称&nbsp;&gt;[;&lt;&nbsp;属性名&nbsp;&gt;=&lt;&nbsp;属性值&nbsp;&gt;]*因此,以下都是合法的&nbsp;jdbc:odbc&nbsp;名称:&nbsp;jdbc:odbc:qeor7jdbc:odbc:wombat<BR>jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER<BR>jdbc:odbc:qeora;UID=kgh;PWD=fooey2.1.5&nbsp;注册子协议驱动程序编程员可保留某个名称以将之用作&nbsp;JDBC&nbsp;URL&nbsp;的子协议名。<BR>当&nbsp;DriverManager&nbsp;类将此名称加到已注册的驱动程序清单中时,为之保留该名称的驱动程序应能识别该名称并与它所标识的数据库建立连接。例如,odbc&nbsp;是为&nbsp;JDBC-&nbsp;ODBC&nbsp;桥而保留的。示例之二,假设有个&nbsp;Miracle&nbsp;公司,它可能会将&nbsp;"miracle"&nbsp;注册为连接到其&nbsp;Miracle&nbsp;DBMS&nbsp;上的&nbsp;JDBC&nbsp;驱动程序的子协议,从而使其他人都无法使用这个名称。JavaSoft&nbsp;目前作为非正式代理负责注册&nbsp;JDBC&nbsp;子协议名称。要注册某个子协议名称,请发送电子邮件到下述地址:&nbsp;<BR>jdbc@wombat.eng.sun.com2.1.6&nbsp;发送&nbsp;SQL&nbsp;语句连接一旦建立,就可用来向它所涉及的数据库传送&nbsp;SQL&nbsp;语句。JDBC对可被发送的&nbsp;SQL&nbsp;语句类型不加任何限制。这就提供了很大的灵活性,即允许使用特定的数据库语句或甚至于非&nbsp;SQL&nbsp;语句。然而,它要<BR>求用户自己负责确保所涉及的数据库可以处理所发送的&nbsp;SQL&nbsp;语句,否则将自食其果。例如,如果某个应用程序试图向不支持储存程序的&nbsp;DBMS&nbsp;发送储存程序调用,就会失败并将抛出异常。JDBC&nbsp;要求驱动程序应至少能提供&nbsp;ANSI&nbsp;SQL-2&nbsp;Entry&nbsp;Level&nbsp;功能才可算是符合&nbsp;JDBC&nbsp;标准TM&nbsp;的。这意味着用户至少可信赖这一标准级别的功能。JDBC&nbsp;提供了三个类,用于向数据库发送&nbsp;SQL&nbsp;语句。Connection&nbsp;接口中的三个方法可用于创建这些类的实例。下面列出这些类及其创建方法:&nbsp;<BR>Statement&nbsp;─&nbsp;由方法&nbsp;createStatement&nbsp;所创建。Statement&nbsp;对象用于发送简单的&nbsp;SQL&nbsp;语句。&nbsp;<BR>PreparedStatement&nbsp;─&nbsp;由方法&nbsp;prepareStatement&nbsp;所创建。<BR>PreparedStatement&nbsp;对象用于发送带有一个或多个输入参数(&nbsp;IN&nbsp;参数)<BR>的&nbsp;SQL&nbsp;语句。PreparedStatement&nbsp;拥有一组方法,用于设置&nbsp;IN&nbsp;参数的值。<BR>执行语句时,这些&nbsp;IN&nbsp;参数将被送到数据库中。PreparedStatement&nbsp;的实<BR>例扩展了&nbsp;Statement&nbsp;,因此它们都包括了&nbsp;Statement&nbsp;的方法。<BR>PreparedStatement&nbsp;对象有可能比&nbsp;Statement&nbsp;对象的效率更高,因为它已被预编译过并存放在那以供将来使用。&nbsp;<BR>CallableStatement&nbsp;─&nbsp;由方法&nbsp;prepareCall&nbsp;所创建。CallableStatement&nbsp;对象<BR>用于执行&nbsp;SQL&nbsp;储存程序&nbsp;─&nbsp;一组可通过名称来调用(就象函数的调用那样)的<BR>SQL&nbsp;语句。CallableStatement&nbsp;对象从&nbsp;PreparedStatement&nbsp;中继承了用于<BR>处理&nbsp;IN&nbsp;参数的方法,而且还增加了用于处理&nbsp;OUT&nbsp;参数和&nbsp;INOUT&nbsp;参数的方法。&nbsp;<BR>以下所列提供的方法可以快速决定应用哪个&nbsp;Connection&nbsp;方法来创建不同类型的&nbsp;SQL&nbsp;语句:&nbsp;createStatement&nbsp;方法用于:<BR>简单的&nbsp;SQL&nbsp;语句(不带参数)&nbsp;prepareStatement&nbsp;方法用于:&nbsp;带一个或多个&nbsp;IN&nbsp;参数的&nbsp;SQL&nbsp;语句&nbsp;经常被执行的简单&nbsp;SQL&nbsp;语句<BR>prepareCall&nbsp;方法用于:&nbsp;调用已储存过程2.1.7&nbsp;事务事务由一个或多个这样的语句组成:这些语句已被执行、完成并被提交或还原。当调用方法&nbsp;commit&nbsp;或&nbsp;rollback&nbsp;时,当前事务即告就结束,另一个事务随即开始。<BR>缺省情况下,新连接将处于自动提交模式。也就是说,当执行完语句后,将自动对那个语句调用&nbsp;commit&nbsp;方法。这种情况下,由于每个语句都是被单独提交的,因此一个事务只由一个语句组成。如果禁用自动提交模式,事务将要等到&nbsp;commit&nbsp;或&nbsp;llback&nbsp;方法被显式调用时<BR>才结束,因此它将包括上一次调用&nbsp;commit&nbsp;或&nbsp;rollback&nbsp;方法以来所有执行过的语句。对于第二种情况,事务中的所有语句将作为组来提交或还原。方法&nbsp;commit&nbsp;使&nbsp;SQL&nbsp;语句对数据库所做的任何更改成为永久性的,它还将释放事务持有的全部锁。而方法&nbsp;rollback&nbsp;将弃去那些更改。<BR>有时用户在另一个更改生效前不想让此更改生效。这可通过禁用自动提交并将两个更新组合在一个事务中来达到。如果两个更新都是成功<BR>,则调用&nbsp;commit&nbsp;方法,从而使两个更新结果成为永久性的;如果其中之一或两个更新都失败了,则调用&nbsp;rollback&nbsp;方法,以将值恢复为进行更新之前的值。<BR>大多数&nbsp;JDBC&nbsp;驱动程序都支持事务。事实上,符合&nbsp;JDBC&nbsp;的驱动程序必须支持事务。DatabaseMetaData&nbsp;给出的信息描述&nbsp;DBMS&nbsp;所提供的事务支持水平。2.1.8&nbsp;事务隔离级别如果&nbsp;DBMS&nbsp;支持事务处理,它必须有某种途径来管理两个事务同时对一个数据库进行操作时可能发生的冲突。用户可指定事务隔离级别,以指明&nbsp;DBMS&nbsp;应该花多大精力来解决潜在冲突。例如,当事务更改了某个值而第二个事务却在该更改被提交或还原前读取该值时该怎么办&nbsp;假设第一个事务被还原后,第二个事务所读取的更改值将是无效的,那么是否可允许这种冲突?&nbsp;JDBC&nbsp;用户可用以下代码来指示&nbsp;DBMS&nbsp;允许在值被提交前读取该值(“dirty&nbsp;读取”),其中&nbsp;con&nbsp;是当前连接:&nbsp;<BR>con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);<BR>事务隔离级别越高,为避免冲突所花的精力也就越多。Connection&nbsp;接口定义了五级,其中最低级别指定了根本就不支持事务,而最高级别则指定当事务在对某个数据库进行操作时,任何其它事务不得对那个事务正在读取的数据进行任何更改。通常,隔离级别越高,应用程序执行的速度也就越慢(由于用于锁定的资源耗费增加了,而用户间的并发操作减少了)。在决定采用什么隔离级别时,开发人员必须在性能需求和数据一致性需求之间进行权衡。当然,实际所能支持的级别取决于所涉及的&nbsp;DBMS&nbsp;的功能。<BR>当创建&nbsp;Connection&nbsp;对象时,其事务隔离级别取决于驱动程序,但通常是所涉及的数据库的缺省值。用户可通过调用&nbsp;setIsolationLevel方法来更改事务隔离级别。新的级别将在该连接过程的剩余时间内生效。要想只改变一个事务的事务隔离级别,必须在该事务开始前进行设置,并在该事务结束后进行复位。我们不提倡在事务的中途对事务隔离级别进行更改,因为这将立即触发&nbsp;commit&nbsp;方法的调用,使在<BR>此之前所作的任何更改变成永久性的。<BR><BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -