欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
一個(gè)簡(jiǎn)單的 JDBC 包裝器
JDBC 提供了一種強大、全面的接口用來(lái)從 Java 程序訪(fǎng)問(wèn)數據庫。對于較小的項目來(lái)說(shuō),使用 JDBC 似乎是理所當然的,它使一些程序員避免了一起使用數據庫。本文描述了一種簡(jiǎn)單的包裝器庫,它讓使用簡(jiǎn)單的數據庫易如反掌。您會(huì )發(fā)現您已經(jīng)開(kāi)始想在編寫(xiě)的每一個(gè)程序中都使用 JDBC。

事情發(fā)生得很突然。您正在修改一個(gè)程序,您原以為它是個(gè)小程序,不料竟發(fā)現它已經(jīng)迅速增長(cháng)成為一個(gè)龐大的東西 ― 一個(gè) 項目― 而現在您已到了需要保存一些數據的時(shí)候了。

問(wèn)題是,您并不是有意讓程序發(fā)展到這種程度的。 您只是不由自主地做了一小部分修改。您并沒(méi)有真正準備要存儲或裝入。而且,您的程序是個(gè) applet,而 applet 是無(wú)法存儲或裝入的。

可以存儲或裝入它們嗎?

實(shí)際上,JDBC API 允許任何 Java 程序 ― 甚至是 applet ― 連接到關(guān)系型數據庫(RDBMS)上。 不幸的是,JDBC 對您的小程序來(lái)說(shuō)可能有一點(diǎn)頭重腳輕了。畢竟,如果您希望做的只是存儲一點(diǎn)點(diǎn)數據的話(huà),RDBMS 是一個(gè)強大、復雜的系統。

在本文中,我們將分析一個(gè)簡(jiǎn)單的使用 JDBC 的抽象層。對于簡(jiǎn)單的應用程序來(lái)說(shuō),它可以讓您只用幾行代碼就實(shí)現存儲和裝入結構化數據。它不會(huì )處理復雜的 RDBMS 使用,但那正是我們要避免的,不是嗎?

JDBC 的復雜性
JDBC 使用起來(lái)可能是一個(gè)復雜的 API。它不僅必須支持整個(gè)強大的 SQL 標準,還必須很好地隱藏不同數據庫引擎之間的區別。

JDBC 的復雜還在于關(guān)系型數據庫是基于 SQL 構建的,而 SQL 是要給人用的,而不是給程序用的。直接使用 JDBC 有點(diǎn)象同時(shí)用兩種語(yǔ)言編程。

雖然 JDBC 的這些方面并不是什么壞事,但它們確實(shí)與我們的目標 ― 快速地存儲少量數據相沖突。

簡(jiǎn)化的抽象
我們將創(chuàng )建一個(gè)簡(jiǎn)單的抽象層,讓您不必顧慮所有繁瑣的細節問(wèn)題來(lái)直接使用 JDBC。如果您早已熟悉 JDBC 或關(guān)系型數據庫了,那您一眼看到我們的類(lèi)列表應該是很熟悉的:

  • Database
  • Table
  • RowSet
  • Row

我們這里不是在作任何實(shí)質(zhì)性的事情;我們的數據模型本質(zhì)上和關(guān)系型模型是一樣的,但去掉了煩人的細節(同時(shí)去掉了強大的功能)。每一個(gè)類(lèi)映射到一個(gè)基本的 RDBMS 概念上,同時(shí)也映射到一個(gè) JDBC 類(lèi)上。就是這種映射讓我們的 API 可以在保持易用性的同時(shí)保留它的相關(guān)特性。

這種 API 的設計是基于對我們的數據存儲需要的設想。如果您發(fā)現自己的程序需要一點(diǎn)不同的地方,您可以隨意地改變這種抽象以適應您的情況。 這些類(lèi)可以被認為是一種簡(jiǎn)化您工作的模式,而不是一成不變的規則。

如果您不熟悉 SQL 或者 RDBMS 技術(shù),不必害怕。 下面的四節中,每一節都會(huì )幫助您熟悉我們的一個(gè)類(lèi),還有這些類(lèi)映射到的 RDBMS 功能。

Database 類(lèi)
當使用 JDBC 與數據庫建立連接時(shí),您必須告訴 JDBC 在何處可以找到實(shí)際的數據。 因為不同的數據庫引擎有不同的訪(fǎng)問(wèn)方法和描述這些方法的不同語(yǔ)法,所以有不止一種方法來(lái)指定數據源。 在 JDBC 中,統一資源標識符(Uniform Resource Identifier,URI)字符串是用來(lái)指定數據源的,而這個(gè)字符串的結構是依賴(lài)于數據庫的。

