亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

一個簡單的 JDBC 包裝器

2019-11-18 12:38:26
字體:
來源:轉載
供稿:網友

  一種簡單程序的快速數據訪問解決方案
  JDBC 提供了一種強大、全面的接口用來從 java 程序訪問數據庫。對于較小的項目來說,使用 JDBC 似乎是理所當然的,它使一些程序員避免了同時使用數據庫。本文描述了一種簡單的包裝器庫,它讓使用簡單的數據庫易如反掌。您會發現您已經開始想在編寫的每一個程序中都使用 JDBC。
  事情發生得很忽然。您正在修改一個程序,您原以為它是個小程序,不料竟發現它已經迅速增長成為一個龐大的東西 — 一個項目 — 而現在您已到了需要保存一些數據的時候了。
  
  問題是,您并不是有意讓程序發展到這種程度的。您只是不由自主地做了一小部分修改。您并沒有真正預備要存儲或裝入。而且,您的程序是個 applet,而 applet 是無法存儲或裝入的。
  
  可以存儲或裝入它們嗎?
  實際上,JDBC API 答應任何 Java 程序 — 甚至是 applet — 連接到關系型數據庫(RDBMS)上。不幸的是,JDBC 對您的小程序來說可能有一點頭重腳輕了。究竟,假如您希望做的只是存儲一點點數據的話,RDBMS 是一個強大、復雜的系統。
  
  在本文中,我們將分析一個簡單的使用 JDBC 的抽象層。對于簡單的應用程序來說,它可以讓您只用幾行代碼就實現存儲和裝入結構化數據。它不會處理復雜的 RDBMS 使用,但那正是我們要避免的,不是嗎?
  
  JDBC 的復雜性
  JDBC 使用起來可能是一個復雜的 API。它不僅必須支持整個強大的 SQL 標準,還必須很好地隱藏不同數據庫引擎之間的區別。
  
  JDBC 的復雜還在于關系型數據庫是基于 SQL 構建的,而 SQL 是要給人用的,而不是給程序用的。直接使用 JDBC 有點象同時用兩種語言編程。
  
  雖然 JDBC 的這些方面并不是什么壞事,但它們確實與我們的目標 — 快速地存儲少量數據相沖突。
  
  簡化的抽象
  我們將創建一個簡單的抽象層,讓您不必顧慮所有繁瑣的細節問題來直接使用 JDBC。假如您早已熟悉 JDBC 或關系型數據庫了,那您一眼看到我們的類列表應該是很熟悉的:
  
  Database
  Table
  RowSet
  Row
  
  我們這里不是在作任何實質性的事情;我們的數據模型本質上和關系型模型是一樣的,但去掉了煩人的細節(同時去掉了強大的功能)。每一個類映射到一個基本的 RDBMS 概念上,同時也映射到一個 JDBC 類上。就是這種映射讓我們的 API 可以在保持易用性的同時保留它的相關特性。
  
  這種 API 的設計是基于對我們的數據存儲需要的設想。假如您發現自己的程序需要一點不同的地方,您可以隨意地改變這種抽象以適應您的情況。這些類可以被認為是一種簡化您工作的模式,而不是一成不變的規則。
  
  假如您不熟悉 SQL 或者 RDBMS 技術,不必害怕。下面的四節中,每一節都會幫助您熟悉我們的一個類,還有這些類映射到的 RDBMS 功能。
  
  Database 類
  當使用 JDBC 與數據庫建立連接時,您必須告訴 JDBC 在何處可以找到實際的數據。因為不同的數據庫引擎有不同的訪問方法和描述這些方法的不同語法,所以有不止一種方法來指定數據源。在 JDBC 中,統一資源標識符(Uniform Resource Identifier,URI)字符串是用來指定數據源的,而這個字符串的結構是依靠于數據庫的。
  
  Database 類的主要目的就是封裝這個字符串,還有建立連接操作時可能需要的任何用戶名/密碼信息。
  
  下面是如何創建一個 Database 對象的方法:
  
  Database db =
  new Database( /"jdbc:postgresql://localhost/mito/",
  /"mito/", /"/" );
  
  構造函數的第一個參數是數據源的 URI。在這個示例中,我使用了 PostgreSQL 數據庫引擎,而且在本機上訪問了一個名為 mito 的數據庫。另外,我指定我的用戶名 mito 和一個空的密碼分別作為第二個和第三個參數。
  
  一旦您創建了 Database 對象,您就可以使用它來訪問數據,如我們在下一章可以看到的一樣。
  
  Table 類
  我們在 API 中對簡化的一個設想就是,當您從表的一行讀取數據時,您會得到整行的數據。換句話說,表的一行是作為讀寫單獨一塊數據的最小單位。這并不十分有效,但效率不是我們方法中所首要考慮的。
  
  Talbe 類讓您可以讀寫這些行對象。您必須做的第一步是創建一個表對象,它簡單得只要知道它的名稱即可:
  
  Table table = db.getTable( /"employee/" );
  
  創建 Table 對象的操作實際上并沒有做任何事,只是讓對象記住自己的名稱。要做一些實際的事,我們就需要實際地使用這個 Table 對象了。在這里,我們從表中讀取一行。
  
  Row row = table.getRow( /"id=101/");
  
  注重,我們已經指定了我們只需要那些‘id’值設定為‘101’的行。通過使用 getRow() 方法,我們假定只有一行符合這個條件。在另外的情況下,我們可能需要多個行,那樣我們就需要這樣使用 getRows() 方法:
  
  RowSet rows = table.getRows( /"id<103/" );
  
  在這種情況下,返回的值是一個 RowSet,而不是一個 Row。RowSet 就是 Row 的一個集合。
  
  在接下來的兩節里,我們將討論 Row 和 RowSet 類。
  
  Row 類
  在我們的抽象中,Row 是在 RDBMS 中表示表中一行的名稱/值對的集合。不同于 RDBMS 值可以是不同的類型,Row 僅包含一種類型,即字符串類型。這還是為了讓事情簡單一點 — 我們假定您不需要字符串類型提供的任何更強大的功能。
  
  一旦您有了一個 Row,就很輕易從其中取出一個值,正如我們在清單 1 中看見的一樣。
  
  清單 1. 從 Row 中獲取值
  Row e = table.getRow( /"id=100/" );
  String name = e.get( /"name/" );
  System.out.PRintln( /"Employee name: /"+name );
  
  還要注重的是 Row 是排序的,這樣您就可以通過索引來取出名稱/值的對。清單 2 中給出了這樣的一個示例。
  
  清單 2. 迭代整個 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 中的值。這是在數據庫中更改數據所必需的 — 稍后我們會看到這一點。
  
  RowSet 類
  記住有一些查詢可以返回多個 Row,這樣的話您就會得到一個 RowSet。RowSet 有一點不同于基于 Vector 的包裝器。你可以輕易地迭代 RowSet 中所有的 Row,在清單 3 中可以看到這一點。
  
  清單 3. 迭代整個 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....
  }
  
  一個完整的示例
  現在我們已經看過了所有的類,讓我們來看一個完整的示例吧。在清單 4 中,我們將抽取出符合特定條件的一套記錄,然后打印出它們的值。
  
  清單 4. 一個讀取數據的完整示例
  // 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 );
  }
  
  修改數據
  正如前面所提到的,使用我們的 API 讀寫數據是以整個行為單位的。為了向數據庫寫入數據,您必須創建(或修改)Row 對象,然后向數據庫寫入那個 Row 對象。
  
  向數據庫寫入數據是通過使用 Table 中的 putRow 方法。這種方法有兩種變體:
  
  public void putRow( Row row )
  public void putRow( Row row, String conditions )
  
  這兩種變體分別對應于 SQL 中的 INSERT 和 UPDATE 命令。
  
  在第一個變體中,寫一行意味著將一個全新的行插入表中。
  
  在第二個變體中,寫一行意味著修改一個現有的行。conditions 參數使您能夠指定您想要修改的是哪一行(哪些行)。
  
  讓我們來看看每種方法的一個示例。
  
  插入一個新行
  插入一個新行很簡單,因為您不必指定要修改的行(一行或多行)。您只是簡單地把行插入:
  
  table.putRow( row );
  
  您可以重新創建一個 Row,如清單 5 所示。
  
  清單 5. 重新創建一個 Row
  // Create an empty row object
  Row row = new Row();
  // Fill it up with data
  row.put( /"id/", /"200/" );
  row.put( /"name/", /"Joey Capellino/" );
  
  或者,您可以修改一個以前曾經從數據庫中讀取的一個現有的行,如清單 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/" );
  
  雖然通常是在插入時重新創建 Row,更新時使用現有的 Row,實際上您可以用任何方式來進行。
  
  更新現有的行
  正如前面的部分提到的,對于您如何創建用來更新的 Row 是沒有限制的。但是,通常您是使用一個剛

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品成人在线| 中文字幕日韩专区| 国产成人精品久久二区二区91| 中文字幕视频一区二区在线有码| 欧美午夜www高清视频| 国产suv精品一区二区| 在线日韩精品视频| 亚洲乱码一区av黑人高潮| 日韩欧美亚洲范冰冰与中字| 97免费在线视频| 在线播放日韩av| 久久免费少妇高潮久久精品99| 久久久精品视频在线观看| 国产福利成人在线| 91久久国产婷婷一区二区| 亚洲а∨天堂久久精品9966| 亚洲精品影视在线观看| 亚洲最大中文字幕| 91成人精品网站| 国产精品精品视频一区二区三区| 91精品久久久久久久久久入口| 在线观看国产精品91| 中文字幕久精品免费视频| 久久中国妇女中文字幕| 欧美激情影音先锋| 国产一区二区黑人欧美xxxx| 久久久免费高清电视剧观看| 精品无人区乱码1区2区3区在线| 日韩av免费在线观看| 精品在线小视频| 欧美成人精品在线观看| 亚洲精品在线观看www| 亚洲福利视频网| 成人av在线天堂| 91在线精品播放| 狠狠久久亚洲欧美专区| 亚洲人成在线电影| 亚洲自拍偷拍网址| 国产欧美va欧美va香蕉在| 国产美女久久精品香蕉69| 人九九综合九九宗合| 亚洲精品国产美女| 欧美日韩国产综合视频在线观看中文| 午夜精品一区二区三区在线视| 欧美精品中文字幕一区| 亚洲免费视频在线观看| 国产精品av在线播放| 亚洲成人免费网站| 日韩成人在线电影网| 在线观看免费高清视频97| 国产精品丝袜一区二区三区| 欧美成人在线影院| 国产剧情日韩欧美| 日韩av在线天堂网| 欧美精品亚州精品| 国产精品视频1区| 成人免费在线网址| 91精品国产成人www| 亚洲激情 国产| 一个人www欧美| 98精品国产自产在线观看| 欧美激情xxxx性bbbb| 国产精品一二区| 国产午夜精品理论片a级探花| 亚洲美女又黄又爽在线观看| 国产精品18久久久久久麻辣| 高清一区二区三区日本久| 日韩中文有码在线视频| 国产视频自拍一区| 色偷偷9999www| 成人信息集中地欧美| 亚洲网站视频福利| 日韩欧美大尺度| 91经典在线视频| 久久久久久久久久久人体| 91在线|亚洲| 欧美怡红院视频一区二区三区| 亚洲免费成人av电影| 国产精品久久久久久搜索| 国产99久久精品一区二区永久免费| 久久精品视频在线播放| 91老司机精品视频| 国产视频精品一区二区三区| 亚洲国产精品视频在线观看| 亚洲综合av影视| 国产91ⅴ在线精品免费观看| 两个人的视频www国产精品| 国产午夜一区二区| 欧美极品欧美精品欧美视频| 亚洲97在线观看| 国产精品99久久久久久白浆小说| 亚洲精品资源在线| 欧美国产日韩二区| 久久亚洲精品毛片| 国产日本欧美在线观看| 日韩电视剧免费观看网站| 久久亚洲精品小早川怜子66| 精品无人国产偷自产在线| 欧美www在线| 久久成人av网站| 精品网站999www| 91亚洲精品在线观看| 精品久久久一区| 亚洲第一二三四五区| 国产精品久久中文| 热门国产精品亚洲第一区在线| 欧美高清视频在线| 国产精品91免费在线| 亚洲国产美女久久久久| 91影视免费在线观看| 日韩亚洲综合在线| 日本精品久久中文字幕佐佐木| 亚洲精品在线观看www| 欧美精品午夜视频| 欧美色另类天堂2015| 日韩激情av在线播放| 亚洲国产精品久久久久秋霞不卡| 欧美精品在线免费| 欧美老女人在线视频| 欧美自拍视频在线| 国产精品国产三级国产专播精品人| 91精品久久久久久久久久久久久| 亚洲美女福利视频网站| 久久久久久亚洲| 日韩国产欧美精品一区二区三区| 色综合久久中文字幕综合网小说| 久久亚洲欧美日韩精品专区| 97香蕉超级碰碰久久免费软件| 欧美一级成年大片在线观看| 亚洲va国产va天堂va久久| 国产精品自产拍在线观看中文| 色悠悠国产精品| 91av国产在线| 欧美精品在线看| 国产精品永久免费在线| 亚洲精品一区二区三区婷婷月| 日韩美女主播视频| 国产精品免费一区二区三区都可以| 国产精品高潮在线| 国产一区二区丝袜高跟鞋图片| 九九精品视频在线观看| 亚洲精品一区二区三区婷婷月| 亚洲免费视频在线观看| 久久精品一本久久99精品| 国产精品欧美日韩久久| 国产精品91久久久久久| 热99精品里视频精品| 一本色道久久综合狠狠躁篇怎么玩| 欧美裸体xxxx| 亚洲社区在线观看| 久久人人爽人人爽爽久久| 日韩欧美成人精品| 最好看的2019的中文字幕视频| 国内精品400部情侣激情| 奇米4444一区二区三区| 亚洲精品videossex少妇| 国模gogo一区二区大胆私拍| 91丝袜美腿美女视频网站| 欧美成人精品h版在线观看| 狠狠躁夜夜躁人人爽天天天天97| 日韩高清有码在线| 91po在线观看91精品国产性色| 91精品在线播放| 国产日韩亚洲欧美|