国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

在桌面應用中使用JAVA DB

2019-11-17 05:55:30
字體:
來源:轉載
供稿:網友

原文地址:http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javadb/

原作者:John O'Conner

日期:2006-03

 

摘要

學習如何在Java桌面應用中部署基于Apache Derby的Java DB。該文章使用住址名冊例子來向你演示一個嵌入式數(shù)據(jù)庫Java DB是如何工作的。

 

正文

       Sun Microsystems最近公布發(fā)行支持基于100%Java技術的開源數(shù)據(jù)庫Java DB——Apache Derby數(shù)據(jù)庫。Derby之前是以Cloudscape的名字存在并被人使用,它是由Cloudscape、Informix和IBM共同所有。后來,IBM把Derby產品源代碼捐贈給Apache基金會作為一個開源項目。Sun、IBM 其他企業(yè)和個人作為Apache Derby社區(qū)的一部分也積極參與該關系數(shù)據(jù)庫的開發(fā)。Java DB遍布在Sun許多產品中,包括Sun Java EnterPRise System和Sun Java System application Server。NetBeans集成開發(fā)環(huán)境(IDE) 5.0也支持Java DB。

       Java DB是一個只有2MB的輕量級數(shù)據(jù)庫,并可嵌入到Java技術的桌面應用中。目前桌面應用可以訪問帶有觸發(fā)器、存儲過程和支持SQL語句的強大數(shù)據(jù)庫存儲器,Java Database Connectivity(JDBC)和Java Platform, Enterprise Edition(Java EE,以前稱為J2EE),都嵌入了同樣的Java虛擬機(JVM)。(見腳注)

       這篇文章描述了如何下載、安裝、集成和在桌面應用中部署Java DB。住址名冊這個例子將演示一個嵌入式數(shù)據(jù)庫Java DB是如何工作的。

 

內容

-創(chuàng)建住址名冊示例

-安裝Java DB

-在NetBeans IDE 5.0里集成Java DB

-裝載數(shù)據(jù)庫驅動

-連接Java DB數(shù)據(jù)庫

-創(chuàng)建數(shù)據(jù)庫

-使用數(shù)據(jù)庫

-發(fā)布你的應用程序

-概要

 

創(chuàng)建住址名冊示例

       住址名冊示例使用Java DB來存儲地址信息。這個示例存儲名字、電話號碼、email地址和郵政地址。它答應你建立一個新地址條目并可以存儲、編輯和刪除它們。這個應用程序在用戶的主目錄下名為.addressbook的子目錄下創(chuàng)建它的數(shù)據(jù)庫。這個數(shù)據(jù)庫嵌入在應用程序中的,所以這里不需要設立和治理一個分開的服務器或系統(tǒng)。要發(fā)布這個嵌入式數(shù)據(jù)庫應用程序,我們僅僅需要應用程序JAR文件和數(shù)據(jù)庫類JAR文件。插圖1展示該示例的用戶界面(UI)。


在桌面應用中使用JAVA DB(圖一)

插圖1:住址名冊使用嵌入式的數(shù)據(jù)庫Java DB

       住址名冊的主框架窗口是AddressFrame類,它繼續(xù)于Java Foundation Classes/Swing(JFC/Swing)JFrame。AddressFrame類是一個放置其他圖形組件的容器,同時也擔當控制和處理子組件產生的不同事件。這些子組件是JPanel的子類,每個都有不同的職責:

l         AddressPanel顯示地址記錄。它也提供編輯存在的記錄和創(chuàng)建新記錄的UI。它包含顯示Address對象的所有主要屬性的文本域。

l         AddressActionPanel設置該程序所需的按鈕。AddressFrame必須處理這個面板所產生的事件。例如:當用戶點擊Save按鈕,這個面板產生一個事件。AddressFrame監(jiān)聽并處理這個面板的所有重要事件。

l         AddressListPanel設定一個帶滾動條的列表來列出名冊姓名,顯示在AddressFrame的左邊。這個列表控制一個ListEntry對象。ListEntry存儲數(shù)據(jù)庫記錄的唯一標識。這個記錄標識(ID)答應應用程序找到該記錄的全部信息并顯示在AddressPanel上。