Database 類(lèi)的主要目的就是封裝這個(gè)字符串,還有建立連接操作時(shí)可能需要的任何用戶(hù)名/密碼信息。

下面是如何創(chuàng )建一個(gè) Database 對象的方法:

  Database db =    new Database( "jdbc:postgresql://localhost/mito",      "mito", "" );

構造函數的第一個(gè)參數是數據源的 URI。 在這個(gè)示例中,我使用了 PostgreSQL數據庫引擎,而且在本機上訪(fǎng)問(wèn)了一個(gè)名為 mito 的數據庫。 另外,我指定我的用戶(hù)名 mito 和一個(gè)空的密碼分別作為第二個(gè)和第三個(gè)參數。

一旦您創(chuàng )建了 Database 對象,您就可以使用它來(lái)訪(fǎng)問(wèn)數據,如我們在下一章可以看到的一樣。

Table 類(lèi)
我們在 API 中對簡(jiǎn)化的一個(gè)設想就是,當您從表的一行讀取數據時(shí),您會(huì )得到整行的數據。換句話(huà)說(shuō),表的一行是作為讀寫(xiě)單獨一塊數據的最小單位。這并不十分有效,但效率不是我們方法中所首要考慮的。

Talbe 類(lèi)讓您可以讀寫(xiě)這些行對象。您必須做的第一步是創(chuàng )建一個(gè)表對象,它簡(jiǎn)單得只要知道它的名稱(chēng)即可:

  Table table = db.getTable( "employee" );

創(chuàng )建 Table 對象的操作實(shí)際上并沒(méi)有做任何事,只是讓對象記住自己的名稱(chēng)。要做一些實(shí)際的事,我們就需要實(shí)際地使用這個(gè) Table 對象了。在這里,我們從表中讀取一行。

  Row row = table.getRow( "id=101");

注意,我們已經(jīng)指定了我們只需要那些‘id’值設定為‘101’的行。通過(guò)使用 getRow() 方法,我們假定只有一行符合這個(gè)條件。在另外的情況下,我們可能需要多個(gè)行,那樣我們就需要這樣使用 getRows() 方法:

  RowSet rows = table.getRows( "id<103" );

在這種情況下,返回的值是一個(gè) RowSet ,而不是一個(gè) Row。 RowSet 就是 Row 的一個(gè)集合。

在接下來(lái)的兩節里,我們將討論 RowRowSet 類(lèi)。

Row 類(lèi)
在我們的抽象中, Row 是在 RDBMS 中表示表中一行的名稱(chēng)/值對的集合。不同于 RDBMS 值可以是不同的類(lèi)型, Row 僅包含一種類(lèi)型,即字符串類(lèi)型。 這還是為了讓事情簡(jiǎn)單一點(diǎn) ― 我們假定您不需要字符串類(lèi)型提供的任何更強大的功能。

一旦您有了一個(gè) Row ,就很容易從其中取出一個(gè)值,正如我們在清單 1 中看見(jiàn)的一樣。

L清單 1. 從 Row 中獲取值
  Row e = table.getRow( "id=100" );  String name = e.get( "name" );  System.out.println( "Employee name: "+name );

還要注意的是 Row 是排序的,這樣您就可以通過(guò)索引來(lái)取出名稱(chēng)/值的對。清單 2 中給出了這樣的一個(gè)示例。

清單 2. 迭代整個(gè) Row
  Row e = table.getRow( "id=100" );  for (int i=0; i<e.length(); ++i) {    String key = e.getKey( i );    String value = e.get( i );    System.out.println( key+" = "+value );  }

當然,您還可以改變 Row 中的值。這是在數據庫中更改數據所必需的 — 稍后我們會(huì )看到這一點(diǎn)。

RowSet 類(lèi)
記住有一些查詢(xún)可以返回多個(gè) Row ,這樣的話(huà)您就會(huì )得到一個(gè) RowSet 。 RowSet 有一點(diǎn)不同于基于 Vector 的包裝器。你可以輕易地迭代 RowSet 中所有的 Row ,在清單 3 中可以看到這一點(diǎn)。

