亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 實體對象的抽象以及一種基于數據庫的實現(轉).txt

?? 一個很好的JAVA學習文檔 包括很多JAVA學習有關的文本文檔
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
作者:sure160
email: sure160@china.com
日期:6/13/2001 12:46:36 PM
簡介:本文探討了關系數據庫中的實體對象在面向對象語言中如何抽象、實現,并提出一種實現方案。
一、為什么要使用實體對象的概念 
實體對象指的是可永久存儲的數據對象,通常可以用關系數據庫的一張數據表或一張主表和與之連接的幾張子表來表示。為什么要引入實體對象的概念呢?我可以肯定您是看過關于面向對象優點的長篇大論的,不過我覺得有必要再嘮叨兩句,因為不是所有用C++或JAVA編程的人都是使用面向對象的方式想問題的。 

在現實世界中,對象比它的屬性要穩定,所以數據要抽象成對象。比如由于需求的修改,一個圖書管理系統要顯示更多的書目詳細信息,圖書的屬性發生了變化,而圖書這個對象并沒有變,和其他對象(例如書架、借閱者)之間的關系也沒有變。用一個數據對象來保存書目信息的程序修改起來要簡單的多。 
把實體對象如何永久儲存的方法封裝到對象中可以實現使用對象的外部程序的與數據庫無關,便于程序的移植。 
在程序設計中使用實體對象概念把面向對象分析、面向對象設計、面向對象編碼著幾個步驟連貫和一致。 
可以減少外部程序中復雜性,使用這些實體對象的程序只需要簡單的調用insert()或update()的方法,而不用去寫討厭的SQL語句。

但是,由于歷史原因,即使象Java這樣的新興語言,也沒有在所有地方完全利用面向對象的思想。讓我們看看JDBC吧,這是一個號稱用對象封裝的數據庫接口。可是它封裝的是什么呢?連接、語句、結果集和存儲過程。這其實并不是我們設計系統所關心的東西,我們關心的是數據對象本身,而不是它從數據庫中提取的方法。當然,JDBC本身也不該受到太多的指責,因為他本來的目標就是封裝、屏蔽關系型數據庫之間的差異,而不是企圖實現一個面向對象的數據庫。

EJB第一次引起我的注意就是因為它提出的Entity Bean,也就是實體對象。它對實體對象提供了一套完整的實現思路,但是我認為它太復雜了,主要原因是EJB想要做的事太多了。大部分情況下我并不需要分布式處理,我也不需要把實體對象存儲到文件中去。我需要的僅僅是在一個本地運行的基于數據庫的程序。

二、EJB如何實現的實體對象 
剛才提到了EJB已經實現了實體對象,那么讓我們看看它是如何實現的。EJB中Entity Bean的對象實際上是對數據對象的一種完美的抽象,在這里我們幾乎看不到數據庫管理系統的作用。一個實體對象有幾種狀態,在內存中、在磁盤緩存中、或者在數據庫中,實體對象的這些狀態通常我們是不關心的,EJB的容器在必要的情況下會自動轉換對象的狀態,也就是說自動把它存到數據庫中,或從數據庫中取出。我們要訪問一個數據對象,要向一個對象容器提出申請,由它返回一個對象實例供我們使用。一個Entity Bean對應于數據表中的一行。如果我們訪問的是同一行數據,對象容器返回的是不同的對象,但都指向同一個Entity Bean,并把我們所有的方法請求都發送給這個Entity Bean。實際上EntityBean的容器基本實現了一個面向對象的數據庫。它這種實現方法帶來幾個顯著的問題: 

運行效率非常低。JAVA的速度慢是個老問題了,EJB的速度慢不光是因為大量代碼用JAVA實現,而且由于它的結構,要根據數據表中的某一個屬性查出一行數據,必須首先用SQL查詢查找到這一行的主鍵(Primary Key),然后通過主鍵來找到這個Bean,如果這個Bean不在內存中--很不幸,這種情況經常發生,那么實際上是執行了兩次SQL查詢才找到一行數據。 
容器本身要管理事務,以防數據的污讀、污寫、死鎖等等一系列問題。本來DBMS管理這類問題已經有很多年經驗了,已經相當完美的解決了這些問題,可是EJB不得不通過一個Transcation Server來管理這些問題。這使得容器的代碼變得極其復雜,另外編程人員也不得不重新熟悉這些接口。 
由于bean 中的數據是否存儲在數據庫里是由容器管理的,那么其他程序訪問數據庫會帶來數據同步的問題。因此,在EJB架構中,外部程序不能直接訪問數據庫,只能通過EJB訪問。