該應用程序是用Data access Object(DAO)去分離數(shù)據(jù)庫特定的代碼。DAO封裝了數(shù)據(jù)庫connections和statements。一個DAO是一個有益的設計模式,它答應在應用程序和持久化存儲機制之間的松耦合。應用程序的AddressDao類是一個DAO的例子。當AddressFrame編輯、保存或修改Address對象時,它總是使用一個AddressDao類的實例。雖然住址名冊應用程序使用的是Java DB,你也可以改變它,并使用一個完全不同的數(shù)據(jù)庫,僅僅需要修改這個類而已。

 

安裝Java DB

       獲取Java DB最簡單的方法就是從Sun Developer Network的Java DB站點去下載。二進制版本文件包提供你編寫嵌入式數(shù)據(jù)庫應用程序所需要的文件。當你下載完該文件后,你將得到Java DB目錄結構,它包含下面一些子目錄:

l         Demo子目錄有兩個示例程序。一個例子顯示如何創(chuàng)建一個普通的嵌入式應用。另一個例子則顯示如何在客戶端-服務器環(huán)境下使用Java DB。

l         Frameworks子目錄包含的功能有環(huán)境變量設置和建立和啟動數(shù)據(jù)庫。對于住址名冊的示例,這個類是沒有用的,因為我們的應用程序將是完全獨立的。沒有外部的功能被使用。

l         Javadoc子目錄包含API文檔。這個目錄非常有用的,當你配置你的IDE時,都要指明Java DB API javadoc的位置。

l         Docs子目錄包含關于Java DB產品的一些文檔:安裝、治理和參考指南。


l         最后,lib子目錄包含Java DB庫打包成的JAR文件。閱讀Java DB文檔可以找到不同的庫。對于一個嵌入式數(shù)據(jù)庫應用程序,我們們只需要derby.jar庫文件。

安裝Java DB只需要在你的應用程序環(huán)境變量里加入derby.jar文件。它是如此的簡單。你可以在你的Solaris,linux,Windows里設置環(huán)境變量,或者在其他主環(huán)境里導入這個JAR文件,或者你可以在編譯和運行的時候通過命令行參數(shù)導入這個文件。假如你使用ANT,住址名冊示例的ANT腳本將告訴你在發(fā)布工程時如何導入這些JAR文件。另外,某些IDE,包括NetBeans IDE 5.0,答應你設置工程的環(huán)境變量。

 

在NetBeans IDE 5.0里集成Java DB

       大多數(shù)IDE都提供了添加庫文件到開發(fā)環(huán)境的方法。下面將指導你如何在NetBean IDE5.0里添加Java DB庫文件:

1.       在Tools菜單里選擇庫治理器,如插圖2。

在桌面應用中使用JAVA DB(圖二)

插圖2:庫治理器答應你添加第三方庫文件到你的工程里

2.       在庫治理器窗口,創(chuàng)建一個名為JavaDBEmbedded的新庫,如插圖3。點擊OK。

在桌面應用中使用JAVA DB(圖三)

插圖3:設置你工程需要的庫的名字

3.       添加derby.jar文件到JavaDBEmbedded庫,在庫治理器窗口里點擊Add JAR/Folder…。通過文件選擇框選擇derby.jar文件。如插圖4。

在桌面應用中使用JAVA DB(圖四)

插圖4:添加derby.jar文件到JavaDBEmbedded庫

4.       在同樣的庫治理器窗口的JavaDBEmbedded庫里,選擇Javadoc標簽。從你安裝的Java DB目錄里添加javadoc子目錄。現(xiàn)在,當你在NetBeans IDE工程里使用JavaDBEmbedded庫時,就可用的Java DB API javadoc。

 


你現(xiàn)在可以使用工程的屬性設置來為NetBeans IDE 5.0工程添加JavaDBEmbedded庫文件。當你在IDE下編譯,調試和運行該應用程序時,IDE將能找到所需要的derby.jar文件。

為了適用用戶使用其他的IDE,我將derby.jar文件放在提供下載的地址名冊工程的lib子目錄里。也附帶了只使用NetBeans IDE就能直接構建和運行該示例的ANT腳本。

 