清單 3. 迭代整個(gè) RowSet
  RowSet rs = table.get( "id<104" );  for (int i=0; i<rs.length(); ++i) {    Row row = rs.get( i );    // do something with the row....  }

一個(gè)完整的示例
現在我們已經(jīng)看過(guò)了所有的類(lèi),讓我們來(lái)看一個(gè)完整的示例吧。在清單 4 中,我們將抽取出符合特定條件的一套記錄,然后打印出它們的值。

清單 4. 一個(gè)讀取數據的完整示例
    // First, get all rows meeting the criterion    RowSet rs = table.getRows( "id<103" );    // Iterate through the set    for (int i=0; i<rs.length(); ++i) {      // Grab each row in turn      Row row = rs.get( i );      // Get and print the value of the "name" field      String name = row.get( "name" );      System.out.println( "Name: "+name );    }

如此容易!在下一節中,我們將看看怎樣向數據庫寫(xiě)入數據。

修改數據
正如前面所提到的,使用我們的 API 讀寫(xiě)數據是以整個(gè) 為單位的。為了向數據庫寫(xiě)入數據,您必須創(chuàng )建(或修改) Row 對象,然后向數據庫寫(xiě)入那個(gè) Row 對象。

向數據庫寫(xiě)入數據是通過(guò)使用 Table 中的 putRow 方法。這種方法有兩種變體:

  • public void putRow( Row row )
  • public void putRow( Row row, String conditions )

這兩種變體分別對應于 SQL 中的 INSERTUPDATE 命令。

在第一個(gè)變體中,寫(xiě)一行意味著(zhù)將一個(gè)全新的行插入表中。

在第二個(gè)變體中,寫(xiě)一行意味著(zhù)修改一個(gè)現有的行。 conditions 參數使您能夠指定您想要修改的是哪一行(哪些行)。

讓我們來(lái)看看每種方法的一個(gè)示例。

插入一個(gè)新行
插入一個(gè)新行很簡(jiǎn)單,因為您不必指定要修改的行(一行或多行)。您只是簡(jiǎn)單地把行插入:

  table.putRow( row );

您可以重新創(chuàng )建一個(gè) Row ,如清單 5 所示。

清單 5. 重新創(chuàng )建一個(gè) Row
  // Create an empty row object  Row row = new Row();  // Fill it up with data  row.put( "id", "200" );  row.put( "name", "Joey Capellino" );

或者,您可以修改一個(gè)以前曾經(jīng)從數據庫中讀取的一個(gè)現有的行,如清單 6 所示。

清單 6. 修改現有的 Row
  // Grab a row from the database  Row row = table.getRow( someConditions );  // Change some or all of the fields  row.put( "name", "Joey Capellino" );

雖然通常是在插入時(shí)重新創(chuàng )建 Row ,更新時(shí)使用現有的 Row ,實(shí)際上您可以用任何方式來(lái)進(jìn)行。

更新現有的行
正如前面的部分提到的,對于您如何 創(chuàng )建用來(lái)更新的 Row 是沒(méi)有限制的。 但是,通常您是使用一個(gè)剛從數據庫中讀出的 Row 。

為了詳細描述這一點(diǎn),我們將使用一個(gè)示例(在該例子中我們讀出一個(gè)員工的姓名),改變這個(gè)名字,然后將更改后的結果寫(xiě)回數據庫,如清單 7 所示。

清單 7. 通過(guò)修改 Row 進(jìn)行更新
    Row row = table.getRow( "id=104" );    row.put( "name", newName );    table.putRow( row, "id=104" );

注意我們必須在調用 putRow() 中指定條件。這樣才會(huì )使調用成為 更新,而不是 插入。

注意,這個(gè)調用將更新 所有符合條件的行,而不是其中的一行。

結論
在本文中,我們初步認識了一種通過(guò) JDBC 包提供一種簡(jiǎn)化的通往關(guān)系型數據庫接口的 API。這種抽象保留了 JDBC 接口的很多基本關(guān)系型功能,但對其進(jìn)行了簡(jiǎn)化,從而讓使用非常地方便。這種簡(jiǎn)化是以效率為代價(jià)的,但當目標是簡(jiǎn)單性時(shí),這并不是一個(gè)令人驚奇的結果。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
關(guān)于 Java Database Connectivity 您不知道的 5 件事
java jdbc返回結果集條數
zf zend_DB學(xué)習筆記2
歷史上最強的sql FAQ for Oracle @ 安全和黑客 2
Tomcat 5.5 身份驗證領(lǐng)域配置
SQL 簡(jiǎn)介
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久