三、我們實現的目標 
我們只想把數據庫對象更好的封裝起來,為什么要購買別人昂貴的代碼?為什么要為我們不會用到的分布式去犧牲大量的性能。我們想要盡量使用DBMS的功能,以實現最佳的性能和最簡化的代碼。

事務處理最好還是用DBMS來管理,因為它一向管得很好,而且事務處理的代碼很復雜,我不打算自己來完成。

我不打算用同一個對象來指向數據庫的一行。數據庫的一行數據在程序中可能有多個對象,這些對象都應該是臨時對象,而不是永久對象。他們的共享問題由DBMS本身加鎖來解決。

由于我們只是為訪問DBMS提供了一個接口,外部程序完全可以不通過這個接口來訪問數據庫。

實現后,使用實體對象的代碼要簡單。例如,數據庫里有一個表account,它只有兩個字段accountid和name,我們把它作為一個實體對象Account,假設我們要完成從數據庫查詢、修改、插入,使用它的代碼片段如下: 
Connection conn=ConnectionPool.getConn(); //也可以通過標準的DriverManager得到數據庫連接,這是完全一樣的

  Conn.setAutoCommit(false); //如果不使用事務,這一行可以省去

Account a1=new Account(conn);

a1.getByAccountId(1); //查找到相應記錄

System.out.println(a1.name);

a1.getByAccountIdForUpdate(1); //如果企圖修改一個對象,必須通過forUpdate系列的方法得到這個對象

  a1.name="new name";

  a1.update();  //修改原有記錄

Account a2=new Account(conn);

a2.accountId=3;

  a2.name="姚大";

  a2.insert();  //插入一條新記錄

  conn.commit();
 


實體對象的屬性通過方法修改是比較理想的方式,如用getName(),setName()兩個方法訪問Name屬性。這還可以解決屬性之間相互關聯的問題。例如,表中有一個地區代碼和地區名稱兩個域,必須保持一致,這就可以考慮在屬性設置方法中實現。在這里我們為了簡單,直接通過屬性修改,在一般情況下,我覺得也是可以接受到。

有一點必須注意的就是多線程程序所帶來的數據完整性問題。對于我們常使用的從數據庫讀取數據到對象中->修改對象屬性->更新到數據庫這個流程,非常容易出現數據完整性破壞問題。比如一個進程中甲對象讀取數據后,另一個進程中乙對象又修改了同一數據,這時甲對象再次更新數據庫會帶來污寫。解決的辦法是對象增加一個方法給數據庫的這條記錄加鎖。例如Account.getByAccountId函數改為Account.getByAccountIdForUpdate,這個函數中相應的sql語句(ORACLE數據庫)改為"select AccountId,name from account where accountId=? for update",這樣數據取出后就自動加鎖,這個鎖將會在事務提交或回滾時釋放。for update在SQLServer相應的語法為holdlock。

說到數據庫加鎖的問題就不能不考慮到數據庫死鎖的可能。想完全避免死鎖是很困難的,只有盡量降低這種可能性。方法是:1、盡量少使用forUpdate這種函數,只有在更改數據庫數據時才使用。查詢的時候不要用,如果查詢后根據某個條件有可能修改,那么在查詢時不加鎖,在修改前重新調用forUpdate函數加鎖。2、盡量以某個特定的順序加鎖。例如有表A和表B,兩個程序都要同時更新這兩個表,最好都是先訪問表A,再訪問表B。

Oracle有個很好的功能就是自動檢測死鎖。如果發生死鎖,會回滾一個事務,并返回一個SQL錯誤,我們的程序要檢測這個異常,處理程序中可能的錯誤。

上面說到的對象中,只有getByXXX()這樣的方法,這種方法只會返回唯一的對象,如果想要返回一組對象,這時需要一個輔助類來實現。這個輔助類稱為對象瀏覽器EntityBrowser。再實體對象中返回一個對象瀏覽器的方法一般命名為getAllByXXX()

使用對象瀏覽器EntityBrowser要列出所有account表中的id和name的代碼如下,其實這個對象瀏覽器和Java定義的Enumeration接口的最大區別就是它有一個close方法。請看下面的代碼片斷,它輸出所有的Accout對象。


       Connection conn=ConnectionPool.getConn();

       Account a1=new Account(conn);

       EntityBrowser browser=a1.getAll();

       System.out.println("==Account List==");

       While (browser.hasMoreElement()) {

              Account a=(Account)browser.nextElement();

              System.out.print(a.accountId);

              System.out.print("--");

              System.out.println(a.name);

       }

       browser.close();
 


以上就是我們要實現的實體對象,下面介紹如何編寫一個實體對象。