裝載數(shù)據(jù)庫驅動

       裝載JDBC技術驅動啟動數(shù)據(jù)庫治理系統(tǒng)。Java DB的驅動來自于derby.jar文件,因此你不需要再下載任何東西。裝載JDBC驅動通過引用Class.forName方法。嵌入式驅動名是org.apache.derby.jdbc.EmbeddedDriver,你也可以使用其他的JDBC驅動裝載它。

 

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

 

       地址名冊示例從配置屬性文件里讀取驅動名,并傳遞該名字到loadDriver方法。另外,之前提到的,地址名冊封裝所有的數(shù)據(jù)庫功能到Data Access Object(DAO),core Java EE design pattern習慣訪問數(shù)據(jù)從多樣的來源。在Java SE應用程序中,就像地址名冊一樣,DAO模式工作得相當好。下面的代碼片段表示AddressDao文件如何讀取驅動名和裝載驅動:

 

private Properties bProperties = null;

 

public AddressDao(String addressBookName) {

    this.dbName = addressBookName;

    setDBSystemDir();

    dbProperties = loadDBProperties();

    String driverName = dbProperties.getProperty("derby.driver");

    loadDatabaseDriver(driverName);


    ...

}

 

private Properties loadDBProperties() {

    InputStream dbPropInputStream = null;

    dbPropInputStream =

        AddressDao.class.getResourceAsStream("Configuration.properties");

    dbProperties = new Properties();

    try {

        dbProperties.load(dbPropInputStream);

    } catch (IOException ex) {

        ex.printStackTrace();

    }


    return dbProperties;

}

 

