實現資料庫
❶ 如何實現該資料庫設計和實現
XP?sql2005, 64位2008,可以網上下載
❷ 如何實現資料庫完整性
資料庫中的數據是從外界輸入的,而數據的輸入由於種種原因,會發生輸入無效或錯誤信息。保證輸入的數據符合規定,成為了資料庫系統,尤其是多用戶的關系資料庫系統首要關注的問題。數據完整性因此而提出。數據完整性是指數據的精確性和可靠性。它是應防止資料庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。數據完整性分為四類:實體完整性、域完整性、參照完整性、用戶定義的完整性。資料庫採用多種方法來保證數據完整性,包括外鍵、約束、規則和觸發器。系統很好地處理了這四者的關系,並針對不同的具體情況用不同的方法進行,相互交叉使用,相補缺點。
樓上說的主鍵外鍵只是一方面,還有約束、規則和觸發器,通過設置,由DBMS來自動完成。
❸ 如何用EXCEL實現資料庫管理
EXCEL資料庫管理
任務 在熟悉建立EXCEL資料庫和對記錄進行基本操作的基礎上,初步了解EXCEL的資料庫管理功能,掌握如何對記錄進行插入、刪除、修改、排序、篩選等,體驗EXCEL在數據管理功能上的方便與快捷。
試
1. 建立資料庫,並對該資料庫進行如下幾個操作。
提示:選定一行,依次輸入欄位名,從欄位名下一行起依次輸入各條記錄的值,如圖7-1中A2:F12這個區域就是一個資料庫,且資料庫區域下方最好沒有其他數據,否則會帶來操作不便。
按如下要求對資料庫進行操作:
2. 查找學號為20040106的記錄,並刪除。
提示:選定資料庫區域中任意單元格,「記錄單」 「條件」,打開記錄單的條件對話框,在學號欄輸入「20040106」,按「下一條」或「上一條」找到記錄後單擊「刪除」按鈕刪除記錄。
3. 在最後一條記錄後增加一條記錄,對應欄位值分別為「20040112」,「李利」,「女」,「5」,「3」,「2」。
提示:先單擊「新建」按鈕打開類似圖7-2的新建對話框,輸入所有欄位值,再單擊「新建」,否則不能將數據輸入到工作表中。
4. 將性別為男的記錄篩選出來。
提示:選定資料庫區任意單元格後,「數據」 「篩選」 「自動篩選」,工作表將變成
做
1. 建立圖7-4所示的名為「某公司在職人員情況表」的資料庫,保存在d:/user目錄下自己的文件夾下,文件名為「職工檔案.xls」。
對上題中建立的資料庫做如下操作:
2. 用「記錄單」的查詢功能查找所有姓李的職工。
提示:打開記錄單的條件對話框,在姓名欄輸入「李*」,單擊「下一條」或「上一條」按鈕。
3. 用「記錄單」的功能查找工資大於1500的所有職工。
提示:在記錄單條件對話框的工資欄中輸入「>1500」,查找方法同上題。
4. 刪除編號為「zg0008」的職工記錄,並插入一條記錄,該記錄的欄位值分別為:「zg0020」、「劉柳」,「男」,「31」,「已婚」,「銷售部」,「1250」,「2000」。
提示:在記錄單對話框中找到編號為「zg0008」的記錄並刪除;單擊新建後先輸入所有欄位然後再單擊新建進行添加。
5. 查詢所有已婚的職工,要求在工作表中同時顯示出來。
提示:可使用「數據」菜單的「篩選」功能,資料庫區將只顯示已婚的記錄。
6. 對資料庫按工資從低到高進行排序。
想
1. 打開d:/user下自己的文件夾中文件名為「職工檔案.xls」的資料庫,做如下操作。
(1) 查找性別為男且工資大於1500的職工記錄。
(2) 利用記錄單新建功能在第4條記錄之前插入一條記錄。
提示:先在第4條記錄之前插入一行,然後選擇第4條記錄之前任意單元格後打開記錄單對話框進行添加就可以了。
2. 試在一個工作表sheet1中給自己建立一個通訊錄,欄位名欄如圖7-7,以「通訊錄.xls」為文件名保存在d:\user下自己的文件夾下,並做下面幾個操作。
提示:欄位名 「關系」表示人與人的關系,一般有:親戚、朋友、同事、同學等。
(1) 列印一張「關系」欄位值為同學的通訊錄。
提示:因為通過篩選後資料庫區將只顯示被篩選出來的記錄,且在篩選狀態進行列印,將只列印被顯示的記錄,所以可通過篩選功能實現列印要求。
(2) 若要列印的「關系」欄位值為同學的通訊錄要求按姓氏排序,該如何操作呢?
提示:先進行篩選,選擇資料庫區任意單元格後打開排序對話框,進行排序設置,單擊「確定」後就可以連接列印機進行列印。
(3) 若要增加一條記錄,該如何添加呢?
提示:添加方法一,在EXCEL工作表中直接添加,例如在資料庫第二條記錄前插入一行,然後輸入相關欄位值就可以了;方法二,利用「記錄單」對話框中「新建」功能進行添加。
(4) 如何以最快的速度刪除一條記錄呢?
提示:若通訊錄中記錄很少,可在工作表中直接刪除記錄;若記錄很多,就利用「記錄單」對話框的功能進行刪除。
議
1. 通過以上的操作,我們已熟悉了EXCEL的資料庫功能,若要刪除一條記錄,我們有幾種方法呢?這些方法有哪些優點呢?
2. 在資料庫中插入一條記錄的方法有幾種,不同的方法插入記錄時對資料庫都有哪些要求呢?
3. 在排序過程中,為什麼有時記錄是隨關鍵字(某個欄位)整體排序,而有時只對某一列排序呢?我們應該如何操作才能正確排序呢?
4. 為什麼我們建立EXCEL資料庫時,中間不能有空的行與列呢?若資料庫中有空行或空列,對記錄的操作有無影響呢?如:用記錄單的查詢功能是否能正確查詢到記錄呢?
❹ 怎樣實現資料庫實時同步這種思路是否可行
建立遠程資料庫鏈接,然後在你需要同步的表上建觸發器:每當表有修改時,自動修改遠程資料庫的相應表。
----------------------------------
抱歉,你的題目我沒理解正確,其實你使用雙機熱備就行了,在網上找到一個教程,是這個網址:
http://blog.csdn.net/isoftk/archive/2007/12/03/1914175.aspx
你看一下吧。
----------------------------------
不是,我先前的理解不正確,後來的理解才正確,現在是你開始走彎路了,你就按照我給的網址學習雙機熱備吧,肯定能達到你的目的。
另:送你關於遠程資料庫映射的東西:
SqlServer資料庫:
--這句是映射一個遠程資料庫
EXEC sp_addlinkedserver '遠程資料庫的IP或主機名',N'SQL Server'
--這句是登錄遠程資料庫
EXEC sp_addlinkedsrvlogin '遠程資料庫的IP或主機名', 'false', NULL, '登錄名', '密碼'
--登錄後,可以用以下格式操作遠程資料庫中的對象
select * from [遠程資料庫的IP或主機名].[資料庫名].[dbo].[表名]
我仔細考慮了一下,用這種方式無法滿足你的要求,所以請你用雙機熱備完成。
-------------------------------
原來是要在互聯網環境下啊,你一直沒有提,汗。。。
我水平有限,這個沒什麼好的思路,幫不上你,抱歉了。
我所能想到的,只有兩種不成熟的思路:
1、用VPN架出局網環境,這個你可能條件所限,不能實現。
2、第二種思路是以我淺薄的知識想像出來的笨方法,拐彎抹角的而且不安全,大體思路就是,在B伺服器上架構一個WEB伺服器,用ASP或JSP什麼的做一個頁面,可以接收字串參數並作為sql語句執行(當然你要做好驗證工作),然後修改A伺服器的程序,使其每當對資料庫有修改操作時,就同時向B機的WEB主頁發送一個頁面申請(比如 http://111.222.333.444/runsql.asp?sql=update AA set BB='cc'),這樣B主機的WEB服務就會同步執行這個SQL語句了。(注意這種方法需要你的B機是以固定IP模式連網的,這需要向電信局申請)
說實話這第二種方法連我自己都覺得可笑,但水平實在有限,所以在這兒只是大膽說出我的想法,還請樓主或是其它高手看了不要見笑。
❺ 資料庫得查詢功能是怎麼實現的
資料庫的查詢功能實現原理:
資料庫查詢是資料庫的最主要功能之一。我們都希望查詢數據的速度能盡可能的快,因此資料庫系統的設計者會從查詢演算法的角度進行優化。最基本的查詢演算法當然是順序查找(linear search),這種復雜度為O(n)的演算法在數據量很大時顯然是糟糕的,好在計算機科學的發展提供了很多更優秀的查找演算法,例如二分查找(binary search)、二叉樹查找(binary tree search)等。如果稍微分析一下會發現,每種查找演算法都只能應用於特定的數據結構之上,例如二分查找要求被檢索數據有序,而二叉樹查找只能應用於二叉查找樹上,但是數據本身的組織結構不可能完全滿足各種數據結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在數據之外,資料庫系統還維護著滿足特定查找演算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找演算法。這種數據結構,就是索引。
圖1展示了一種可能的索引方式。左邊是數據表,一共有兩列七條記錄,最左邊的是數據記錄的物理地址(注意邏輯上相鄰的記錄在磁碟上也並不是一定物理相鄰的)。為了加快Col2的查找,可以維護一個右邊所示的二叉查找樹,每個節點分別包含索引鍵值和一個指向對應數據記錄物理地址的指針,這樣就可以運用二叉查找在O(log2n)O(log2n)的復雜度內獲取到相應數據。
❻ 怎麼實現網頁和資料庫(SQL)的連接
sql
server
2000無論是個人版、企業版還是標准版,只要細版本在8.00.1760以下,均不提供遠程資料庫連接,即使伺服器端工具和客戶端工具的設置均有tcp/ip設置和資料庫連接屬性也設置了rpc遠程連接,仍然不能實現遠程連接。該怎麼解決呢?
解決方案如下:
首先,需要打sp4補丁,該補丁包含了以前sp1、2、3的補丁,安裝此補丁後一般要重新啟動計算機,再進行遠程連接就可以了,如再企業管理器可遠程注冊伺服器、查詢分析可連接遠程伺服器、odbc可連接遠程伺服器。
要點:
1.確認伺服器端sql服務埠號是否為:1433
2.如果不是1433,配置客戶端
3.建立伺服器端登錄帳號,確保角色及管理資料庫
一、查看伺服器端情況
1.
看ping
伺服器ip能否ping通。
這個實際上是看和遠程sql
server
伺服器的物理連接是否存在。如果不行,請檢查網路,查看配置,當然得確保遠程sql
server
伺服器的ip拼寫正確。
2.
在dos或命令行下輸入telnet
伺服器ip
埠,看能否連通。
如telnet
202.114.100.100
1433
通常埠值是1433,因為1433是sql
server
的對於tcp/ip的默認偵聽埠。如果有問題,通常這一步會出問題。通常的提示是「……無法打開連接,連接失敗"。
如果這一步有問題,應該檢查以下選項。
1)
檢查遠程伺服器是否啟動了sql
server
服務。如果沒有,則啟動。
2)
檢查sql
server伺服器端有沒啟用tcp/ip協議,因為遠程連接(通過網際網路)需要靠這個協議。檢查方法是,在伺服器上打開
開始菜單->程序->microsoft
sql
server->伺服器網路實用工具,看啟用的協議里是否有tcp/ip協議,如果沒有,則啟用它。
3)
檢查伺服器的tcp/ip埠是否配置為1433埠。仍然在伺服器網路實用工具里查看啟用協議裡面的tcp/ip的屬性,確保默認埠為1433,並且隱藏伺服器復選框沒有勾上。
事實上,如果默認埠被修改,也是可以的,但是在客戶端做telnet測試時,寫伺服器埠號時必須與伺服器配置的埠號保持一致。如果隱藏sql
server伺服器復選框被勾選,則意味著客戶端無法通過枚舉伺服器來看到這台伺服器,起到了保護的作用,但不影響連接,但是tcp/ip協議的默認埠將被隱式修改為2433,在客戶端連接時必須作相應的改變(具體方式見
二:設置客戶端網路實用工具)。
4)
如果伺服器端操作系統打過sp2補丁,則要對windows防火牆作一定的配置,要對它開放1433埠,通常在測試時可以直接關掉windows防火牆(其他的防火牆也關掉最好)。(4、5步我沒有做就成功了)
5)
檢查伺服器是否在1433埠偵聽。如果sql
server伺服器沒有在tcp連接的1433埠偵聽,則是連接不上的。檢查方法是在伺服器的dos或命令行下面輸入
netstat
-a
-n
或者是netstat
-an,在結果列表裡看是否有類似
tcp
127.0.0.1
1433
listening
的項。如果沒有,則通常需要給sql
server
2000打上至少sp3的補丁。其實在伺服器端啟動查詢分析器,輸入select
@@version
執行後可以看到版本號,版本號在8.0.2039以下的都需要打補丁。
如果以上都沒問題,這時你再做telnet
伺服器ip
1433
測試,將會看到屏幕一閃之後游標在左上角不停閃動。恭喜你,你馬上可以開始在企業管理器或查詢分析器連接了。
❼ 用於實現資料庫各種數據操作的軟體是
用於實現對資料庫進行各種數據操作的軟體稱為資料庫管理系統。
資料庫管理系統是一種操縱和管理資料庫的大型軟體,用於建立、使用和維護資料庫,簡稱DBMS。它對資料庫進行統一的管理和控制,以保證資料庫的安全性和完整性。用戶通過DBMS訪問資料庫中的數據,資料庫管理員也通過DBMS進行資料庫的維護工作。
(7)實現資料庫擴展閱讀:
資料庫管理系統主要包括:進行數據定義語言以及翻譯的相關程序,在這個部分的幫助下,可以讓資料庫的用戶自行進行選擇,並且也能得到翻譯由此形成一個內部形式。
進行數據運行控制的程序,因為這一程序的工作,讓資料庫中的資源可以充分得到管理,並且能實現關於數據的一種控制;資料庫的實用程序則可以使得資料庫在相對完整的基礎上建立起來,並且在相對完整的資料庫系統下讓資料庫得到維護。
❽ 怎麼做一個完整的資料庫
你要是建ORACLE資料庫,還是MSSQL資料庫呢?在建立資料庫之前,需要對其進行設計分析。
需求分析調查和分析用戶的業務活動和數據的使用情況,弄清所用數據的種類、范圍、數量以及它們在業務活動中交流的情況,確定用戶對資料庫系統的使用要求和各種約束條件等,形成用戶需求規約。概念設計對用戶要求描述的現實世界(可能是一個工廠、一個商場或者一個學校等),通過對其中諸處的分類、聚集和概括,建立抽象的概念數據模型。這個概念模型應反映現實世界各部門的信息結構、信息流動情況、信息間的互相制約關系以及各部門對信息儲存、查詢和加工的要求等。所建立的模型應避開資料庫在計算機上的具體實現細節,用一種抽象的形式表示出來。以擴充的實體—(E-R模型)聯系模型方法為例,第一步先明確現實世界各部門所含的各種實體及其屬性、實體間的聯系以及對信息的制約條件等,從而給出各部門內所用信息的局部描述(在資料庫中稱為用戶的局部視圖)。第二步再將前面得到的多個用戶的局部視圖集成為一個全局視圖,即用戶要描述的現實世界的概念數據模型。邏輯設計主要工作是將現實世界的概念數據模型設計成資料庫的一種邏輯模式,即適應於某種特定資料庫管理系統所支持的邏輯數據模式。與此同時,可能還需為各種數據處理應用領域產生相應的邏輯子模式。這一步設計的結果就是所謂「邏輯資料庫」。
物理設計根據特定資料庫管理系統所提供的多種存儲結構和存取方法等依賴於具體計算機結構的各項物理設計措施,對具體的應用任務選定最合適的物理存儲結構(包括文件類型、索引結構和數據的存放次序與位邏輯等)、存取方法和存取路徑等。這一步設計的結果就是所謂「物理資料庫」。驗證設計在上述設計的基礎上,收集數據並具體建立一個資料庫,運行一些典型的應用任務來驗證資料庫設計的正確性和合理性。一般,一個大型資料庫的設計過程往往需要經過多次循環反復。當設計的某步發現問題時,可能就需要返回到前面去進行修改。因此,在做上述資料庫設計時就應考慮到今後修改設計的可能性和方便性。運行與維護設計在資料庫系統正式投入運行的過程中,必須不斷地對其進行調整與修改。
資料庫設計步驟 至今,資料庫設計的很多工作仍需要人工來做,除了關系型資料庫已有一套較完整的數據範式理論可用來部分地指導資料庫設計之外,尚缺乏一套完善的資料庫設計理論、方法和工具,以實現資料庫設計的自動化或互動式的半自動化設計。所以資料庫設計今後的研究發展方向是研究資料庫設計理論,尋求能夠更有效地表達語義關系的數據模型,為各階段的設計提供自動或半自動的設計工具和集成化的開發環境,使資料庫的設計更加工程化、更加規范化和更加方便易行,使得在資料庫的設計中充分體現軟體工程的先進思想和方法。
❾ 如何自己實現一個關系型資料庫
對外數據模型為關系型資料庫,內部的實現主要分成兩大類,一類是disk-based,比如mysql,postgres,一類是memory based,後者包括MemSQL,SAP HAHA,OceanBase。看題目的意思指的是前者。這里說一個disk-based的關系型資料庫涉及多少東西。
上世紀70/80年代內存不大,數據不能都放在內存里,大部分數據都存在磁碟上,讀數據也需要從磁碟讀,然而讀寫磁碟太慢了,所以就在內存里做了一個buffer pool,將已經讀過的數據緩存到buffer pool中,寫的時候也是寫到buffer pool中就返回,buffer pool的功能就是管理數據在磁碟和內存的移動。在buffer pool中數據的管理單位是page。page大小一般幾十KB。一般都可以配置。如果buffer pool中沒有空閑的page,就需要將某一個page提出buffer pool,如果它是dirty page,就需要flush到磁碟,這里又需要一個LRU演算法。一個page包含多條記錄,page的格式需要設計用來支持變長欄位。如果這時宕機了,buffer pool中的數據就丟了。這就需要REDO log,將對數據的修改先寫到redo log中,然後寫buffer pool,然後返回給客戶端,隨後,buffer pool中的dirty page會被刷到數據文件中(NO FORCE)。那麼重啟的時候,數據就能從redo log中恢復。REDO log還沒刷完就刷數據到磁碟可以加快寫入速度,缺點就是恢復的時候需要回放UNDO log,回滾一些還沒有提交的事務的修改。寫log又分為邏輯log和物理log,還有物理邏輯log。簡單說邏輯log就是記錄操作,比如將某個值從1改成2.而物理log記錄具體到record的位置,例如某個page的某個record的某個field,原來的值是多少,新值是多少等。邏輯log的問題是並發情況下不太好恢復成一致。物理log對於某些操作比如create table又過於瑣碎,所以一般資料庫都採用混合的方式。為了跟蹤系統中各種操作的順序,這就需要為log分配id,記做LSN(log sequence number)。系統中記錄各種LSN,比如pageLSN, flushedLSN等等。為了加快宕機恢復速度,需要定期寫checkpoint,checkpoint就是一個LSN。
以上ACID里的C和D有關。下面說A和I,即原子性和隔離性。
這兩個性質通過concurrency control來保證。隔離級別有很多種,最開始有4種,從低到高read uncommitted, read committed, repeatable read, serializable。serializable就是多個事務並發執行的結果和某種順序執行事務的結果相同。除了serializable,其他都有各種問題。比如repeatable read有幻讀問題(phantom),避免幻讀需要gap lock。read committed有幻讀和不可重復讀問題。後來又多了一些隔離級別,比如snapshot isolation,snapshot isolation也有write skew問題。早期,並發控制協議大多是基於兩階段鎖來做的(2PL),所以早期只有前面提到的四種隔離級別,後來,又出現一類並發控制協議,統稱為Timestamp Ordering,所以又多了snapshot isolation等隔離級別。關於隔離級別,可以看看這篇論文 http://research.microsoft.com/pubs/69541/tr-95-51.pdf。2PL需要處理deadlock的問題。
Timestamp Ordering大體的思想就是認為事務之間沖突不大,不需要加鎖,只在commit的時候check是否有沖突。屬於一種樂觀鎖。
Timestamp Ordering具體來說包括多種,最常見的MVCC就是這類,還有一類叫做OCC(optimistic concurrency control)。MVCC就是對於事務的每次更新都產生新的版本,使用時間戳做版本號。讀的時候可以讀指定版本或者讀最新的版本。幾乎主流資料庫都支持MVCC,因為MVCC讀寫互相不阻塞,讀性能高。MySQL的回滾段就是用來保存老的版本。MVCC需要有後台線程來做不再需要的版本的回收工作。Postgres的vacuum就是做這事的。OCC和MVCC的區別是,OCC協議中,事務的修改保存在私有空間(比如客戶端),commit的時候再去檢測沖突,通常的做法是事務開始時看一下自己要修改的數據的最後一次修改的時間戳,提交的時候去check是否這個時間戳變大了,如果是,說明被別人改過了,沖突。沖突後可以回滾或者重試。
上面這些搞定了就實現了資料庫的核心,然後為了性能,需要index,通常有兩種,一種支持順序掃描B+Tree,還有一種是Hash Index。單條讀適合用Hash Index,O(1)時間復雜度,順序掃描只適合用B+Tree,O(logN)復雜度。然後,有些查詢只需要掃描索引就能得到結果,有些查詢直接掃描數據表就能得到結果,有些查詢可以走二級索引,通過二級索引找到數據表然後得到結果。。具體用哪種方式就是優化器的事了。
再外圍一些,關系型資料庫自然需要支持SQL了,由SQL變成最後可以執行的物理執行計劃中間又有很多步,首先SQL通過詞法語法分析生成抽象語法樹,然後planner基於這棵樹生成邏輯執行計劃,邏輯執行計劃的生成通常涉及到等價謂詞重寫,子查詢消除等邏輯層面的優化技術,優化的目的當然是性能。比如等價謂詞重寫,用大於小於謂詞消除like,between .. and..等不能利用索引的謂詞。下一步是邏輯執行計劃生成物理執行計劃,物理執行計劃樹每個節點是一個operator,operator的執行就是實實在在的操作,比如掃表的operator,filter opertor。一個邏輯執行計劃通常可以有多個物理執行對應,選擇哪個就涉及到物理執行計劃優化,這里涉及到經典的cost model,綜合考慮內存,CPU, I/O,網路等。最典型的,三表join,從左到右還是右到左,使用hash join,還是sort merge join等。
❿ java 實現資料庫增刪改查的Dao和DaoImpl的寫法
package org.;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Date;
import org.dbc.DBManageer;
import org.dbc.DBUtil;
import org.vo.CardInfo;
public class CardInfoDao {
public void testResultSetMetaData() {
String sql = "select * from cardinfo";
Connection con = new DBUtil().getConnection();
PreparedStatement ps = null;
ResultSetMetaData rsmd = null;
ResultSet rs = null;
try {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
rsmd = rs.getMetaData();
for (int i = 1; i < rsmd.getColumnCount(); i++) {
System.out.print(" 數據類型名:" + rsmd.getColumnClassName(i));
System.out.print(" 別名:" + rsmd.getColumnLabel(i));
System.out.print(" 列名:" + rsmd.getColumnName(i));
System.out.print(" 數據類型:" + rsmd.getColumnTypeName(i));
System.out.println(" 數據類型:" + rsmd.getColumnType(i));
}
while (rs.next()) {
// 通過反射可以對VO對象(CardInfo)自動賦值
// for(...)
// CardInfo ci=new CardInfo();
// ci.setId(rs.getInt(columnIndex))
/*
* CardInfo ca = new CardInfo(); Class cc = ca.getClass();
*/
/*Class<?> c = Class.forName("org.vo.CardInfo");
CardInfo ca = (CardInfo) c.newInstance();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);//ok */
//載入一個CardInfo類
Class c = Class.forName("org.vo.CardInfo");
Object o = c.newInstance(); //獲得它的一個實例
//定義String類的對象數組
Class[] params = new Class[] { String.class};
//定義float類的對象數組
Class[] floatparams = new Class[] { float.class};
//定義Date(util)類的對象數組
Class[] dateparams = new Class[] { Date.class};
//獲得setCardId方法
Method me = c.getMethod("setCardId", params);
//實例方法的參數
Object []ostr = new Object[]{rs.getString("cardId")};
//如果底層方法是靜態的,那麼可以忽略指定的 obj 參數。該參數可以為 null。
//如果底層方法所需的形參數為 0,則所提供的 args 數組長度可以為 0 或 null。
//o 調用方法的對象 ostr 方法調用的參數
me.invoke(o, ostr);
//獲得setCustomerName方法
Method name = c.getMethod("setCustomerName", params);
Object []cusname = new Object[]{rs.getString("customerName")};
name.invoke(o,cusname);
//獲得setCurrentMoney方法
Method money = c.getMethod("setCurrentMoney", floatparams);
Object []cusmoney = new Object[]{rs.getFloat("currentMoney")};
money.invoke(o,cusmoney);
//獲得setOpenDate方法
Method date = c.getMethod("setOpenDate",dateparams);
Object []openDate = new Object[]{rs.getDate("openDate")};
date.invoke(o, openDate);
//列印
System.out.println(o);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void showResultSet() {
String sql = "select * from cardinfo";
Connection con = new DBManageer().getConnection();
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = ps.executeQuery();
System.out.println("---依次讀取------");
while (rs.next()) {
CardInfo ca = new CardInfo();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);
}
System.out.println("---倒讀------");
while (rs.previous()) {
CardInfo ca = new CardInfo();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);
}
rs.absolute(3);// 定位倒第幾行
rs.updateString("customerName", "star");
// rs.updateRow();
rs.beforeFirst();
while (rs.next()) {
CardInfo ca = new CardInfo();
ca.setCardId(rs.getString("cardId"));
ca.setCustomerName(rs.getString("customerName"));
ca.setCurrentMoney(rs.getFloat("currentMoney"));
ca.setOpenDate(rs.getDate("openDate"));
System.out.println(ca);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}