四、實現的代碼解釋 
首先,下面的代碼定義一個所有實體對象的基礎類EntityObject,這是一個抽象類,不能直接使用,但為其它實體對象定出了一個結構。 
Import java.sql.*;
/**所有實體對象基礎類*/
abstract public class EntityObject {
       protected java.sql.Connection _conn;
       private boolean _dbStored;
       /**實體對象需要用一個數據庫連接初始化,這樣可以利用這個連接做事務提交或回滾*/
       public EntityObject(Connection conn) {_conn=conn;_dbStored=false;}

       /**這個方法用來插入新記錄,子類必須重定義這個方法*/
       public void insert() throws SQLException{ _dbStored=true;}

       /**這個方法用來修改數據庫原有記錄,子類必須重定義這個方法*/
       public void update() throws SQLException {_dbStored=true; }

	   /**這個方法用來刪除數據庫原有記錄,子類必須重定義這個方法*/
       public void delete() throws SQLException {_dbStored=false; }

       /**這個方法用來把數據庫select語句得出的結果映射到對象的屬性中去,子類必須重定義這個方法*/
       public void _setAttribute(ResultSet rs) throws SQLException {_dbStored=true; }

       /**這個方法可以判斷這個對象是否已存在數據庫中*/
       public boolean isDbStored() {return _dbStored;}
       /**這個方法將實體對象設為不存在數據庫中,所有的getByxxx()方法首先要調用這個方法,使本對象無效,才能用select語句得到符合條件的對象*/
       public void clearDbStored() {_dbStored=false;}
}


 


下面我們就可以定義一個實際的實體類。考慮一種簡單情況,實體對象在關系數據庫中只用一張表表示。這樣的實體對象定義最簡單。例如,數據庫里有一個表account,它只有兩個字段accountid和name,下面定義它的實體類。實體類必須重載insert,update,_setAttribute方法,然后根據需要增加getByXXX()方法,根據某個屬性從數據庫查找一個對象。