private void loadDatabaseDriver(String driverName) {

    // Load the Java DB driver.

    try {

        Class.forName(driverName);

    } catch (ClassNotFoundException ex) {

        ex.printStackTrace();

    }

 

連接Java DB數(shù)據(jù)庫

       JDBC技術連接定義一個獨立的數(shù)據(jù)庫并答應你執(zhí)行治理任務。任務包括啟動,停止,復制,甚至刪除數(shù)據(jù)庫。驅動治理器提供所有數(shù)據(jù)庫連接。從驅動治理器獲得一個連接,倘若定義了URL字符串和一組屬性值,將改變數(shù)據(jù)庫連接的交互性。一個非常普通的方法是在連接時關聯(lián)用戶名和密碼屬性。

       所有連接的URL都使用下面的格式:

 

jdbc:derby:<dbName>[propertyList]


 

       dbName是定義一個獨立數(shù)據(jù)庫的URL。一個數(shù)據(jù)庫可以有一個或多個位置:在當前工作目錄里,在classpath里,在JAR文件里,在一個獨有的Java DB數(shù)據(jù)庫主目錄里,或者是你的文件系統(tǒng)里的絕對位置。治理數(shù)據(jù)庫位置的最簡單方法是在你嵌入式環(huán)境里設置derby.system.home系統(tǒng)屬性。這個屬性告訴Java DB里所有數(shù)據(jù)庫的默認主位置。通過設置這些屬性,地址名冊示例確保Java DB總是能找到正確的應用程序數(shù)據(jù)庫。應用程序數(shù)據(jù)庫名字為DefaultAddressBook,它將存在于derby.system.home屬性所指示的目錄里。連接該數(shù)據(jù)庫的URL應該像這樣:

 

jdbc:derby:DefaultAddressBook

 

可選值propertyList是一組屬性,你可以傳遞給數(shù)據(jù)庫系統(tǒng)。你可以傳遞屬性到Java DB系統(tǒng),要么是URL它本身,或是是分開的屬性對象。假如屬性是URL的一部分,應該用分號來隔開每個屬性值。最常用的屬性是:

 

l         create=true

l         databaseName=nameOfDatabase

l         user=username

l         passWord=userPassword

l         shutdown=true

 

       要連接DefaultAddressBook數(shù)據(jù)庫,該示例必須首先設置derby.system.home系統(tǒng)屬性。該示例使用的是用戶主目錄的.addressbook子目錄。使用System類去找到用戶的主目錄。然后使用該類來設置derby.system.home屬性:

 

private void setDBSystemDir() {

    // Decide on the db system Directory: <userhome>/.addressbook/

    String userHomeDir = System.getProperty("user.home", ".");


    String systemDir = userHomeDir + "/.addressbook";

 

    // Set the db system directory.

    System.setProperty("derby.system.home", systemDir);

}

 

一旦應用程序有了明確的指示,所有的數(shù)據(jù)庫都將存在,它可以獲得一個數(shù)據(jù)庫連接。在這個例子里,注重,我添加了連接屬性到數(shù)據(jù)庫URL。

 

Connection dbConnection = null;

String strUrl = "jdbc:derby:DefaultAddressBook;user=dbuser;password=dbuserpwd";

try {

    dbConnection = DriverManager.getConnection(strUrl);

} catch (SQLException sqle) {

    sqle.printStackTrace();

}

 

       或者,你可以把這些屬性放在Properties對象里。當獲取連接時,使用這個Properties對象做參數(shù):

 


Connection dbConnection = null;

String strUrl = "jdbc:derby:DefaultAddressBook";

 

Properties props = new Properties();

props.put("user", "dbuser");

props.put("password", "dbuserpwd");

try {

    dbConnection = DriverManager.getConnection(strUrl, props);

} catch(SQLException sqle) {

    sqle.printStackTrace();

}

 

創(chuàng)建數(shù)據(jù)庫

       地址名冊示例應用程序沒有現(xiàn)成的數(shù)據(jù)庫。換句話說,當該應用程序啟動時,必須創(chuàng)建數(shù)據(jù)庫。在這個應用程序中使用嵌入式數(shù)據(jù)庫最大的好處是不需要用戶關心數(shù)據(jù)庫設置的細節(jié)。應用程序可以控制數(shù)據(jù)庫存在的地方,存在那些表和如何進行處理。

       地址名冊創(chuàng)建了一個名為DefaultAddressBook的數(shù)據(jù)庫,在用戶主目錄的一個子目錄里,它不會告訴用戶任何附加的信息。當獲得一個數(shù)據(jù)庫連接后,通過使用create=true屬性,你可以在Java DB里創(chuàng)建一個新的數(shù)據(jù)庫。由于我們的數(shù)據(jù)庫將使用DefaultAddressBook數(shù)據(jù)庫,我們首先應該創(chuàng)建這個數(shù)據(jù)庫。假設我們在之前討論時已經設置了derby.system.home屬性值,應用程序創(chuàng)建數(shù)據(jù)庫和連接如下:

 


Connection dbConnection = null;

String strUrl = "jdbc:derby:DefaultAddressBook;create=true";

 

try {

    dbConnection = DriverManager.getConnection(strUrl);

} catch (SQLException ex) {

    ex.printStackTrace();

}

 

       因為create=true屬性值被包含在里面,Java DB首先會嘗試創(chuàng)建數(shù)據(jù)庫文件。創(chuàng)建數(shù)據(jù)庫并不是實際創(chuàng)建任何應用表。然而,你應該能在你的主目錄下找到一個名為.addressbook/DefaultAddressBook的子目錄。

       在數(shù)據(jù)庫被創(chuàng)建后,應用程序將創(chuàng)建表。該示例僅使用一個ADDRESS表在默認應用程序APP計劃。下面是創(chuàng)建ADDRESS表的SQL代碼:

 

CREATE table APP.ADDRESS (

    ID          INTEGER NOT NULL

                PRIMARY KEY GENERATED ALWAYS AS IDENTITY


                (START WITH 1, INCREMENT BY 1),

    LASTNAME    VARCHAR(30),

    FIRSTNAME   VARCHAR(30),

    MIDDLENAME  VARCHAR(30),

    PHONE       VARCHAR(20),

    EMAIL       VARCHAR(30),

    ADDRESS1    VARCHAR(30),

    ADDRESS2    VARCHAR(30),

    CITY        VARCHAR(30),

    STATE       VARCHAR(30),

    POSTALCODE  VARCHAR(20),

    COUNTRY     VARCHAR(30) )

       每個記錄有一個記錄標識或ID域。Java DB為每條新記錄產生這些值,它將添加到數(shù)據(jù)。在每條地址記錄的ID域是一個要害值。


       其他的地址記錄域都是不同長度的varchar類型。例如,LASTNAME域能容納最大30個varchar字符。Varchar類型等價于UTF-16 Java char類型。

       Java技術編碼使用下面的代碼用上面的SQL語句去創(chuàng)建ADDRESS表。dbConnection是與先前提到的代碼相同的。我們把它傳遞到createTable方法中,創(chuàng)建一個新的Statement,并在新建的數(shù)據(jù)庫里調用execute方法運行SQL代碼。strCreateAddressTable實例變量保存SQL語句文本。

 

private boolean createTables(Connection dbConnection) {

    boolean bCreatedTables = false;

    Statement statement = null;

    try {

        statement = dbConnection.createStatement();

        statement.execute(strCreateAddressTable);

        bCreatedTables = true;

    } catch (SQLException ex) {

        ex.printStackTrace();

    }

   


    return bCreatedTables;

}

 

       現(xiàn)在,數(shù)據(jù)庫和ADDRESS表都存在于主目錄下名為.addressbook/DefaultAddressBook子目錄里。雖然你可以瀏覽這個子目錄,避免修改任何文件。假如你直接編輯或刪除這些數(shù)據(jù)庫文件,你就破壞了你數(shù)據(jù)庫的完整性。

 

使用數(shù)據(jù)庫

       一旦數(shù)據(jù)庫和它的表被創(chuàng)建,你的應用程序可以創(chuàng)建一個新的連接和聲明去增加,編輯,刪除,或獲得記錄。在地址名冊中,這些響應是由AddressActionPanel里的按鈕所控制。插圖5顯示了這幾個可選項。

l         New.創(chuàng)建一個新的地址記錄

l         Delete.刪除當前顯示的地址記錄

l         Edit.編輯當前的地址記錄

l         Save.保存新的和編輯過的地址記錄

l         Cancel.取消任何編輯或任何嘗試新建的記錄

在桌面應用中使用JAVA DB(圖五)

插圖5:地址名冊有幾個按鈕與記錄交互

       應用程序的主窗口是AddressFrame,它同時擔當控制和顯示。它用AddressActionPanel注冊它自己去接收通知,當用戶點擊響應區(qū)的按鈕時。

       New按鈕清除地址條目面版,并答應用戶去編輯所有文本框。這里沒有使用SQL命令,不過UI應該答應你登錄一個新地址。

       Delete按鈕嘗試刪除當前選種的地址記錄。AddressFrame從AddressPanel獲取當前選擇的Address標識,并使用AddressDao刪除該記錄。該面板調用它自己的deleteAddress方法。該方法用正確的ID做參數(shù)調用DAO的deleteRecord方法。在刪除數(shù)據(jù)庫記錄后,應用程序必須刪除AddressListPanel的ListEntry。


 

private void deleteAddress() {

    int id = addressPanel.getId();

    if (id != -1) {

        db.deleteRecord(id);

        int selectedIndex = addressListPanel.deleteSelectedEntry();

        ...

    }

    ...

}

 

       在AddressDao里,deleteRecord方式實際上是從數(shù)據(jù)庫刪除一條記錄。當?shù)谝淮蝿?chuàng)建數(shù)據(jù)庫連接時,AddressDao就創(chuàng)建了一個PreparedStatement。

 

