原文:
原文:
实现允许您在对象之间创建 SQL ,当它们未连接到数据源时。这很重要,因为它节省了必须创建一个或多个连接的开销。
下面涵盖的主题有:
- 创建 JoinRowSet 对象
- 添加 RowSet 对象
- 管理匹配列
接口是接口的子接口,因此继承了对象的功能。这意味着对象是一个断开连接的对象,可以在不始终连接到数据源的情况下运行。
对象充当 SQL 的持有者。来自的以下示例显示了如何创建对象:
变量在添加对象之前不包含任何内容。
任何对象都可以添加到对象中,只要它可以成为 SQL 的一部分。对象始终连接到其数据源,可以添加,但通常通过直接与数据源操作而不是通过添加到对象来成为的一部分。提供实现的目的是使断开连接的对象能够成为关系的一部分。
The owner of The Coffee Break chain of coffee houses wants to get a list of the coffees he buys from Acme, Inc. In order to do this, the owner will have to get information from two tables, and . In the database world before technology, programmers would send the following query to the database:
在技术的世界中,您可以在不向数据源发送查询的情况下实现相同的结果。您可以将包含两个表中数据的对象添加到对象中。然后,因为所有相关数据都在对象中,您可以对其执行查询以获取所需数据。
来自的以下代码片段创建了两个对象,中包含来自表的数据,中包含来自表的数据。和对象必须连接到数据库以执行其命令并获取数据,但完成后,它们不必重新连接以形成。
查看表,您会发现 Acme, Inc. 的标识号为 101。在表中,供应商标识号为 101 的咖啡有哥伦比亚咖啡和哥伦比亚无咖啡因。这两个表的信息可以进行连接,因为两个表都有一个名为的列。在 JDBC 的技术中,所基于的列被称为匹配列。
添加到对象中的每个对象必须具有匹配列,即所基于的列。有两种方法可以为对象设置匹配列。第一种方法是将匹配列传递给方法,如下面的代码所示:
此行代码将的添加到对象中,并将的列设置为匹配列。
此时,中只有。下一个添加到中的对象必须能够与进行,这对于是成立的,因为两个表都有列。下面的代码将添加到中,并将列设置为匹配列。
现在包含了和之间的,所有者可以从中获取 Acme, Inc.供应的咖啡的名称。因为代码没有设置的类型,保持内部 JOIN,这是默认值。换句话说,中的一行组合了中的一行和中的一行。它包含了中的列以及中的列,对于列的值与列的值匹配的行。以下代码打印出由 Acme, Inc.供应的咖啡的名称,其中 等于请注意,这是可能的,因为对象中现在包括了来自的列和来自的列。
这将产生类似以下的输出:
接口提供了用于设置将形成的类型的常量,但目前实现的唯一类型是。
原文:
对象允许您减少在对象中可见的行数,以便您只处理与您正在进行的工作相关的数据。您决定要对数据设置什么限制(如何“过滤”数据),并将该过滤器应用到对象上。换句话说,对象只显示符合您设置限制的数据行。对象始终与其数据源连接,可以通过向数据源发送仅选择您想要查看的列和行的查询来进行此过滤。查询的子句定义了过滤条件。对象提供了一种让断开连接的对象进行此过滤的方法,而无需在数据源上执行查询,从而避免必须连接到数据源并向其发送查询。
例如,假设咖啡休息连锁店已经在美利坚合众国各地发展到数百家店铺,并且所有店铺都列在名为的表中。业主希望通过一款不需要与数据库系统保持持久连接的咖啡店比较应用程序来衡量仅加利福尼亚州的店铺的成功。这种比较将关注销售商品与销售咖啡饮料的盈利能力以及其他各种成功指标,并将按照咖啡饮料销售额、商品销售额和总销售额对加利福尼亚州的店铺进行排名。由于表有数百行数据,如果将搜索的数据量减少到仅包含列中指示加利福尼亚州的行,这些比较将更快更容易进行。
这正是对象通过提供以下功能来解决的问题:
- 能够根据设定的条件限制可见的行
- 能够选择哪些数据可见而无需连接到数据源
下面的主题包括:
- 在谓词对象中定义过滤条件
- 创建 FilteredRowSet 对象
- 创建和设置谓词对象
- 使用新的谓词对象设置 FilteredRowSet 对象以进一步过滤数据
- 更新 FilteredRowSet 对象
- 插入或更新行
- 删除所有过滤器以使所有行可见
- 删除行
要设置对象中哪些行可见的条件,您需要定义一个实现接口的类。使用此类创建的对象将初始化为以下内容:
- 值必须落在的范围的高端
- 值必须落在的范围的低端
- 列名或列号是必须落在高低边界设置的值范围内的值所在的列的列名或列号
请注意,值范围是包容的,这意味着边界处的值包括在范围内。例如,如果范围的高端为 100,低端为 50,则 50 的值被视为在范围内。49 不在范围内。同样,100 在范围内,但 101 不在范围内。
符合业主想要比较加利福尼亚店铺的情景,必须编写一个实现接口的过滤位于加利福尼亚的 Coffee Break 咖啡店的类。没有一种正确的方法来做这件事,这意味着在编写实现的方式上有很大的自由度。例如,您可以随意命名类及其成员,并以任何实现方式编写构造函数和三个评估方法,以实现所需的结果。
列出所有咖啡店的表名为,有数百行。为了使事情更易管理,此示例使用了少得多的行数的表,足以演示如何进行过滤。
列中的值是一个值,表示咖啡店所在的州等信息。例如,以 10 开头的值表示该州是加利福尼亚。以 32 开头的值表示俄勒冈州,以 33 开头的表示华盛顿州。
以下类,,实现了接口:
这是一个非常简单的实现,检查由或指定的列中的值是否在到的范围内,包括边界。以下代码行,来自,创建了一个过滤器,仅允许列值指示介于 10000 和 10999 之间的行,这表示加利福尼亚位置:
请注意,刚刚定义的类仅适用于一列。可以通过将每个参数数组而不是单个值来使其适用于两个或更多列。例如,对象的构造函数可能如下所示:
对象中的第一个元素表示将根据其在和中的第一个元素进行检查的第一列。由指示的第二列中的值将与和中的第二个元素进行检查,依此类推。因此,这三个数组中的元素数量应该相同。下面的代码是方法的一个实现示例,用于对象,其中参数是数组:
使用实现的优势在于可以使用任何类型的参数,并且可以检查一个或多个列,而无需编写另一个实现。但是,您必须传递一个类型,这意味着您必须将原始类型转换为其类型。例如,如果您使用值作为和,则必须在将其传递给构造函数之前将值转换为对象。对象已经是类型,因此您无需转换它们。
使用从类创建的实例来创建对象。以下是来自的示例:
与其他断开连接的对象一样,对象必须从表格数据源(在参考实现中是关系数据库)中填充自身数据。下面来自的代码片段设置了连接到数据库以执行其命令所需的属性。请注意,此代码使用类建立连接,这是为了方便起见。通常情况下,最好使用已在实现了 Java 命名和目录接口(JNDI)的命名服务中注册的对象。
下面的代码行将对象填充了存储在表中的数据:
方法通过调用的对象在后台执行各种操作,该对象创建连接,执行的命令,将填充为从生成的对象中获取的数据,并关闭连接。请注意,如果表的行数超过了对象一次性内存中可以容纳的行数,将使用的分页方法。
在这种情况下,Coffee Break 的所有者将在办公室完成前述任务,然后导入或下载存储在对象中的信息到咖啡馆比较应用程序中。从现在开始,对象将独立运行,不再依赖于与数据源的连接。
现在对象包含了 Coffee Break 商店的列表,您可以为对象中可见的行数设置选择条件以缩小范围。
以下代码行使用先前定义的类来创建对象,该对象检查列以确定哪些商店位于加利福尼亚(如果其 ID 号在 10000 到 10999 之间,则商店位于加利福尼亚):
以下行将设置为的过滤器。
要进行实际过滤,您调用方法,该方法在参考实现中调用您先前实现的方法的适当版本。
如果返回值为,则该行将可见;如果返回值为,则该行将不可见。
您可以串行设置多个过滤器。第一次调用方法并传递一个对象时,您已经应用了该过滤器中的过滤条件。在对每一行调用方法后,只有满足过滤条件的行才会可见,然后您可以再次调用,传递不同的对象。尽管一次只设置一个过滤器,但效果是两个过滤器都会累积应用。
例如,所有者通过将设置为的对象来检索加利福尼亚的 Coffee Break 商店列表。现在所有者想要比较加利福尼亚的两个城市中的商店,旧金山(表中的 SF)和洛杉矶(表中的 LA)。首先要做的是编写一个实现,用于过滤旧金山或洛杉矶的商店:
来自的以下代码片段设置了新的过滤器,并遍历中的行,打印出列包含旧金山或洛杉矶的行。请注意,当前仅包含商店位于加利福尼亚的行,因此当将过滤器更改为另一个对象时,对象的条件仍然有效。接下来的代码将过滤器设置为对象。实现使用数组作为构造函数的参数,以说明可以如何完成:
输出应包含每个位于加利福尼亚旧金山或洛杉矶的商店的行。如果有一行中列包含 LA 且列包含 40003,则不会包含在列表中,因为在将过滤器设置为时已经被过滤掉(40003 不在 10000 到 10999 的范围内)。
您可以对对象进行更改,但前提是该更改不违反当前生效的任何过滤条件。例如,如果新值或值在过滤条件内,则可以插入新行或更改现有行中的一个或多个值。
假设两家新的 Coffee Break 咖啡馆刚刚开业,所有者希望将它们添加到所有咖啡馆的列表中。如果要插入的行不符合当前累积的过滤条件,则将阻止其添加。
对象的当前状态是设置了对象,然后设置了对象。因此,目前仅显示符合两个过滤器条件的行。同样重要的是,除非符合两个过滤器的条件,否则无法向对象添加行。以下代码片段尝试向对象插入两行新行,其中一个行中的和列的值都符合条件,另一个行中的的值不符合过滤条件,但列的值符合:
如果使用方法迭代对象,你会发现旧金山、加利福尼亚州的新咖啡馆的行,但不会看到华盛顿州旧金山的商店的行。
所有者可以通过取消过滤器来添加华盛顿州的商店。没有设置过滤器,对象中的所有行再次可见,任何位置的商店都可以添加到商店列表中。以下代码行取消当前过滤器,有效地使先前在对象上设置的两个实现无效。
如果所有者决定关闭或出售其中一家 Coffee Break 咖啡馆,所有者将希望从表中删除它。只要行可见,所有者就可以删除表现不佳的咖啡馆的行。
例如,假设刚刚使用参数 null 调用了方法,则对象上没有设置任何过滤器。这意味着所有行都是可见的,因此可以删除。然而,在设置了过滤掉除加利福尼亚州以外任何州的对象之后,只有位于加利福尼亚州的商店才能被删除。当为对象设置了对象时,只有旧金山、加利福尼亚州或洛杉矶、加利福尼亚州的咖啡馆可以被删除,因为它们是唯一可见的行。
对象非常特殊,因为除了提供对象的所有功能外,它还可以将自身写入为 XML 文档,并且还可以读取该 XML 文档以将自身转换回对象。由于 XML 是异构企业之间可以相互通信的语言,因此它已成为 Web 服务通信的标准。因此,对象通过使 Web 服务能够以 XML 文档的形式从数据库发送和接收数据来填补了一个真正的需求。
下面涵盖了以下主题:
- 创建和填充 WebRowSet 对象
- 将 WebRowSet 对象写入和读取为 XML
- XML 文档中的内容是什么
- 对 WebRowSet 对象进行更改
Coffee Break 公司已扩展到在线销售咖啡。用户可以从 Coffee Break 网站按磅订购咖啡。价格列表定期更新,通过从公司数据库获取最新信息。本节演示了如何通过对象和单个方法调用将价格数据发送为 XML 文档。
通过使用的实例创建一个新的对象,该实例是从类创建的,用于创建一个对象。以下示例来自:
尽管对象尚无数据,但它具有对象的默认属性。其对象首先设置为实现,这是所有断开连接的对象的默认值。但是,实现会将对象重置为实现。
您可以使用的实例创建一个对象,该实例是从类创建的。有关更多信息,请参见使用 RowSetFactory 接口中的使用 JdbcRowSet 对象。
Coffee Break 总部定期向其网站发送价格列表更新。关于对象的这些信息将展示您可以通过 XML 文档发送最新价格列表的一种方式。
价格列表包括来自表的列和中的数据。以下代码片段设置所需的属性,并使用价格列表数据填充对象:
此时,除了默认属性之外,对象还包含来自表中和列的数据,以及关于这两列的元数据。
要将对象写入 XML 文档,请调用方法。要将该 XML 文档的内容读入对象,请调用方法。这两种方法都在后台执行其工作,除了结果之外,其他都对您不可见。
使用方法
方法将调用它的对象作为表示其当前状态的 XML 文档写入。它将这个 XML 文档写入您传递给它的流。流可以是一个对象,比如一个对象,或者一个对象,比如一个对象。如果您向方法传递一个对象,您将以字节形式写入,可以处理所有类型的数据;如果您向它传递一个对象,您将以字符形式写入。以下代码演示将对象作为 XML 文档写入对象:
以下代码将代表的 XML 文档写入对象,而不是写入对象。类是一个方便的用于向文件写入字符的类。
方法的另外两个版本允许您在将其写入流之前,使用对象的内容填充对象。在下面的代码行中,方法将对象的内容读入对象,然后将作为 XML 文档写入对象:
在下一行代码中,方法将填充为的内容,但将 XML 文档写入对象,而不是写入对象:
使用方法
方法解析 XML 文档以构造 XML 文档描述的对象。与方法类似,您可以向传递一个对象或对象,从中读取 XML 文档。
请注意,您可以将 XML 描述读入一个新的对象中,或者读入调用方法的相同对象中。在从总部发送价格列表信息到网站的情况下,您将使用一个新的对象,如下面的代码所示:
对象不仅包含它们所包含的数据,还包含有关其列的属性和元数据。因此,表示对象的 XML 文档除了数据外还包括其他信息。此外,XML 文档中的数据包括当前值和原始值。 (回想一下,原始值是在对数据进行最近更改之前立即存在的值。这些值对于检查数据库中的相应值是否已更改是必要的,从而创建关于应该持久化哪个值的冲突:您放入对象的新值还是其他人放入数据库中的新值。)
WebRowSet XML 模式本身是一个 XML 文档,定义了表示对象的 XML 文档将包含什么以及必须以什么格式呈现。发送方和接收方都使用此模式,因为它告诉发送方如何编写 XML 文档(表示对象的文档)以及接收方如何解析 XML 文档。由于实际的写入和读取是由和方法的实现在内部完成的,因此作为用户,您不需要了解 WebRowSet XML 模式文档中的内容。
XML 文档以分层结构包含元素和子元素。以下是描述对象的 XML 文档中的三个主要元素:
- 属性
- 元数据
- 数据
元素标签表示元素的开始和结束。例如,标签表示属性元素的开始,标签表示其结束。标签是一种简写方式,表示尚未为地图子元素(属性元素中的一个子元素)分配值。以下示例 XML 文档使用间距和缩进使其更易于阅读,但在实际的 XML 文档中不使用这些,其中间距不表示任何内容。
接下来的三个部分向您展示了在示例中创建的 对象的三个主要元素包含什么。
属性
在对象上调用方法将生成描述的 XML 文档。此 XML 文档的属性部分将如下所示:
请注意,某些属性没有值。例如,属性用标签表示,这是一种简写方式,表示。没有给出值,因为已设置属性。建立的任何连接将使用此 JDBC URL 完成,因此不需要设置对象。此外,和属性未列出,因为它们必须保持机密。
元数据
描述对象的 XML 文档的元数据部分包含有关该对象中列的信息。以下显示了描述对象的对象的此部分的外观。因为对象有两列,描述它的 XML 文档有两个元素。每个元素都有子元素提供有关所描述列的信息。
从这个元数据部分,你可以看到每行中有两列。第一列是,它保存类型的值。第二列是,它保存类型的值,等等。请注意,列类型是数据源中使用的数据类型,而不是 Java 编程语言中的类型。要获取或更新列中的值,你可以使用或方法,驱动程序会将其转换为类型,就像通常做的那样。
数据
数据部分提供了对象每行中每列的值。如果你已经填充了对象并且没有对其进行任何更改,XML 文档的数据元素将如下所示。在下一节中,你将看到当你修改对象中的数据时,XML 文档如何变化。
每一行都有一个元素,因为有两列,所以每个元素包含两个元素。
对对象进行更改的方式与对对象相同。然而,与对象不同,对象会跟踪更新、插入和删除,以便方法可以写入当前值和原始值。接下来的三个部分演示了对数据进行更改,并展示了描述对象的 XML 文档在每次更改后的样子。关于 XML 文档,你无需做任何事情;任何对它的更改都是自动进行的,就像写入和读取 XML 文档一样。
插入行
如果 Coffee Break 连锁店的老板想要在价格表中添加一种新的咖啡,代码可能如下所示:
在参考实现中,插入会立即在当前行之后进行。在前面的代码片段中,当前行是第三行,因此新行将在第三行之后添加,并成为新的第四行。为了反映这个插入,XML 文档将在元素中第三个元素之后添加以下元素。
元素看起来类似于以下内容。
所有者认为浓缩咖啡销售不足,应从 The Coffee Break 商店出售的咖啡中移除。因此,所有者希望从价格表中删除浓缩咖啡。浓缩咖啡位于对象的第三行,因此以下代码行将其删除:
以下元素将出现在 XML 文档数据部分的第二行之后,表示第三行已被删除。
所有者进一步决定哥伦比亚咖啡的价格太贵,想将其降至每磅$6.99。以下代码设置了哥伦比亚咖啡的新价格,即第一行为每磅$6.99:
XML 文档将在元素中反映这一变化,给出新值。第一列的值未更改,因此仅有第二列的元素:
此时,通过插入一行、删除一行和修改一行,对象的 XML 文档将如下所示:
示例展示了本页面描述的所有功能。
原文:
本节介绍的高级数据类型使关系数据库在表列值方面更加灵活。例如,列可以用于存储 (二进制大对象)值,可以以原始字节形式存储非常大量的数据。列也可以是 (字符大对象)类型,能够以字符格式存储非常大量的数据。
ANSI/ISO SQL 标准的最新版本通常被称为 SQL:2003。该标准指定了以下数据类型:
- SQL92 内置类型,包括熟悉的 SQL 列类型,如 、 和
- SQL99 内置类型,包括 SQL99 添加的类型:
- : 布尔(真或假)值
- : 二进制大对象
- : 字符大对象
- SQL:2003 添加的新内置类型:
- : XML 对象
- 用户定义类型:
- 结构化类型: 用户定义类型; 例如:
- 类型: 基于内置类型的用户定义类型; 例如:
- 构造类型: 基于给定基本类型的新类型:
- : 持久地指示驻留在数据库中的结构化类型实例的指针
- : n 个基本类型元素的数组
- 定位器: 逻辑指针,指向驻留在数据库服务器上的数据。定位器 存在于客户端计算机上,是对服务器上数据的瞬时、逻辑指针。定位器通常指向无法在客户端上具体化的数据,如图像或音频。(具体化视图 是事先存储或“具体化”为模式对象的查询结果。) 在 SQL 级别定义了操作符,用于检索由定位器指示的数据的随机访问部分:
- : 服务器中结构化实例的定位器
- : 服务器中数组的定位器
- : 服务器中二进制大对象的定位器
- : 服务器中字符大对象的定位器
- : 用于管理数据源外部数据的类型。 值是 SQL MED(管理外部数据)的一部分,是 SQL ANSI/ISO 标准规范的一部分。
JDBC API 为 SQL:2003 标准指定的高级数据类型提供了默认映射。以下列表列出了数据类型及其映射到的接口或类:
- : 接口
- : 接口
- : 接口
- : 接口
- : 接口
- 结构化类型: 接口
- : 接口
- : 接口
- : 基础类型映射的类型。例如,基于 SQL 类型的 值映射到 类型,因为在 Java 编程语言中, 映射到 。
- : 对象
检索、存储和更新高级数据类型的方式与处理其他数据类型的方式相同。您可以使用 或 方法来检索它们, 方法来存储它们,以及 方法来更新它们。(变量 是映射到高级数据类型的 Java 接口或类的名称。)大概有 90% 的高级数据类型操作涉及使用 、 和 方法。以下表格显示了要使用哪些方法:
注意: 数据类型与其他高级 SQL 数据类型的行为不同。作为一个基于已存在内置类型的用户定义类型,它在 Java 编程语言中没有接口。因此,您需要使用与 数据类型基础的 Java 类型对应的方法。请参阅使用 DISTINCT 数据类型获取更多信息。
例如,以下代码片段检索了一个 SQL 值。在此示例中,假设表 中的列 包含 类型的值。变量 是一个 对象。
变量 是指向存储在表 中学生 行中的 SQL 对象的逻辑指针。
如果要将值存储在数据库中,可以使用相应的 方法。例如,以下代码片段中, 是一个 对象,存储了一个 对象:
此代码将 设置为发送到数据库的更新语句的第一个参数。由 指定的 值将存储在表 的 列中,在该列中的值小于一百万的每一行中。
原文:
、和 Java 对象的一个重要特性是,您可以在不将所有数据从数据库服务器传输到客户端计算机的情况下对它们进行操作。一些实现使用定位器(逻辑指针)来表示这些类型的实例,指向实例所代表的数据库中的对象。由于、或 SQL 对象可能非常大,使用定位器可以显著提高性能。但是,其他实现会在客户端计算机上完全实现大对象。
如果要将、或 SQL 值的数据传输到客户端计算机,请使用为此目的提供的、和 Java 接口中的方法。这些大对象类型对象将它们所代表的对象的数据实现为流。
以下主题涵盖:
- 向数据库添加大对象类型对象
- 检索 CLOB 值
- 添加和检索 BLOB 对象
- 释放大对象占用的资源
以下摘录自向表中添加 SQL 值。 Java 对象包含由指定的文件的内容。
下一行创建一个 Java 对象:
下一行检索一个流(在本例中为名为的对象),用于将一系列字符写入 Java 对象。方法写入这些字符流;流来自由 指定的文件。方法参数表示对象将从值的开头开始写入字符流:
方法逐行读取由文件指定的文件,并将其写入由指定的对象:
以下摘录创建一个对象,将 Java 对象插入中:
方法从表中列的值等于参数指定的值的行中检索存储在列中的 SQL 值:
下一行从对象中检索 Java 值:
以下行从对象中检索子字符串。子字符串从值的第一个字符开始,最多有指定的连续字符数,其中是一个整数。
添加和检索 SQL 对象类似于添加和检索 SQL 对象。使用方法检索一个对象,以写入调用该方法的 Java 对象(表示 SQL 值)的 SQL 值。
、和 Java 对象在它们被创建的事务持续时间内至少保持有效。这可能导致应用程序在长时间运行的事务中耗尽资源。应用程序可以通过调用它们的方法来释放、和资源。
在以下摘录中,调用方法来释放先前创建的对象所持有的资源:
原文:
接口支持使用 方法创建 对象。创建的对象不包含任何数据。可以通过在 接口上调用 、、 或 方法向对象添加数据。
下面涵盖了以下主题:
- 创建 SQLXML 对象
- 在 ResultSet 中检索 SQLXML 值
- 访问 SQLXML 对象数据
- 存储 SQLXML 对象
- 初始化 SQLXML 对象
- 释放 SQLXML 资源
- 示例代码
在以下摘录中,使用 方法创建一个空的 对象。使用 方法将数据写入创建的 对象。
数据类型类似于更基本的内置类型。可以通过在 或 接口中调用 方法来检索 值。
例如,以下摘录从 rs 的第一列检索一个 值:
对象在创建它们的事务持续时间内至少保持有效,除非调用它们的 方法。
接口提供了 、、 和 方法来访问其内部内容。以下摘录使用 方法检索 对象的内容:
可以使用 或 方法获取可直接传递给 XML 解析器的 或 对象。以下摘录从 对象获取一个 对象,然后使用 DOM(文档对象模型)解析器处理流:
方法返回一个 对象。源用作 XML 解析器和 XSLT 转换器的输入。
以下摘录使用通过调用 方法返回的 对象从 对象中检索和解析数据:
对象可以像其他数据类型一样作为输入参数传递给 对象。 方法使用 对象设置指定的 参数。
在以下摘录中, 是一个 接口的实例,其数据先前已初始化。
方法可用于更新可更新结果集中的列值。
如果在调用或之前未关闭对象的、或对象,将抛出。
接口提供了、、或方法来初始化通过调用方法创建的对象的内容。
以下摘录使用方法返回一个对象以填充一个新创建的对象:
以下摘录使用方法获取一个对象以初始化一个对象:
同样地,的方法可用于初始化一个对象。
如果尝试在先前初始化过的对象上调用、、和方法,将抛出。如果对同一对象多次调用、和方法,则会抛出,并且先前返回的、或对象不受影响。
对象在创建它们的事务持续时间内至少保持有效。这可能导致应用程序在长时间运行的事务中耗尽资源。应用程序可以通过调用它们的方法释放资源。
在以下摘录中,调用来释放先前创建的对象所持有的资源。
MySQL 和 Java DB 及其各自的 JDBC 驱动程序并不完全支持本节中描述的 JDBC 数据类型。然而,示例演示了如何处理 MySQL 和 Java DB 中的 XML 数据。
The Coffee Break 的所有者关注来自各种网站的几个 RSS 订阅源,涵盖餐厅和饮料行业新闻。RSS(真正简单的聚合或富站点摘要)订阅源是一个包含一系列文章和相关元数据的 XML 文档,如每篇文章的发布日期和作者。所有者希望将这些 RSS 订阅源存储到数据库表中,包括 The Coffee Break 博客的 RSS 订阅源。
文件是 The Coffee Break 博客的一个示例 RSS 订阅源。文件是(虚构的)Coffee Industry News 的一个示例 RSS 订阅源。
在 MySQL 中处理 XML 数据
示例将 RSS 订阅源存储在名为的表中,该表是使用以下命令创建的:
MySQL 不支持 XML 数据类型。相反,此示例将 XML 数据存储在类型为 的列中,这是一种 SQL 数据类型。MySQL 有四种 数据类型; 数据类型在这四种类型中包含的字符数量最多。
方法 将一个 RSS 订阅添加到 表中。此方法的第一条语句将 RSS 订阅(在此示例中表示为 XML 文件)转换为类型为 的对象,该对象表示 DOM(文档对象模型)文档。这个类以及包含在 包中的类和接口包含了使您能够操作 XML 数据内容的方法。例如,以下语句使用 XPath 表达式从 对象中检索 RSS 订阅的标题:
XPath 表达式 检索第一个 元素的内容。对于文件 ,这是字符串 。
以下语句将 RSS 订阅添加到表 中:
方法 检索 的内容。对于每一行,该方法创建一个名为 的类型为 的对象,用于存储列 中的 XML 内容。该方法检索 XML 内容并将其存储在名为 的类型为 的对象中。 的内容被解析并存储在 对象中。
在 Java DB 中处理 XML 数据
注意:有关在 Java DB 中处理 XML 数据的更多信息,请参阅 Java DB 开发人员指南 中的 “XML 数据类型和运算符” 部分。
示例 将 RSS 订阅存储在表 中,该表是使用以下命令创建的:
Java DB 支持 XML 数据类型,但不支持 JDBC 数据类型。因此,您必须将任何 XML 数据转换为字符格式,然后使用 Java DB 运算符 将其转换为 XML 数据类型。
方法 将一个 RSS 订阅添加到 表中。此方法的第一条语句将 RSS 订阅(在此示例中表示为 XML 文件)转换为类型为 的对象。这在 在 MySQL 中处理 XML 数据 部分中有描述。
方法使用方法 将 RSS 订阅转换为 对象。
Java DB 有一个名为的操作符,将字符字符串表示解析为 Java DB XML 值,以下摘录演示了这一点:
操作符要求您将 XML 文档的字符表示转换为 Java DB 识别的字符串数据类型。在本例中,它将其转换为数据类型。有关 Apache Xalan 和 Java DB 要求的更多信息,请参阅入门指南和 Java DB 文档。
方法检索的内容。因为 Java DB 不支持 JDBC 数据类型,您必须将 XML 内容检索为字符串。Java DB 有一个名为的操作符,将 XML 类型转换为字符类型:
与操作符一样,操作符要求在您的 Java 类路径中列出 Apache Xalan。
原文:
注意:MySQL 和 Java DB 目前不支持 SQL 数据类型。因此,没有可用的 JDBC 教程示例来演示 JDBC 数据类型。
下面的主题包括:
- 创建数组对象
- 检索和访问 ResultSet 中的数组值
- 存储和更新数组对象
- 释放数组资源
使用方法创建对象。
例如,假设您的数据库包含一个名为的表,该表已经通过以下 SQL 语句创建并填充;请注意,这些语句的语法将根据您的数据库而变化:
Oracle 数据库 JDBC 驱动程序使用类实现接口。
与 JDBC 4.0 大对象接口(,,)一样,您可以操作对象,而无需将所有数据从数据库服务器传输到客户端计算机。对象将其表示的 SQL 作为结果集或 Java 数组实现。
以下摘录检索列中的 SQL 值,并将其赋给对象对象。摘录检索的内容并将其存储在中,是一个包含类型对象的 Java 数组。摘录遍历数组并检查每个邮政(邮编)代码是否有效。此代码假定类已经在先前定义,并且具有方法,如果给定的邮政编码与有效邮政编码主列表中的一个匹配,则返回:
在以下语句中,方法将当前行的列中存储的值作为对象返回:
变量包含一个定位器,这是指向服务器上 SQL 的逻辑指针;它不包含本身的元素。作为逻辑指针,可用于在服务器上操作数组。
在以下行中,是方法,而不是前一行中使用的方法。因为方法在 Java 编程语言中返回一个,并且每个邮政编码都是一个对象,所以在分配给变量之前,结果被转换为对象的数组。
方法将 SQL 元素在客户端作为对象数组实现。因为实际上变量包含数组的元素,所以可以在循环中遍历,查找无效的邮政编码。
使用方法和将值作为输入参数传递给对象。
以下示例将在先前创建的对象设置为的第二个参数:
同样,使用方法和来使用值更新表中的列。
对象在创建它们的事务持续时间内保持有效。这可能导致应用程序在长时间运行的事务中耗尽资源。应用程序可以通过调用它们的方法来释放资源。
在以下摘录中,调用方法来释放先前创建的对象所持有的资源。
原文:
注意:MySQL 和 Java DB 目前不支持 SQL 数据类型。因此,在本节描述的功能没有 JDBC 教程示例可用来演示。
数据类型与其他高级 SQL 数据类型的行为不同。作为一个基于已有内置类型之一的用户定义类型,它没有接口作为其在 Java 编程语言中的映射。相反, 数据类型的标准映射是其底层 SQL 数据类型映射到的 Java 类型。
为了说明,创建一个数据类型,然后看看如何检索、设置或更新它。假设你总是使用两个字母的缩写表示一个州,并且想要创建一个用于这些缩写的数据类型。你可以使用以下 SQL 语句定义你的新数据类型:
一些数据库使用另一种语法来创建数据类型,如下面的代码行所示:
如果一个语法不起作用,你可以尝试另一个。或者,你可以查看你的驱动程序文档,以查看它期望的确切语法。
这些语句创建了一个新的数据类型,它可以作为列值或作为 SQL 结构化类型的属性值使用。因为类型的值实际上是两个类型的值,所以你使用与检索值相同的方法来检索它,即。例如,假设的第四列存储了类型的值,下面的代码行检索了它的值:
同样,你会使用方法将值存储在数据库中,使用方法修改其值。
原文:
注意:MySQL 和 Java DB 目前不支持用户定义类型。因此,没有 JDBC 教程示例可用来演示本节描述的功能。
下列主题包括:
- 结构化类型概述
- 在结构化类型中使用 DISTINCT 类型
- 使用结构化类型的引用
- 创建 SQL REF 对象的示例代码
- 将用户定义类型用作列值
- 将用户定义类型插入表中
SQL 结构化类型和类型是用户可以在 SQL 中定义的两种数据类型。它们通常被称为 UDT(用户定义类型),您可以使用 SQL 的 语句来创建它们。
回到 The Coffee Break 的例子,假设所有者的成功超出了所有预期,并且一直在扩张新分店。所有者决定向数据库添加一个表,其中包含有关每个机构的信息。将有四列:
- 代表每个店铺的识别号
- 代表其地址
- 代表其销售的咖啡
- 代表店长的姓名
所有者将列设为 SQL 结构化类型,列设为 SQL ,列设为,其中是 SQL 结构化类型。
所有者首先必须为地址和经理定义新的结构化类型。SQL 结构化类型类似于 Java 编程语言中的结构化类型,它具有称为属性的成员,可以是任何数据类型。所有者编写以下 SQL 语句来创建新数据类型:
在此语句中,新类型有五个属性,类似于 Java 类中的字段。属性是一个,属性是一个,属性是一个,属性是一个,属性是一个。
下面的摘录中,是一个有效的对象,将的定义发送到数据库:
现在结构化类型已在数据库中注册为数据类型,所有者可以将其用作表列或结构化类型属性的数据类型。
The Coffee Break 的所有者计划在新的结构化类型中包含的属性之一是经理的电话号码。因为所有者总是将电话号码列为一个 10 位数(以确保包括区号),并且永远不会将其作为数字进行操作,所以所有者决定定义一个名为的新类型,该类型由 10 个字符组成。这种数据类型的 SQL 定义,可以被视为只有一个属性的结构化类型,如下所示:
或者,如前面提到的,对于某些驱动程序,定义可能如下所示:
类型始终基于另一个数据类型,该数据类型必须是预定义类型。换句话说,类型不能基于用户定义类型(UDT)。要检索或设置类型的值,请使用基础类型(其基础类型)的适当方法。例如,要检索基于类型的实例,您将使用方法,因为这是检索的方法。
假设对象的当前行的第四列中有一个类型为的值,以下代码行检索它:
类似地,以下代码行设置了一个输入参数,该参数具有类型,用于发送到数据库的预备语句:
在前面的代码片段中添加,的定义将通过以下代码行发送到数据库:
在向数据库注册类型之后,所有者可以将其用作表中的列类型或作为结构化类型中属性的数据类型。以下 SQL 语句中的定义使用作为属性的数据类型:
重用之前定义的,以下代码片段将结构化类型的定义发送到数据库:
The Coffee Break 的所有者创建了三种新的数据类型,用作数据库中的列类型或属性类型:结构化类型和,以及类型。企业家将用作新类型中属性的类型,并将用作表中列的数据类型。类型可以用作列的类型,但企业家更喜欢使用类型,因为企业家经常让一个人管理两到三家店铺。将用作列类型可以避免在一个人管理多家店铺时重复所有的数据。
已经创建了结构化类型 ,所有者现在可以创建一个包含可以被引用的 实例的表。对 实例的引用将具有类型 。SQL 只不过是指向结构化类型的逻辑指针,因此 实例充当对 实例的逻辑指针。
因为 SQL 值需要永久与其引用的结构化类型实例关联在一起,所以它存储在一个特殊的表中,与其关联的实例一起。程序员不直接创建 类型,而是创建将存储特定结构化类型实例的表,这些实例可以被引用。每个要被引用的结构化类型都将有自己的表。当你将结构化类型的实例插入表中时,数据库会自动创建一个 实例。例如,为了包含可以被引用的 实例,所有者使用 SQL 创建了以下特殊表:
这个语句创建了一个带有特殊列 的表,该列存储 类型的值。每次将 实例插入表中时,数据库都会生成一个 实例并将其存储在列 中。隐式地,另外一列存储已插入表中的 的每个属性。例如,以下代码片段展示了企业家如何创建了三个 结构化类型的实例来代表三个经理:
表 现在将有三行,每个已插入的经理一行。列 将包含三个 类型的唯一对象标识符,每个 实例一个。这些对象标识符是由数据库自动生成的,并将永久存储在表 中。隐式地,另外一列存储 的每个属性。例如,在表 中,一行包含一个引用 Alfredo Montoya 的 ,另一行包含一个引用 Margaret Haskins 的 ,第三行包含一个引用 Helen Chen 的 。
要访问 实例,您可以从其表中选择。例如,所有者使用以下代码片段检索了对 ID 号为 000001 的 Alfredo Montoya 的引用:
现在变量 可以被用作引用 Alfredo Montoya 的列值。
以下代码示例创建了表,这是结构化类型的实例表,可以引用,并将三个实例插入表中。此表中的列将存储的实例。执行此代码后,表将为插入的三个对象的每个对象插入一行,并且列中的值将是标识存储在该行中的实例的类型。
我们的企业家现在拥有创建表所需的 UDT。结构化类型是列的类型,类型是列的类型。
UDT 基于 SQL 数据类型,是列的类型。以下代码行创建了类型作为具有 10 个元素的值。的基本类型是。
定义了新数据类型后,以下 SQL 语句创建了表:
以下代码片段向表中插入一行,按顺序提供了列,,和的值:
以下逐个列出每列及其插入的值。
此列类型为,数字是类型,类似于之前在和表中插入的条目。
此列的类型为结构化类型,此值是实例的构造函数。当我们将的定义发送到数据库时,其中一件事是为新类型创建构造函数。括号中的逗号分隔值是类型属性的初始化值,它们必须按照类型定义中属性列出的顺序出现。是属性的值,是值。是的值,是的值,这两个属性都是类型。属性的值为,是类型,属性的值为,是类型。
列的类型为,基本类型为,括号中的逗号分隔值是数组元素为对象。所有者定义了类型最多有 10 个元素。此数组有 5 个元素,因为企业家仅提供了 5 个对象。
列的类型是,这意味着该列中的值必须是指向结构化类型的引用。所有的实例都存储在表中。所有的实例也存储在该表中,存储在列中。此表行中描述的商店的经理是 Alfredo Montoya,他的信息存储在具有属性为的实例中。要获取与 Alfredo Montoya 的对象关联的实例,请选择表中为的行中的列。将存储在表的列中的值(值)是 DBMS 生成的用于唯一标识此结构化类型实例的值。
将上述 SQL 语句发送到数据库,使用以下代码片段:
然而,因为你将发送多个语句,将它们一起作为批量更新发送会更有效,就像以下代码示例中所示:
原文:
注意:MySQL 目前不支持用户定义类型。MySQL 和 Java DB 目前不支持结构化类型或 SQL 数据类型。没有可用的 JDBC 教程示例来演示本节中描述的功能。
随着生意蒸蒸日上,The Coffee Break 的老板经常添加新店铺并对数据库进行更改。老板决定为结构化类型使用自定义映射。这使老板可以对映射类型的 Java 类进行更改。Java 类将为的每个属性都有一个字段。类的名称和字段的名称可以是任何有效的 Java 标识符。
下面涵盖了以下主题:
- 实现 SQLData
- 使用连接的类型映射
- 使用自定义类型映射
实现自定义映射所需的第一步是创建一个实现接口的类。
结构化类型的 SQL 定义如下:
为了自定义映射类型而实现接口的类可能如下所示:
编写一个实现接口的类之后,设置自定义映射的唯一其他事项就是在类型映射中进行条目设置。例如,这意味着输入类型的完全限定 SQL 名称和类的对象。类型映射是接口的一个实例,与每个新创建的连接相关联,因此您可以使用它。假设是活动连接,以下代码片段向与关联的类型映射添加了一个 UDT 的条目。
每当调用方法检索类型的实例时,驱动程序将检查与连接关联的类型映射,并看到它有一个的条目。驱动程序将注意到类的对象,创建其实例,并在后台执行许多其他操作以将映射到。您只需生成映射的类,然后在类型映射中进行条目设置,让驱动程序知道有一个自定义映射。驱动程序将完成其余所有工作。
存储具有自定义映射的结构化类型时情况类似。当调用方法时,驱动程序将检查要设置的值是否是实现了接口的类的实例。如果是(表示存在自定义映射),驱动程序将使用自定义映射将值转换为其 SQL 对应项,然后返回给数据库。再次强调,驱动程序在后台执行自定义映射;你只需向方法提供具有自定义映射的参数即可。稍后在本节中将看到一个示例。
查看使用标准映射(对象)和使用 Java 编程语言中的自定义映射(类)之间的区别。下面的代码片段展示了标准映射到对象的映射,这是在连接的类型映射中没有条目时驱动程序使用的映射。
变量包含以下属性值:、、、、。
下面的代码片段展示了当连接的类型映射中存在结构化类型的条目时会发生什么。请记住,列存储类型为的值。
变量现在是类的实例,每个属性值都是的一个字段的当前值。请注意,在将方法检索的对象转换为对象并将其分配给之前,必须记得进行转换。还要注意,必须是一个对象。
将使用对象与使用类的实例进行比较。假设商店搬到了邻近城镇的更好位置,因此您必须更新数据库。使用自定义映射,重置的字段,如下面的代码片段所示:
列中的值是类型的实例。驱动程序检查连接的类型映射,看到将与类关联的条目,因此使用中指示的自定义映射。当代码使用变量作为第二个参数调用方法时,驱动程序检查并看到表示类的实例,该类实现了结构化类型的接口,并再次自动使用自定义映射。
没有的自定义映射,更新将更像这样:
到目前为止,您仅使用了与连接关联的类型映射进行自定义映射。通常情况下,大多数程序员只会使用这种类型映射。但是,也可以创建一个类型映射并将其传递给某些方法,以便驱动程序将使用该类型映射而不是与连接关联的类型映射。这允许为同一用户定义类型(UDT)使用两种不同的映射。实际上,可以为相同的 UDT 拥有多个自定义映射,只要每个映射都设置为实现接口的类和类型映射中的条目。如果您没有向可以接受类型映射的方法传递类型映射,则驱动程序将默认使用与连接关联的类型映射。
在使用与连接关联的类型映射之外的类型映射的情况非常少见。例如,如果几个程序员共同开发 JDBC 应用程序并且在使用相同连接,则可能需要为方法提供一个类型映射。如果两个或更多程序员为相同的 SQL UDT 创建了自定义映射,则每个人都需要提供自己的类型映射,从而覆盖连接的类型映射。
原文:
值通过 URL 引用底层数据源之外的资源。URL,统一资源定位符,是指向万维网上资源的指针。资源可以是简单的文件或目录,也可以是对更复杂对象的引用,比如对数据库查询或搜索引擎的查询。
下列主题包括:
- 存储外部数据引用
- 检索外部数据引用
使用方法来为预编译语句指定一个对象。在 URL 类型不被 Java 平台支持的情况下,可以使用方法存储 URL。
例如,假设 The Coffee Break 的所有者想要在数据库表中存储一组重要的 URL。以下方法向表添加一行数据。该行包括标识 URL 的字符串,和 URL 本身,:
使用方法检索外部数据引用作为对象。在或方法返回的 URL 类型不被 Java 平台支持的情况下,通过调用方法将 URL 作为对象检索。
下列方法显示了表中所有 URL 的内容:
示例将 Oracle URL 存储在表中。然后,它显示了所有在中存储的 URL 引用的文档内容,其中包括 Oracle 主页,。
以下语句从结果集中检索 URL 作为对象:
示例使用以下语句访问对象引用的数据:
方法可以不带参数,这意味着表示直接连接到互联网。如果需要代理服务器连接到互联网,方法接受一个对象作为参数。以下语句演示如何创建一个 HTTP 代理,服务器名称为,端口号为:
到此这篇超详细oracle教程菜鸟入门手册(oracle教程 菜鸟教程)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/68588.html