JDBC基本教程之毗连
当前位置:以往代写 > JAVA 教程 >JDBC基本教程之毗连
2019-06-14

JDBC基本教程之毗连

JDBC基本教程之毗连

副标题#e#

Connection 工具代表与数据库的毗连。毗连进程包罗所执行的 SQL 语句和在该毗连上所返回的功效。一个应用措施可与单个数据库有一个或多个毗连,可能可与许大都据库有毗连。2.1.1 打开毗连与数据库成立毗连的尺度要领是挪用DriverManager.getConnection要领。该要领接管含有某个 URL 的字符串。DriverManager 类(即所谓的 JDBC打点层)将实验找到可与谁人 URL 所代表的数据库举办毗连的驱动措施。DriverManager 类存有已注册的 Driver 类的清单。当挪用要领 getConnection 时,它将查抄清单中的每个驱动措施,直到找到可与URL 中指定的数据库举办毗连的驱动措施为止。Driver 的要领connect 利用这个 URL来成立实际的毗连。

用户可绕过 JDBC 打点层直接挪用 Driver 要领。这在以下非凡环境下将很有用:当两个驱动器可同时毗连到数据库中,而用户需要明晰地选用个中特定的驱动器。但一般环境下,让 DriverManager 类处理惩罚打开毗连这种事将更为简朴。

下述代码显示如何打开一个与位于 URL "jdbc:odbc:wombat" 的数据库的毗连。所用的用户标识符为 "oboy" ,口令为 "12Java":

String url = "jdbc:odbc:wombat";
Connection con = DriverManager.getConnection(url, "oboy", "12Java");

2.1.2 一般用法的 URL由于 URL 常引起夹杂,我们将先对一般 URL 作简朴说明,然后再接头 JDBC URL。

URL(统一资源定位符)提供在 Internet 上定位资源所需的信息。可将它想象为一个地点。URL 的第一部份指定了会见信息所用的协议,后头老是随着冒号。常用的协议有"ftp"(代表“文件传输协议”)和 "http" (代表“超文本传输协议”)。假如协议是 "file",暗示资源是在某个当地文件系统上而非在 Internet 上(下例用于暗示我们所描写的部门;它并非 URL 的构成部门)。

ftp://javasoft.com/docs/JDK-1_apidocs.zip
http://java.sun.com/products/jdk/CurrentRelease
file:/home/haroldw/docs/books/tutorial/summary.html

URL 的其余部份(冒号后头的)给出了数据资源所处位置的有关信息。假如协议是 file,则 URL 的其余部份是文件的路径。对付 ftp 和http 协议,URL 的其余部份标识了主机并可选地给出某个更详尽的地点路径。譬喻,以下是 JavaSoft 主页的URL。该 URL 只标识了主机:

http://java.sun.com从该主页开始欣赏,就可以进到很多其它的网页中,个中之一就是JDBC 主页。JDBC 主页的 URL 更为详细,它看起来雷同: http://java.sun.com/products/jdbc

2.1.3 JDBC URL

JDBC URL 提供了一种标识数据库的要领,可以使相应的驱动措施能识别该数据库并与之成立毗连。实际上,驱动措施编程员将抉择用什么 JDBC URL 来标识特定的驱动措施。用户不必体贴如何来形成JDBC URL;他们只须利用与所用的驱动措施一起提供的 URL 即可。JDBC 的浸染是提供某些约定,驱动措施编程员在结构他们的 JDBC URL 时应该遵循这些约定。

由于 JDBC URL 要与各类差异的驱动措施一起利用,因此这些约定应很是机动。首先,它们应答允差异的驱动措施利用差异的方案来定名数据库。譬喻, odbc 子协议答允(但并不是要求) URL 含有属性值。第二,JDBC URL 应答允驱动措施编程员将一切所需的信息编入个中。这样就可以让要与给定命据库对话的 applet 打开数据库毗连,而无必要求用户去做任何系统打点事情。第三, JDBC URL 应答允某种水平的间接性。也就是说,JDBC URL 可指向逻辑主机或数据库名,而这种逻辑主机或数据库名将由网络定名系统动态地转换为实际的名称。这可以使系统打点员不必将特定主机声明为JDBC 名称的一部份。网络定名处事(譬喻 DNS、 NIS 和DCE )有多种,而对付利用哪种定名处事并无限制。JDBC URL 的尺度语法如下所示。它由三部门构成,各部门间用冒号脱离:

jdbc:< 子协议 >:< 子名称 >

JDBC URL 的三个部门可解析如下: jdbc ─ 协议。

JDBC URL 中的协议老是 jdbc。

<子协议> ─ 驱动措施名或数据库毗连机制(这种机制可由一个或多个驱动措施支持)的名称。子协议名的典范示例是 "odbc",该名称是为用于指定 ODBC 气势气魄的数据资源名称的 URL 专门保存的。譬喻,为了通过JDBC-ODBC 桥来会见某个数据库,可以用如下所示的 URL:

jdbc:odbc:fred

本例中,子协议为 "odbc",子名称 "fred" 是当地ODBC 数据资源。

假如要用网络定名处事(这样 JDBC URL 中的数据库名称不必是实际名称),则定名处事可以作为子协议。譬喻,可用如下所示的 URL :jdbc:dcenaming:accounts-payable本例中,该 URL 指定了当地 DCE 定名处事应该将数据库名称 "accounts-payable" 理会为更为详细的可用于毗连真实数据库的名称。<子名称> ─ 一种标识数据库的要领。子名称可以依差异的子协议而变革。它还可以有子名称的子名称(含有驱动措施编程员所选的任何内部语法)。利用子名称的目标是为定位数据库提供足够的信息。前例中,因为 ODBC 将提供其余部份的信息,因此用 "fred" 就已足够。然而,位于长途处事器上的数据库需要更多的信息。譬喻,假如数据库是通过Internet 来会见的,则在 JDBC URL 中应将网络地点作为子名称的一部份包罗进去,且必需遵循如下所示的尺度 URL 定名约定://主机名:端口/子协议假设 "dbnet" 是个用于将某个主机毗连到 Internet 上的协议,则 JDBC URL 雷同:

#p#分页标题#e#

jdbc:dbnet://wombat:356/fred 2.1.4 "odbc" 子协议子协议 odbc 是一种非凡环境。它是为用于指定 ODBC 气势气魄的数据资源名称的 URL 而保存的,并具有下列特性:答允在子名称(数据资源名称)后头指定任意多个属性值。odbc 子协议的完整语法为: jdbc:odbc:< 数据资源名称 >[;< 属性名 >=< 属性值 >]*

因此,以下都是正当的 jdbc:odbc 名称:

jdbc:odbc:qeor7jdbc:odbc:wombat
jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
jdbc:odbc:qeora;UID=kgh;PWD=fooey

2.1.5 注册子协议驱动措施编程员可保存某个名称以将之用作 JDBC URL 的子协议名。

当 DriverManager 类将此名称加到已注册的驱动措施清单中时,为之保存该名称的驱动措施应能识别该名称并与它所标识的数据库成立毗连。譬喻,odbc 是为 JDBC- ODBC 桥而保存的。

示例之二,假设有个 Miracle 公司,它大概会将 "miracle" 注册为毗连到其Miracle DBMS 上的JDBC 驱动措施的子协议,从而使其他人都无法利用这个名称。JavaSoft 今朝作为非正式署理认真注册 JDBC 子协议名称。要注册某个子协议名称,请发送电子邮件到下述地点:

[email protected]


#p#副标题#e#

2.1.6 发送

SQL 语句毗连一旦成立,就可用来向它所涉及的数据库传送 SQL 语句。JDBC对可被发送的 SQL 语句范例不加任何限制。这就提供了很大的机动性,即答允利用特定的数据库语句或甚至于非 SQL 语句。然而,它要求用户本身认真确保所涉及的数据库可以处理惩罚所发送的 SQL 语句,不然将自食其果。譬喻,假如某个应用措施试图向不支持储存措施的DBMS 发送储存措施挪用,就会失败并将抛出异常。JDBC 要求驱动措施应至少能提供 ANSI SQL-2 Entry Level 成果才可算是切合 JDBC尺度TM 的。这意味着用户至少可信赖这一尺度级此外成果。JDBC 提供了三个类,用于向数据库发送 SQL 语句。Connection 接口中的三个要领可用于建设这些类的实例。下面列出这些类及其建设要领:

Statement ─ 由要领 createStatement 所建设。Statement 工具用于发送简朴的SQL 语句。

PreparedStatement ─ 由要领 prepareStatement 所建设。

PreparedStatement 工具用于发送带有一个或多个输入参数( IN 参数)的 SQL 语句。PreparedStatement 拥有一组要领,用于配置 IN 参数的值。