stmtDeleteAddress = dbConnection.prepareStatement(

        "DELETE FROM APP.ADDRESS " +

        "WHERE ID = ?");

 


       PreparedStatement可以使用多次,每次只需要一個參數(shù)就能確定刪除哪條記錄。在設置了ID參數(shù)后,deleteRecord方法執(zhí)行Update。

 

public boolean deleteRecord(int id) {

    boolean bDeleted = false;

    try {

        stmtDeleteAddress.clearParameters();

        stmtDeleteAddress.setInt(1, id);

        stmtDeleteAddress.executeUpdate();

        bDeleted = true;

    } catch (SQLException sqle) {

        sqle.printStackTrace();

    }  

    return bDeleted;

}

 


       Edit按鈕答應用戶在AddressPanel里編輯當前選擇的Address記錄。在這個例子中,你可以修改記錄的名字,城市或電話號碼。

       Save按鈕要么是在AddressPanel里創(chuàng)建和編輯新的Address,要么就嘗試編輯更新存在的記錄。假如用戶是編輯一個記錄。Save按鈕將使用新的信息來更新記錄。假如用戶是創(chuàng)建一個新的記錄,Save按鈕將插入一個新的記錄到數(shù)據(jù)庫。新的還沒有被保存。這時,它的ID域仍然設置的是默認值-1。一旦你保存這條記錄,這個值是自動生成的,并成為該記錄的唯一標識。

       下面是AddresFrame里的代碼是通過調用DAO的editRecord或saveRecord方法來保存編輯后或新建的地址記錄。當然,當你創(chuàng)建一條新記錄,應用程序也必須更新AddressListPanel。

 

