udt java_Java DB中的Java用户定义类型(UDT)
udt java
Java DB是基于Java編程語言和SQL的關系數據庫管理系統。 這是Apache軟件基金會的開源Derby項目的Oracle版本。 Java SE 7 SDK中包含Java DB。
用戶定義類型(UDT)是Java類,其實例(對象)存儲在數據庫表列中。 UDT定義為列數據類型,UDT實例存儲為列值。 可以在Java DB數據庫中創建并使用UDT。
以下是該帖子的內容:
1.用戶定義類型(UDT)
UDT在數據庫中定義數據類型。 UDT是具有公共訪問修飾符的Java類。 此類實現java.io.Serializable接口。 該類必須在引用該類的數據庫應用程序(或工具)的類路徑上可見。
UDT類用于定義表或視圖列的數據類型-用戶定義的數據類型。 UDT數據是UDT類的實例(Java對象)。 并存儲為列數據。 UDT也可以在存儲過程和函數(在Java DB中,它們是基于Java的)中稱為數據類型。
- UDT可以具有子類型。 并且可以將子類型數據填充為主類型,即,可以將UDT類的子類實例填充為UDT值。 例如:(a)Java類Type1和在數據庫中定義為dbtype1的UDT,以及(b)Java類Subtype1是Type1的子類,并且(c) dbtype1表列也可以用的實例填充Subtype1 (除了Type1的實例之外)。
- 無法對UDT進行索引,排序或比較; 并且不能與在SQL表達式中分組或聚合的運算符一起使用(例如=,LIKE,DISTINCT,GROUP…)。
2.創建和使用UDT
- 2.1。 創建UDT
- 2.2。使用UDT
2.1。創建一個UDT
創建一個Java類并在數據庫中定義UDT。創建一個Java類,例如TestType1.java (請參見代碼: 4.1 TestType1.java ),以用作數據庫中的UDT。 編譯源代碼。
SQL CREATE TYPE語句在數據庫中創建UDT。 語法為:
CREATE TYPE udtTypeName EXTERNAL NAME javaClassName LANGUAGE JAVA該命令以默認或指定的架構創建UDT,其中:
- udtTypeName是數據庫中UDT的名稱標識符。
- javaClassName是Java類的標準名稱。
例如,使用ij工具在Java DB數據庫中創建UDT( ij是Java DB附帶的命令行工具。ij是用于在Java DB數據庫上運行交互式查詢的JDBC工具。):
ij> CONNECT 'jdbc:derby:testDB'; ij> CREATE TYPE type1 EXTERNAL NAME 'TestType1' LANGUAGE JAVA;在上面的示例中, testDB是現有數據庫。 在testDB數據庫中創建了名稱為type1的UDT。
注意
Java類文件必須位于要從ij工具引用的類路徑中。
2.1.1。驗證,刪除和更新UDT
可以使用以下SQL命令驗證創建的UDT:
ij> SELECT alias, javaclassname FROM SYS.SYSALIASES WHERE aliastype='A';要從數據庫中刪除UDT,請使用DROP TYPE SQL命令。 以下是一個示例:
ij> DROP TYPE udtTypeName RESTRICT;在上面的示例中, udtTypeName是數據庫中定義的UDT名稱。
如果數據庫對象正在使用(或引用)UDT,則不能刪除UDT。 例如,(a)如果表列的類型為UDT,除非刪除相應的表列,否則不能刪除該UDT,或者(b)如果數據庫函數引用的是UDT的類(實例),則不能刪除UDT。除非已修改函數,否則不要引用該UDT類。
要使用更新后的Java代碼更新UDT,請(重新)編譯UDT類。 這會影響UDT類型的對象。 這也可能會影響存儲在UDT對象中的數據,具體取決于在應用程序中定義和使用UDT的方式。 請參閱主題: 3.設計UDT –考慮更新UDT對現有數據的影響 。
2.2。使用UDT
使用UDT創建數據庫對象并處理UDT數據(插入,更新,刪除和查詢)。 UDT數據可以與SQL交互使用,也可以在Java程序中與JDBC API一起在數據庫中使用。
2.2.1。 互動式SQL
下面介紹創建UDT類型的數據庫表列,插入數據和查詢插入的數據。
- (i)使用UDT作為列類型創建數據庫表。
例如:
CREATE TABLE test_table1 (id INT,type1col type1, // column with UDT ) - (ii)將數據插入表中。
使用定制的數據庫函數將數據插入到用UDT定義的表列中。有關創建定制函數以將UDT數據插入到表列中的詳細信息,請參閱4.2。 Example_Fn1 –函數 。
示例函數Example_Fn1具有簽名Example_Fn1(字符串輸入),并返回TestType1的實例(其中TestType1是表示UDT的Java類)。
ij> INSERT INTO test_table1(id, type1col) VALUES(1, Example_Fn1("udt value 1"));上面SQL命令在表中插入一行,其中帶有TestType1 Java對象的UDT列值。 函數Example_Fn1使用String輸入參數調用TestType1類的構造函數來構建對象; 并且該對象存儲在表列中。
- (iii)查詢插入的數據。
可以使用自定義函數從UDT列獲取數據。 在以下示例中,UDT類TestType1的重寫的Object類的toString()方法返回存儲的實例的字符串值。
ij> SELECT * FROM test_table1; ID | TYPE1COL ------------------------- 1 | udt value 1
2.2.2。 使用JDBC API
在java.sql包中定義的PreparedStatement和ResultSet接口分別用于插入和獲取數據庫UDT數據。
- PreparedStatement的setObject()方法用于將UDT數據作為對象存儲在UDT表列中。 方法setObject(int parameterIndex,Object obj)使用給定的對象設置指定參數的值。
- ResultSet的getObject()方法用于從UDT表列中檢索存儲的UDT數據。 方法getObject(int columnIndex)獲取此ResultSet對象的當前行中指定列的值。 返回的數據是一個對象。
以下Java代碼段顯示了用法:
// insert data into a table int idValue = 2; TestType1 obj = new TestType1("udt value 2"); PreparedStatement ps = conn.prepareStatement("INSERT INTO test_table1 VALUES (?, ?)"; ps.setInt(1, idValue); // where 1 is the parameter index ps.setObject(2, obj); // UDT data ps.executeUpdate(); ... // retrieve data from a table PreparedStatement ps = conn.prepareStatement("SELECT * FROM test_table1"); ResultSet rs = ps.executeQuery(); while (rs.next()) { int idValue = rs.getInt(1);TestType1 testType1 = (TestType1) rs.getObject(2); // where 2 is the column index in ResultSet object... }注意
UDT用于存儲數據。 該UDT(和數據)可能會在應用程序的整個生命周期中發生變化(即演變)。 設計UDT時必須考慮到這一點。
另外,請注意,UDT類始終實現Serializable接口。 必須考慮數據序列化和各種版本的UDT數據對象的影響。 在簡單的情況下,僅編譯更改的UDT類代碼就足夠了。
有兩種設計和使用UDT的方法。
- UDT類實現了可序列化,并且隨著UDT數據的發展,應用程序(帶有UDT)使用數據轉換應用程序。
- UDT類實現Externalizable (而不是Serializable ),并在UDT類中使用數據轉換功能。 一個帶有UDT類代碼的示例如下所示。
關于可外部化
UDT類必須實現Serializable接口。 和java.io.Externalizable擴展Serializable 。
實現此接口后,只有可外部化實例的類的身份(而不是狀態)才寫入序列化流中。 該類負責保存和恢復其實例的內容(狀態)。
必須實現兩種方法:
- readExternal(ObjectInput in):對象實現readExternal()方法以恢復其內容。
- writeExternal(ObjectOutput out):對象實現writeExternal()方法以保存其內容。
3.1 UDT類實現Serializable
UDT類實現了Serializable,并且隨著UDT數據的發展,應用程序(使用UDT)使用數據轉換應用程序-以下是概述步驟:
- UDT實現Serializable 。
- 創建并使用帶有初始版本的UDT。
- 在使用下一個版本更新UDT之前,請保存(存儲)先前版本的數據。
- 創建下一個版本的UDT(更新較早的版本)。
- 將初始版本數據轉換為當前更新的版本數據。
請注意,在這種情況下,所有以前的版本數據一次都轉換為當前(新)版本。
3.2 UDT類實現可外部化
UDT類實現Externalizable (而不是Serializable )并在其中使用數據轉換功能-以下是概述步驟:
- UDT實現Externalizable 。
- 創建并使用帶有初始版本的UDT。
- 在使用下一個版本更新UDT之前,無需執行任何操作。
- 使用內置的數據轉換功能,創建下一個版本的UDT(更新較早的版本)。
在這種情況下,每當查詢或更新數據時,以前的版本數據就會轉換為當前(新)版本。 版本信息包含在UDT類中。
以下是有關UDT類的詳細信息和代碼的示例。
注意
本主題中的示例未顯示用于插入和查詢UDT數據SQL命令和函數的詳細信息或代碼。 這些可能類似于本文前面顯示的示例。
4.示例代碼
- 4.1。 TestType1.java
- 4.2。 Example_Fn1 –函數
- 4.3.Testtype2.java(版本1)
- 4.4.Testtype2.java(版本2)
4.1.TestType1.java
public class TestType1implements java.io.Serializable {private String value = "DEFAULT";public TestType1() {}public TestType1(String s) {value = s;}@Overridepublic String toString() {return value;} } // class4.2.Example_Fn1 –功能
這是將數據插入UDT列的功能,如2.2中的示例所示。 使用UDT 。
- (i)使用具有函數功能的公共靜態方法創建Java類。
- (ii)使用CREATE FUNCTION命令在數據庫中創建函數。
以下是該函數和CREATE FUNCTION命令的Java類。 使用ij工具以交互方式編譯Java類并運行CREATE FUNCTION命令。
public class FunctionClass {public static TestType1 FnMethod1(String s) {return new TestType1(s);} }CREATE FUNCTION Example_Fn1(VARCHAR(25)) RETURNS type1 LANGUAGE JAVA PARAMETER STYLE JAVA NO SQL EXTERNAL NAME 'FunctionClass.FnMethod1';注意
ij使用SQL命令SHOW FUNCTIONS和DROP FUNCTION來驗證創建的函數并將其從數據庫中刪除。
4.3.Testtype2.java(版本1)
import java.io.*; public class Testtype2implements Externalizable {private static final long serialVersionUID = 1L;private static final int FIRST_VERSION = 1; // initial version idprivate String value = "DEFAULT";public Testtype2() {}public Testtype2(String s) {value = s;}@Overridepublic void writeExternal(ObjectOutput out)throws IOException {// first write the version id out.writeInt(FIRST_VERSION);// next write the state out.writeObject(value);}@Overridepublic void readExternal(ObjectInput in)throws IOException, ClassNotFoundException {// read the version id int version = in.readInt();if (version < FIRST_VERSION) { throw new IOException("Corrupt data stream (no such version).");}if (version > FIRST_VERSION) {throw new IOException("Can't deserialize from the future versions.");}// read object (state)value = (String) in.readObject() + "_V" + version;} // readExternal()@Overridepublic String toString() {return value;} } // version 1 class4.4.Testtype2.java(版本2)
import java.io.*; public class Testtype2implements Externalizable {private static final long serialVersionUID = 1L;private static final int FIRST_VERSION = 1; // initial version idprivate static final int NEW_VERSION = 2;private String value = "DEFAULT";private double newData;public Testtype2() {}public Testtype2(String s, double i) {value = s; newData = i;}@Overridepublic void writeExternal(ObjectOutput out)throws IOException {// first write the version id out.writeInt(NEW_VERSION);// next write the state out.writeObject(value); out.writeDouble(newData);}@Overridepublic void readExternal(ObjectInput in)throws IOException, ClassNotFoundException {if (version < FIRST_VERSION) { throw new IOException("Corrupt data stream (no such version).");}if (version > NEW_VERSION) {throw new IOException("Can't deserialize from the future versions.");}// read objectvalue = (String) in.readObject() + "_V" + version;// read new version's data if (version == NEW_VERSION) { newData = in.readDouble();}else { // if FIRST_VERSION// newData is its default value, 0}} // readExternal()@Overridepublic String toString() {return value + ":" + newData;} } // version 2 class注意
5.注釋和參考
- Java Swing文本編輯器應用程序中的示例用法:GUI文本編輯器創建一個文本文檔作為java.swing.text.PlainDocument類的實例。 使用內容創建的UDT Java類–例如PlainDocument實例,文檔名稱,創建日期等,并在應用程序中用于存儲數據。
- Oracle 10g數據庫支持創建和使用基于Java的UDT。 這些被稱為SQLJ類型。 表示UDT的Java類實現java.sql.SQLData或oracle.sql.ORAData接口,而不是java.io.Serializable 。 這些UDT是使用CREATE TYPE SQL語句創建的,并存儲到服務器,并可以通過SQL訪問。
- 鏈接到Apache Derby>文檔(10.8手冊): http : //db.apache.org/derby/manuals/index.html
翻譯自: https://www.javacodegeeks.com/2013/10/java-user-defined-types-udt-in-java-db.html
udt java
總結
以上是生活随笔為你收集整理的udt java_Java DB中的Java用户定义类型(UDT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑连接手机热点怎么连华为电脑连接手机热
- 下一篇: 自己电脑改成服务器(个人电脑改成服务器)