Import java.sql.*;
public class Account extends EntityObject {
/*這里定義實體對象類所有的屬性*/
       public int accountId;
       public String name;
//最好將實體對象中的屬性全部定義成私有,然后定義getXXX(), setXXX()兩個方法來訪問這個屬性,這樣的封裝性最好,但略過于麻煩。如果數據結構預料會經常修改,最好用這個辦法。否則,定義成公有屬性也可。
       Public Account(Connection conn){ super(conn); }
       //重定義這個方法,執行實際的sql命令
public void insert() throws SQLException {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av免费在线播放| 久久亚洲综合色一区二区三区| 欧美一区二区在线看| 国产精品色一区二区三区| 三级久久三级久久| 色偷偷88欧美精品久久久| 日韩欧美高清一区| 亚洲午夜电影网| 99久久久国产精品| 久久亚洲一区二区三区四区| 亚洲成人自拍偷拍| 91小视频在线观看| 中文无字幕一区二区三区| 久久精品国产99国产精品| 欧美日韩免费一区二区三区 | 国产成人精品亚洲777人妖| 欧美精三区欧美精三区| 亚洲三级免费观看| 成熟亚洲日本毛茸茸凸凹| 久久综合国产精品| 久久精品久久99精品久久| 欧美日韩午夜在线视频| 一二三四社区欧美黄| 91小视频在线观看| 亚洲日本在线看| 97精品电影院| 中文字幕一区二| av午夜精品一区二区三区| 国产精品久久久久久久裸模| 国产精品一区二区在线播放| 精品久久久久av影院| 精品一区二区三区在线视频| 日韩一区二区在线观看| 日韩二区在线观看| 在线播放亚洲一区| 日本中文字幕不卡| 日韩欧美国产综合| 国产在线播放一区二区三区| 久久青草欧美一区二区三区| 国产一区三区三区| 久久久精品欧美丰满| 国产成人夜色高潮福利影视| 日本一区二区三区国色天香| 成人免费观看视频| 亚洲美女区一区| 99综合电影在线视频| 亚洲综合在线免费观看| 精品视频资源站| 日产国产欧美视频一区精品| 欧美tickling挠脚心丨vk| 国产夫妻精品视频| 亚洲欧美另类久久久精品2019| 欧美这里有精品| 久久国产综合精品| 国产视频亚洲色图| 成人av集中营| 亚洲v日本v欧美v久久精品| 欧美一区二区三区在| 国产精一品亚洲二区在线视频| 国产精品色呦呦| 欧美男人的天堂一二区| 韩国成人精品a∨在线观看| 国产精品美女久久久久久2018| 欧美日韩一区二区在线视频| 狠狠色丁香九九婷婷综合五月| 欧美激情一区三区| 欧美熟乱第一页| 国精产品一区一区三区mba桃花 | 欧美一区二区免费| 风间由美性色一区二区三区| 一区二区三区在线视频观看58| 日韩欧美中文字幕公布| av在线综合网| 久久国产尿小便嘘嘘尿| 亚洲乱码国产乱码精品精小说 | 蜜桃视频一区二区三区| 国产欧美精品一区| 制服丝袜成人动漫| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美大片一区二区| 色婷婷av一区| 国产成人无遮挡在线视频| 亚洲一二三四在线| 国产精品毛片大码女人 | 欧美三级日本三级少妇99| 激情成人综合网| 亚洲电影第三页| 国产精品女人毛片| 欧美成人一区二区三区在线观看 | 韩国理伦片一区二区三区在线播放| 亚洲欧洲日产国产综合网| 精品福利一区二区三区| 欧美亚洲国产一区二区三区va| 国产91露脸合集magnet| 精品一区二区三区免费毛片爱| 亚洲午夜视频在线观看| 中文字幕在线观看一区| 久久综合久久综合久久| 在线不卡a资源高清| 91国模大尺度私拍在线视频| 成人午夜碰碰视频| 精品一区二区av| 美女一区二区三区| 青青青伊人色综合久久| 亚洲成人精品一区| 午夜国产不卡在线观看视频| 亚洲欧美日韩精品久久久久| 国产午夜精品一区二区| 国产日产欧美一区| 久久久久国色av免费看影院| 久久在线免费观看| 亚洲精品一区二区三区蜜桃下载 | 欧美性一级生活| 99精品偷自拍| 97久久精品人人爽人人爽蜜臀 | 国产精品18久久久久久久网站| 久久电影网站中文字幕| 久久99精品久久只有精品| 蜜桃视频一区二区三区| 美日韩一级片在线观看| 激情综合色丁香一区二区| 国产最新精品精品你懂的| 国产精品一品视频| 波多野结衣亚洲一区| 色综合久久88色综合天天免费| 99久久精品免费观看| 欧美在线综合视频| 666欧美在线视频| 精品嫩草影院久久| 国产调教视频一区| 中文文精品字幕一区二区| 亚洲三级视频在线观看| 午夜欧美2019年伦理| 久久精品国产久精国产| 风间由美一区二区三区在线观看| 粉嫩在线一区二区三区视频| 91欧美激情一区二区三区成人| 欧美系列一区二区| 91精品国产丝袜白色高跟鞋| 久久久久久久久久久久久女国产乱 | 99精品国产热久久91蜜凸| 色88888久久久久久影院野外| 欧美午夜一区二区三区免费大片| 欧美一卡二卡在线观看| 国产精品国产三级国产三级人妇| 日韩精品久久理论片| 亚洲精品免费播放| 午夜成人免费电影| 国产精品一区二区男女羞羞无遮挡| 成人av资源下载| 欧美日韩亚洲综合一区| xf在线a精品一区二区视频网站| 国产欧美日韩久久| 日韩和欧美一区二区| 国产乱码字幕精品高清av| 91久久香蕉国产日韩欧美9色| 欧美一个色资源| 最好看的中文字幕久久| 日本三级亚洲精品| 91蜜桃免费观看视频| 欧美变态tickle挠乳网站| 亚洲视频一区二区在线| 国内精品自线一区二区三区视频| 91在线你懂得| 日韩精品一区二| 亚洲成人手机在线| 99久久精品免费看国产免费软件| 日韩午夜激情免费电影| 一区二区三区免费观看| 国产一本一道久久香蕉| 777久久久精品| 欧美高清视频不卡网| 久久精品亚洲精品国产欧美kt∨ | 狠狠色丁香久久婷婷综合丁香| 91美女在线视频| 国产农村妇女毛片精品久久麻豆 | 国产精品伦一区二区三级视频| 婷婷综合五月天| a4yy欧美一区二区三区| 久久久久久久久久久久久久久99| 亚洲成人av电影| 欧洲精品一区二区三区在线观看| 欧美精品一区二区久久婷婷| 偷拍与自拍一区| 欧美怡红院视频| 夜夜嗨av一区二区三区中文字幕| 99久久精品国产麻豆演员表| 精品播放一区二区| 狠狠色丁香婷综合久久| 精品久久五月天| 看电视剧不卡顿的网站| 欧美精品在线一区二区| 亚洲国产美国国产综合一区二区| a亚洲天堂av| 亚洲欧洲日韩综合一区二区| 99这里只有久久精品视频| 中文文精品字幕一区二区| 大白屁股一区二区视频| 国产精品三级av| 99re这里只有精品6|