private void saveAddress() {

    if (addressPanel.isEditable()) {

        Address address = addressPanel.getAddress();

        int id = address.getId();

        if (id == -1) {

            id = db.saveRecord(address);

            address.setId(id);

            String lname = address.getLastName();

            String fname = address.getFirstName();


            String mname = address.getMiddleName();

 

            ListEntry entry = new ListEntry(lname, fname, mname, id);

            addressListPanel.addListEntry(entry);

         } else {

            db.editRecord(address);

        }

        addressPanel.setEditable(false);

    }

}

 

       DAO的editRecord方法必須更新Address記錄里更改的域。由于該應用程序示例不能分辨修改和未修改的域,它就更新了記錄的所有域。下面是PreparedStatement對象和editRecord方法:

stmtUpdateExistingRecord = dbConnection.prepareStatement(

    "UPDATE APP.ADDRESS " +


    "SET LASTNAME = ?, " +

    "    FIRSTNAME = ?, " +

    "    MIDDLENAME = ?, " +

    "    PHONE = ?, " +

    "    EMAIL = ?, " +

    "    ADDRESS1 = ?, " +

    "    ADDRESS2 = ?, " +

    "    CITY = ?, " +

    "    STATE = ?, " +

    "    POSTALCODE = ?, " +

    "    COUNTRY = ? " +

    "WHERE ID = ?");

   


    ...

 

public boolean editRecord(Address record) {

    boolean bEdited = false;

    try {

        stmtUpdateExistingRecord.clearParameters();

        stmtUpdateExistingRecord.setString(1, record.getLastName());

        stmtUpdateExistingRecord.setString(2, record.getFirstName());

        stmtUpdateExistingRecord.setString(3, record.getMiddleName());

        stmtUpdateExistingRecord.setString(4, record.getPhone());

        stmtUpdateExistingRecord.setString(5, record.getEmail());

        stmtUpdateExistingRecord.setString(6, record.getAddress1());


        stmtUpdateExistingRecord.setString(7, record.getAddress2());

        stmtUpdateExistingRecord.setString(8, record.getCity());

        stmtUpdateExistingRecord.setString(9, record.getState());

        stmtUpdateExistingRecord.setString(10, record.getPostalCode());

        stmtUpdateExistingRecord.setString(11, record.getCountry());

        stmtUpdateExistingRecord.setInt(12, record.getId());

        stmtUpdateExistingRecord.executeUpdate();

        bEdited = true;

    } catch(SQLException sqle) {

        sqle.printStackTrace();

    }

    return bEdited;  


}

 

       保存一個新的Address數(shù)據(jù)庫記錄,該記錄有一個新的要害值或記錄標識。當我們創(chuàng)建PreparedStatement時,我們可以告訴數(shù)據(jù)庫我們想要知道產生的值。在插入數(shù)據(jù)后,我們可以通過該值返回一個ResultSet。saveRecord方法返回新創(chuàng)建記錄的要害值。

stmtSaveNewRecord = dbConnection.prepareStatement(

    "INSERT INTO APP.ADDRESS " +

    "   (LASTNAME, FIRSTNAME, MIDDLENAME, " +

    "    PHONE, EMAIL, ADDRESS1, ADDRESS2, " +

    "    CITY, STATE, POSTALCODE, COUNTRY) " +

    "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",

    Statement.RETURN_GENERATED_KEYS);

   

...

 

public int saveRecord(Address record) {

    int id = -1;


    try {

        stmtSaveNewRecord.clearParameters();

        stmtSaveNewRecord.setString(1, record.getLastName());

        stmtSaveNewRecord.setString(2, record.getFirstName());

        stmtSaveNewRecord.setString(3, record.getMiddleName());

        stmtSaveNewRecord.setString(4, record.getPhone());

        stmtSaveNewRecord.setString(5, record.getEmail());

        stmtSaveNewRecord.setString(6, record.getAddress1());

        stmtSaveNewRecord.setString(7, record.getAddress2());

        stmtSaveNewRecord.setString(8, record.getCity());

        stmtSaveNewRecord.setString(9, record.getState());


        stmtSaveNewRecord.setString(10, record.getPostalCode());

        stmtSaveNewRecord.setString(11, record.getCountry());

        int rowCount = stmtSaveNewRecord.executeUpdate();

        ResultSet results = stmtSaveNewRecord.getGeneratedKeys();

        if (results.next()) {

            id = results.getInt(1);

        }

    } catch(SQLException sqle) {

        sqle.printStackTrace();

    }

    return id;

}

 