执行语句时,这些 IN 参数将被送到数据库中。PreparedStatement 的实例扩展了 Statement ,因此它们都包罗了 Statement 的要领。

PreparedStatement 工具有大概比 Statement 工具的效率更高,因为它已被预编译过并存放在那以供未来利用。

CallableStatement ─ 由要领 prepareCall 所建设。CallableStatement 工具用于执行 SQL 储存措施 ─ 一组可通过名称来挪用(就象函数的挪用那样)的SQL 语句。CallableStatement 工具从 PreparedStatement 中担任了用于处理惩罚 IN 参数的要领,并且还增加了用于处理惩罚 OUT 参数和 INOUT 参数的要领。

以下所列提供的要领可以快速抉择应用哪个 Connection 要领来建设差异范例的SQL 语句:

createStatement 要领用于:简朴的 SQL 语句(不带参数) prepareStatement 要领用于: 带一个或多个IN 参数的 SQL 语句 常常被执行的简朴 SQL 语句prepareCall 要领用于: 挪用已储存进程2.1.7 事务事务由一个或多个这样的语句构成:这些语句已被执行、完成并被提交或还原。当挪用要领 commit 或 rollback 时,当前事务即告就竣事,另一个事务随即开始。

缺省环境下,新毗连将处于自动提交模式。也就是说,当执行完语句后,将自动对谁人语句挪用 commit 要领。这种环境下,由于每个语句都是被单独提交的,因此一个事务只由一个语句构成。假如禁用自动提交模式,事务将要比及 commit 或rollback 要领被显式挪用时才竣事,因此它将包罗上一次挪用 commit 或rollback 要领以来所有执行过的语句。对付第二种环境,事务中的所有语句将作为组来提交或还原。

要领 commit 使 SQL 语句对数据库所做的任何变动成为永久性的,它还将释放事务持有的全部锁。而要领 rollback 将弃去那些变动。

#p#分页标题#e#

有时用户在另一个变动生效前不想让此变动生效。这可通过禁用自动提交并将两个更新组合在一个事务中来到达。假如两个更新都是乐成,则挪用 commit 要领,从而使两个更新功效成为永久性的;假如个中之一或两个更新都失败了,则挪用 rollback 要领,以将值规复为举办更新之前的值。

大大都 JDBC 驱动措施都支持事务。事实上,切合 JDBC 的驱动措施必需支持事务。DatabaseMetaData 给出的信息描写 DBMS 所提供的事务支持程度。

2.1.8 事务断绝级别

假如 DBMS 支持事务处理惩罚,它必需有某种途径来打点两个事务同时对一个数据库举办操纵时大概产生的斗嘴。用户可指定事务断绝级别,以指明DBMS 应该花多大精神来办理潜在斗嘴。譬喻,当事务变动了某个值而第二个事务却在该变动被提交或还原前读取该值时该怎么办 假设第一个事务被还原后,第二个事务所读取的变动值将是无效的,那么是否可答允这种斗嘴? JDBC 用户可用以下代码来指示 DBMS 答允在值被提交前读取该值(“dirty 读取”),个中 con 是当前毗连:

con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);

事务断绝级别越高,为制止斗嘴所花的精神也就越多。Connection 接口界说了五级,个中最初级别指定了基础就不支持事务,而第一流别则指定当事务在对某个数据库举办操纵时,任何其它事务不得对谁人事务正在读取的数据举办任何变动。凡是,断绝级别越高,应用措施执行的速度也就越慢(由于用于锁定的资源淹灭增加了,而用户间的并发操纵淘汰了)。在抉择回收什么断绝级别时,开拓人员必需在机能需求和数据一致性需求之间举办衡量。虽然,实际所能支持的级别取决于所涉及的 DBMS 的成果。

当建设 Connection 工具时,其事务断绝级别取决于驱动措施,但凡是是所涉及的数据库的缺省值。用户可通过挪用 setIsolationLevel要领来变动事务断绝级别。新的级别将在该毗连进程的剩余时间内生效。要想只改变一个事务的事务断绝级别,必需在该事务开始前举办配置,并在该事务竣事后举办复位。我们不倡导在事务的半途对事务断绝级别举办变动,因为这将当即触发 commit 要领的挪用,使在此之前所作的任何变动酿成永久性的。

    关键字:

在线提交作业