發(fā)布你的應用程序


       現(xiàn)在你已經寫好了你的應用程序,你必須發(fā)布它給用戶。Java技術應用程序可以使用多種發(fā)布策略。包括Java Web Start軟件,Applet和獨立的JAR文件。我以獨立的JAR文件的形式發(fā)布了該應用程序。

       ANT的構建文件build.xml,創(chuàng)建AddressBook.jar文件到dist目錄。它也放置數(shù)據(jù)庫JAR文件到lib子目錄。該應用程序最終發(fā)布的結構如下:

AddressBook.jar

lib/derby.jar

       在很多情況下,應用程序使用例如derby.jar這樣的第三方類庫時,都需要一個外部的執(zhí)行腳本。這個腳本通常設置第三方JAR文件的classpath和執(zhí)行該應用程序的JAR文件。這個方法很麻煩。然而,由于它需要多個腳本,具有代表的一個是支持主機操作系統(tǒng)。例如,如何支持該程序發(fā)布到Windows,Solaris和Linux平臺,我寧愿為Windows平臺創(chuàng)建一個run.bat批處理文件,為Solaris或Linux平臺創(chuàng)建一個run.csh腳本。換言之,我們可以避免這些笨拙的執(zhí)行腳本。

       假如在AddressBook.jar的manifest文件里包含了classpath信息,你可以通過簡單的命令行操作執(zhí)行AddressBook.jar應用程序。在大多數(shù)平臺,你可以在圖形窗口界面中雙擊該JAR文件來運行該應用程序。在命令行下,你可以使用下面簡單的執(zhí)行命令:

 

java -jar AddressBook.jar

 

       這樣簡單的發(fā)布和執(zhí)行方案可以創(chuàng)建manifest.mf文件來實現(xiàn),并成為AddressBook.jar文件的一部分。你可以寫入信息到manifest文件里,并告訴Java編程語言解釋器那個類包含了main方法和那些JAR文件應該被認為是classpath的一部分。下面的manifest文件做到了以上兩點,當構建AddressBook.jar文件時,我們可以把它放在JAR文件里。

 

Manifest-Version: 1.0

Main-Class: com.sun.demo.addressbook.AddressFrame

Class-Path: lib/derby.jar

 

       一旦你構建程序產生先前所顯示的發(fā)布結構,你可以簡單的發(fā)布成為一個Zip文件。使用者可以輕松的解壓該文件到任何位置,并能運行AddressBook.jar文件。AddressBook.jar文件將包含之前提到的manifest文件和告訴運行時環(huán)境哪個JAR文件應該在classpath里。當然,因為Java DB是嵌入到這個程序里的,它應該能找到lib/derby.jar并能正確運行。


 

概要

       用Java DB工作是簡單和有趣的。Java DB讓你花最小的代價去創(chuàng)建和發(fā)布一個嵌入式數(shù)據(jù)庫。僅僅需要記住幾點技巧就能使你成功的使用Java DB工作了:

1.    請將derby.jar文件放在你開發(fā)環(huán)境的classpath里,以便Java技術編譯器和運行時環(huán)境能找到該庫并能編譯和運行應用程序。

2.    設置derby.system.home系統(tǒng)屬性去告訴Java DB在那里能找到數(shù)據(jù)庫。你可以通過程序代碼或命令行來設置該屬性。

3.    創(chuàng)建一個構建程序,請確保將derby.jar文件放在你工程目錄的lib子目錄下。

4.    通過設置你的應用程序的JAR的manifest文件里的Class-Path屬性,添加derby.jar到你的應用程序classpath里。

 

腳注

       術語”Java Virtual Machine”和”JVM”意思是Java平臺的虛擬機。

 

更多信息

l         下載住址名冊示例

l         Java DB下載站點

l         在客戶端-服務器環(huán)境中使用Derby

l         下載NetBeans IDE

l         Apache Derby項目



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 铁岭市| 会泽县| 辉南县| 德化县| 老河口市| 东丰县| 元朗区| 平湖市| 阜新| 黑山县| 青岛市| 治县。| 吴堡县| 伊宁县| 旬阳县| 绩溪县| 松桃| 新津县| 玉山县| 兰坪| 临澧县| 仲巴县| 平阴县| 抚州市| 唐山市| 宜宾县| 保亭| 潞城市| 左贡县| 肃南| 广元市| 绵竹市| 休宁县| 平遥县| 同德县| 穆棱市| 遂宁市| 绥阳县| 廉江市| 温宿县| 孟村|