客房信息管理系統(tǒng)概述_第1頁
客房信息管理系統(tǒng)概述_第2頁
客房信息管理系統(tǒng)概述_第3頁
客房信息管理系統(tǒng)概述_第4頁
客房信息管理系統(tǒng)概述_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、年5月29日客房信息管理系統(tǒng)概述文檔僅供參考數(shù)據(jù)庫課程實(shí)訓(xùn)報告題目: 客房信息管理系統(tǒng) 目 錄 TOC o 1-5 h z u HYPERLINK l _Toc 目 錄 PAGEREF _Toc h 2 HYPERLINK l _Toc 1 課題內(nèi)容和要求 PAGEREF _Toc h 1 HYPERLINK l _Toc 1.1課題描述 PAGEREF _Toc h 1 HYPERLINK l _Toc 1.2 課題要求 PAGEREF _Toc h 1 HYPERLINK l _Toc 2 需求分析 PAGEREF _Toc h 1 HYPERLINK l _Toc 2.1 功能需求分析

2、PAGEREF _Toc h 1 HYPERLINK l _Toc 2.2 數(shù)據(jù)需求分析 PAGEREF _Toc h 1 HYPERLINK l _Toc 3 系統(tǒng)設(shè)計 PAGEREF _Toc h 3 HYPERLINK l _Toc 3.1 功能模塊設(shè)計 PAGEREF _Toc h 3 HYPERLINK l _Toc 3.2 數(shù)據(jù)庫概念設(shè)計 PAGEREF _Toc h 3 HYPERLINK l _Toc 3.3 數(shù)據(jù)庫邏輯設(shè)計 PAGEREF _Toc h 5 HYPERLINK l _Toc 3.4 數(shù)據(jù)庫物理設(shè)計 PAGEREF _Toc h 5 HYPERLINK l _T

3、oc 3.5 數(shù)據(jù)庫表間聯(lián)系 PAGEREF _Toc h 7 HYPERLINK l _Toc 4系統(tǒng)實(shí)現(xiàn) 根據(jù)各自課題實(shí)際情況寫,寫清界面設(shè)計,包括哪些控件,各自哪些屬性,哪些事件,數(shù)據(jù)庫如何相連及操作 PAGEREF _Toc h 7 HYPERLINK l _Toc 4.1 登陸模塊實(shí)現(xiàn) PAGEREF _Toc h 7 HYPERLINK l _Toc 4.2 登記模塊實(shí)現(xiàn) PAGEREF _Toc h 7 HYPERLINK l _Toc 4.3 查詢模塊實(shí)現(xiàn) PAGEREF _Toc h 8 HYPERLINK l _Toc 5 代碼調(diào)試與功能測試 PAGEREF _Toc h

4、8 HYPERLINK l _Toc 5.1 測試方案 PAGEREF _Toc h 8 HYPERLINK l _Toc 5.2 測試結(jié)果 PAGEREF _Toc h 8 HYPERLINK l _Toc 6 收獲與體會 PAGEREF _Toc h 8 HYPERLINK l _Toc 參考文獻(xiàn) PAGEREF _Toc h 9 HYPERLINK l _Toc 附錄 PAGEREF _Toc h 10 HYPERLINK l _Toc 附錄1源程序部分清單 PAGEREF _Toc h 10 HYPERLINK l _Toc 附錄1.1登陸代碼 PAGEREF _Toc h 10 HY

5、PERLINK l _Toc 附錄1.2 查詢代碼 PAGEREF _Toc h 12 HYPERLINK l _Toc 附錄1.3 計費(fèi)代碼 PAGEREF _Toc h 13客房信息管理系統(tǒng)設(shè)計1 課題內(nèi)容和要求 1.1課題描述 隨著市場經(jīng)濟(jì)的發(fā)展,各行各業(yè)為加強(qiáng)信息管理,提高經(jīng)濟(jì)效益,都迫切地將現(xiàn)代化信息處理技術(shù)應(yīng)用到經(jīng)濟(jì)管理中。客房管理系統(tǒng)是酒店、賓館管理中必不可少的一部分,它不但對管理者在運(yùn)營過程中起到至關(guān)重要的作用,而且也能為用戶提供充分的信息和快捷的查詢手段??墒莻鹘y(tǒng)的人工操作管理存在著許多缺點(diǎn),如:效率低、保密性差,而且保存時間一長,在查找、更新、維護(hù)文件和數(shù)據(jù)時都比較困難。這

6、時就引入了客房信息管理系統(tǒng),優(yōu)點(diǎn)如下:檢索迅速、查找方便、保密性高、成本低等。酒店在正常運(yùn)營中需要對顧客信息、客房資源、結(jié)算情況進(jìn)行管理,利用客房信息管理系統(tǒng)能更好地了解信息的變更,提高了管理效率。1.2 課題要求能夠?qū)头炕拘畔⑦M(jìn)行增加、刪除、修改客房分為三種類型:三人房、雙人房、單人房,每種類型房間價位不同能夠?qū)崿F(xiàn)客戶訂房、退房、續(xù)房功能能夠登記、查詢客戶基本信息能夠查詢房間狀態(tài)信息能夠?qū)崿F(xiàn)住宿計費(fèi)2 需求分析2.1 功能需求分析 (1)作為酒店客房信息管理系統(tǒng),應(yīng)該具有增加、刪除、修改這幾個基本功能。所需錄入的表有客戶基本信息表、房間資源信息表、密碼表。(2)設(shè)計登陸后系統(tǒng)的主窗口,要

7、求能夠顯示酒店管理信息。數(shù)據(jù)的增加、刪除、修改、查詢能直接放在桌面上供用戶選擇,而且要布局合理、美觀。應(yīng)當(dāng)減少用戶的鍵盤輸入,減少用戶的工作量,提高效率。2.2 數(shù)據(jù)需求分析 圖2-1表2-1 數(shù)據(jù)項(xiàng)說明表數(shù)據(jù)項(xiàng)名稱含義說明類型長度客人編號惟一標(biāo)識一位客人bigint10房間號惟一標(biāo)識一間客房int 10入住時間標(biāo)識入住時間datetime10離開時間標(biāo)識離店時間datetime10單價標(biāo)識一間客房價格money10金額標(biāo)識總金額money10房間等級標(biāo)識房間類型smallint2 - 表2-2 數(shù)據(jù)流說明表數(shù)據(jù)流名稱含義說明來源去處組成登陸管理員進(jìn)入系統(tǒng)界面系統(tǒng)設(shè)置界面管理員端編號+密碼查詢

8、已住房查詢房間資料客人信息表統(tǒng)計界面客人信息表+客房編號表查詢空房間查詢空房間客房編號表統(tǒng)計界面客房編號表結(jié)算計算總金額系統(tǒng)設(shè)置界面管理員端系統(tǒng)設(shè)置界面登記、刪除錄入、刪除住房信息管理員端系統(tǒng)設(shè)置界面系統(tǒng)數(shù)據(jù)庫統(tǒng)計統(tǒng)計住房信息系統(tǒng)數(shù)據(jù)庫統(tǒng)計界面系統(tǒng)數(shù)據(jù)庫表2-3 數(shù)據(jù)存儲說明表數(shù)據(jù)存儲名稱含義說明組成結(jié)構(gòu)客戶信息表存放客人相關(guān)信息個人信息+入住時間+金額房間信息表存放客房的信息與狀態(tài)客房信息+客房等級管理員信息表存放管理員驗(yàn)證信息編號+密碼 3 系統(tǒng)設(shè)計3.1 功能模塊設(shè)計登陸系統(tǒng)登陸系統(tǒng)系統(tǒng)主界面系統(tǒng)主界面用戶管理旅客信息管理客房情況查詢客房信息管理經(jīng)營管理用戶管理旅客信息管理客房情況查詢客

9、房信息管理經(jīng)營管理圖3-13.2 數(shù)據(jù)庫概念設(shè)計備注 備注房間價格房間價格房間類型房間類型房間位置客房信息管理 房間位置客房信息管理 房號房號圖3-2真實(shí)姓名名真實(shí)姓名名籍貫籍貫身份證號身份證號手機(jī)號碼旅客信息管理手機(jī)號碼旅客信息管理 性別性別圖3-3客房號客房號入住編號證件號入住編號證件號姓名姓名入住時間經(jīng)營管理入住時間經(jīng)營管理狀態(tài)入住天數(shù)狀態(tài)入住天數(shù)押金押金圖3-4房間位置房間類型房號房間位置房間類型房號客房情況查詢客房情況查詢房間價格房間價格使用情況使用情況圖3-4登錄名登錄名用戶真實(shí)姓名主鍵用戶真實(shí)姓名主鍵排序碼用戶管理排序碼用戶管理登錄次數(shù)登錄次數(shù)電子郵箱電子郵箱圖3-5房間等級房間

10、號單價證件號碼性別姓名房間等級房間號單價證件號碼性別姓名入住時間年齡證件名稱入住時間年齡證件名稱最大人數(shù)房間信息客戶信息 最大人數(shù)房間信息客戶信息離開時間離開時間房間號金額房間號金額 N N管理 管理管理管理 11 管理員信息管理員信息密碼編號密碼編號圖3-63.3 數(shù)據(jù)庫邏輯設(shè)計客戶信息(客房編號,姓名,性別,年齡,證件號碼,證件名稱);房間信息(房間號,房間等級,單價,最大人數(shù),金額,離開時間,入住時間);管理員信息(編號,密碼);3.4 數(shù)據(jù)庫物理設(shè)計1客戶信息create table 客戶信息(房間號 varchar(5) not null primary key, 姓名 varcha

11、r(8) not null, 性別 char(2) not null, 年齡 char(5) not null, 證件號碼 varchar(20)not null, 證件名稱 varchar(10) not null); 圖3-62.房間信息create table 房間信息(房間號 varchar(10) not null primary key, 房間等級 varchar(10) not null, 單價 char(10) not null, 最大人數(shù) char(10) not null, 金額 char(10) not null, 入住時間 char(10) not null, 離開時間

12、 char(10) not null);圖3-73.管理員信息create table 管理員信息(編號 varchar(10) not null primary key,密碼 char(10)not null) ;圖3-83.5 數(shù)據(jù)庫表間聯(lián)系 圖3-9 數(shù)據(jù)庫表間聯(lián)系截圖4系統(tǒng)實(shí)現(xiàn) 4.1 登陸模塊實(shí)現(xiàn) Login類:登陸界面(用戶名+密碼),如果用戶名和密碼正確,則顯示成功登陸本窗體連接到數(shù)據(jù)庫中的管理員表經(jīng)過定義ResultSet來調(diào)用表中的數(shù)據(jù),相關(guān)代碼:ResultSet rs; rs=stat.executeQuery(select * from 管理人員 where 編號=+t

13、User.getText()+and密碼=+String.valueOf(password.getPassword()+);判斷成功后實(shí)現(xiàn)主窗體中子菜單的setEnable()方法。4.2 登記模塊實(shí)現(xiàn)Add類:方便管理人員添加新的客人信息,包括編號、姓名、性別、年齡、家庭地址、來自、客房名、身份證號碼、工作單位、預(yù)入住時間、入住時間、離開時間、押金本窗體主要用到T-SQL語句中的insert into. VALUES語句,相關(guān)代碼:a1=+tName.getText().trim()+;a2=+tSex.getText().trim()+;a3=+tAge.getText().trim()+

14、;a4=+tIdentication.getText().trim()+;a5=+tAddress.getText().trim()+;a6=+tWorkPlace.getText().trim()+;a7=+tFrom.getText().trim()+;a8=+tRoomNo.getText().trim()+;a9=+tWillIn.getText().trim()+;a10=+tIn.getText().trim()+;a11=+tLeave.getText().trim()+;int i = Integer.valueOf(tCash.getText().intValue();Str

15、ing b=insert into 客人信息 (客房編號,姓名,性別,年齡,身份證號碼,家庭住址,工作單位,來自地的地名,預(yù)定入住時間,入住時間,離店時間,押金) VALUES (+a8+,+a1+,+a2+,+a3+,+a4+,+a5+,+a6+,+a7+,+a9+,+a10+,+a11+,+i+);stat=conn.prepareStatement(b);r=stat.executeUpdate();4.3 查詢模塊實(shí)現(xiàn)SearchForName類:能夠需要查詢客人的信息本窗體主要用到JTable和連接客人信息表,相關(guān)代碼:stat=conn.createStatement();rs=s

16、tat.executeQuery(select 姓名,性別,工作單位,客房編號,入住時間 from 客人信息 where 姓名=+tName.getText()+);rs=stat.executeQuery(select 姓名,性別,工作單位,客房編號,入住時間 from 客人信息 where 客房編號=+tName.getText()+);5 代碼調(diào)試與功能測試5.1 測試方案系統(tǒng)測試是一個系統(tǒng)必須經(jīng)歷的過程,一個系統(tǒng)想要能滿足用戶需求,就必須經(jīng)過一套科學(xué)的、完善的測試。對于本系統(tǒng),我做了以下幾方面的測試:(1)數(shù)據(jù)合法性測試。這是對輸入的數(shù)據(jù)是否合法的一個測試。(2)數(shù)據(jù)一致性測試。在這個

17、測試的過程中,我對數(shù)據(jù)進(jìn)行了添加、刪除、修改的操作,觀察界面上顯示的數(shù)據(jù)是否與操作的內(nèi)容相一致。(3)功能模塊測試。這個測試是對各個模塊是否能正常運(yùn)行的一個測試。5.2 測試結(jié)果圖5-1圖5-2圖5-3圖5-4圖5-5圖5-6圖5-76 收獲與體會 時間過的好快,兩個星期的實(shí)訓(xùn)終于告一段落。這學(xué)期做的是數(shù)據(jù)庫實(shí)驗(yàn),老師很負(fù)責(zé)任,第一節(jié)課就把大家要做的任務(wù)分配好,而且每一步應(yīng)該做什么都很詳細(xì)地講解??墒潜M管這樣,當(dāng)我自己開始做報告的時候,看到密密麻麻的步驟,我還是有點(diǎn)慌張,怕自己完成不好。問身邊的同學(xué),大家都有自己的任務(wù),不能給予幫助,因此還是得靠自己。于是慢慢靜下心來,按照老師給的目錄一步步做

18、,不理解的,多讀幾遍要求,總能搞懂。在鍵盤上一個字一個字地打出來的感覺很踏實(shí),因?yàn)槭亲约旱某晒?。在做SQL的時候,問題倒不是很大,書上都有概念知識,不會的步驟看書上就能很快的解決。而且我發(fā)現(xiàn)平時都在學(xué)理論,可是到實(shí)踐的時候很多東西還是要自己摸索的,就像我上面要在SQL中建表,程序中已經(jīng)標(biāo)注要顯示主鍵,可是執(zhí)行后表里一直都沒有出現(xiàn)那把小鑰匙,我操作了很久,最后才發(fā)現(xiàn),只要在表上直接設(shè)置就行,繞了好大一個彎,可是心里真的很開心。在JAVA部分就有點(diǎn)頭疼了,對我來說這就是一個龐大的程序,不知道從何處下手,因此我想到了合作,找到一個和我做同樣項(xiàng)目的同學(xué),一起探討、磨合,程序最后也成型了,喜悅可想而知!

19、這次實(shí)驗(yàn)后,我深刻地意識到實(shí)踐的重要性,平時老師說的再多,書看的再多,沒動手就什么都不是。在實(shí)踐過程中會遇到困難想放棄,可是每次都堅持下來了,現(xiàn)在看看之前的兩周其實(shí)都不算什么。只要認(rèn)真踏實(shí)地一步步完成,不懂地自己摸索,有錯誤不要緊,只要不放棄,總會有解決的那天。還有讓我收獲的就是合作。當(dāng)然這是建立在互惠互利的基礎(chǔ)上的。一個人蒙頭做,很容易走進(jìn)死胡同,思維也變得狹隘,而且還會有挫敗感??墒呛献髁司筒灰粯恿?大家都把自己的觀點(diǎn)說出來,很容易就會發(fā)現(xiàn)自己之前的不足在哪里了,然后加以改進(jìn)。合作的好處還有就是思考問題會更全面,能夠說這是一件效率很高的事情,我也樂在其中!參考文獻(xiàn)1 錢雪忠,王燕玲,林挺.

20、數(shù)據(jù)庫原理及技術(shù)M.北京:清華大學(xué)出版社, .2 錢雪忠,羅海馳,陳國俊.數(shù)據(jù)庫原理及技術(shù)課程設(shè)計M.北京:清華大學(xué)出版社, .附錄附錄1源程序部分清單附錄1 源程序部分清單附錄1.1 登錄代碼package com.plat.frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Date;import java.text.ParseException;import java.text.SimpleDateFormat;import javax.swing.JBu

21、tton;import javax.swing.JDialog;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JTextField;import com.plat.db.UtilHepler;import com.plat.db.today;import com.plat.model.checkInfo;import com.plat.model.customerInfo;import com.plat.model.roomBase;import com.plat.service.chec

22、kService;import com.plat.service.customerService;import com.plat.service.roomBaseService;import com.plat.view.AppMainFrame;import com.plat.view.swing.MainPanel;public class AddCheckDialog extends JDialog private static AddCheckDialog editdialog;private JTextField j1, j2, j3, j4, j5, j6, j7, j8;priva

23、te JLabel jr1, jr2;private JButton ensure, cancel;private boolean isedit;public static AddCheckDialog instance(String text) if (editdialog != null)editdialog.dispose();editdialog = new AddCheckDialog(text);return editdialog;public AddCheckDialog(String text) super(AppMainFrame.instance(), text + 旅客,

24、 true);setLayout(null);setSize(420, 400);setLocationRelativeTo(null);editdialog = this;j1 = new JTextField();j2 = new JTextField();j3 = new JTextField();j4 = new JTextField();j5 = new JTextField();j6 = new JTextField();j7 = new JTextField();j8 = new JTextField();/ JLabel j11 = new JLabel(入住編號:);JLab

25、el j21 = new JLabel(證件號:);JLabel j31 = new JLabel(客房號:);JLabel j41 = new JLabel(入住時間:);JLabel j51 = new JLabel(入住天數(shù):);JLabel j61 = new JLabel(押金);jr1 = new JLabel(續(xù)房天數(shù):);jr2 = new JLabel(續(xù)房時間:);JLabel jlbto = new JLabel();ensure = new JButton(確定);cancel = new JButton(取消);/ j11.setBounds(60, 30, 85,

26、30);j21.setBounds(60, 60, 85, 30);j31.setBounds(60, 90, 85, 30);j41.setBounds(60, 120, 85, 30);j51.setBounds(60, 150, 85, 30);j61.setBounds(60, 180, 85, 30);jr1.setBounds(60, 210, 85, 30);jr2.setBounds(60, 240, 85, 30);/ j1.setBounds(130, 30, 190, 30);j2.setBounds(130, 60, 190, 30);j3.setBounds(130,

27、 90, 190, 30);j4.setBounds(130, 120, 190, 30);j5.setBounds(130, 150, 190, 30);j6.setBounds(130, 180, 190, 30);j7.setBounds(130, 210, 190, 30);j8.setBounds(130, 240, 190, 30);jlbto.setBounds(210, 86, 30, 40);ensure.setBounds(115, 260, 70, 40);cancel.setBounds(210, 260, 70, 40);/ add(j1);add(j2);add(j

28、3);add(j4);add(j5);add(j6);add(j7);add(j8);add(jr1);add(jr2);add(j21);add(j31);add(j41);add(j51);add(j61);add(ensure);add(cancel);if (text = 入住登記) this.isedit = false; else this.isedit = true;cancel.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) / TODO Auto

29、-generated method stubAddCheckDialog.instance().dispose(););ensure.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) if (isedit = true) / 編輯String jString = j7.getText();if (!UtilHepler.isNumeric(jString) JOptionPane.showMessageDialog(null, 天數(shù)必須是一個數(shù)字!);return;

30、if (jString.equals() JOptionPane.showMessageDialog(null, 天數(shù)不能為空!);return;/checkInfo entity = getInfo();/if (entity = null)/return;checkInfo entity=new checkInfo();entity.setCheckId(Integer.parseInt(j1.getText();entity.setContinuedDay(Integer.parseInt(jString);entity.setStatus(1);/SimpleDateFormat sd

31、f = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss );java.util.Date date = UtilHepler.StrToDate(j8.getText();entity.setContinuedTime(date);checkService service = new checkService();service.updateCont(entity);Callback(續(xù)房成功!); else checkInfo entity = getInfo();if (entity = null)return;checkService service =

32、 new checkService();customerService customerService = new customerService();/ 新增時驗(yàn)證身份證是否存在!customerInfo r = customerService.getEntityById(customerId, entity.getCustomerId() + );if (r = null) JOptionPane.showMessageDialog(null, 該身份證不存在,請先添加旅客個人基本信息!);return;roomBaseService roomBaseService = new roomB

33、aseService();roomBase roomBase = roomBaseService.getEntityByValue(roomId, entity.getRoomId() + );if (roomBase = null) JOptionPane.showMessageDialog(null, 該房間號不存在!你想去此此房間?);return;if (roomBase.getRoomStatus() = 1) JOptionPane.showMessageDialog(null, 該房間已有人住了!);return;service.insert(entity);Callback(訂

34、房間成功 ,你的房間號為: + entity.getRoomId() + 位置在: + roomBase.getPoisition(););public void open(checkInfo entity) if (entity = null) this.isedit = false;j1.setVisible(false);jr1.setVisible(false);jr2.setVisible(false);j7.setVisible(false);j8.setVisible(false);j1.setText(0 + );/ j1.setEditable(false);j4.setTe

35、xt(today.getDate() + + today.getTime();j4.setEditable(false); else System.out.println(編輯checkid: + entity.getCheckId();j1.setText(entity.getCheckId() + );/ j1.setEditable(false);j2.setText(entity.getCustomerId();j3.setText(entity.getRoomId() + );j4.setText(entity.getCheckInTime() + );j5.setText(enti

36、ty.getCheckInDay() + );j6.setText(entity.getDepositmoney() + );j2.setEditable(false);j3.setEditable(false);j4.setEditable(false);j5.setEditable(false);j6.setEditable(false);j8.setText(today.getDate() + + today.getTime();j8.setEditable(false);j7.setText(entity.getContinuedDay()+);ensure.setBounds(115

37、, 300, 70, 40);cancel.setBounds(210, 300, 70, 40);this.isedit = true;setVisible(true);private checkInfo getInfo() if (j2.getText().equals() | j3.getText().equals() | j4.getText().equals() | j5.getText().equals()| j6.getText().equals() JOptionPane.showMessageDialog(null, 你還有一些數(shù)據(jù)沒有填!);return null;if (

38、!UtilHepler.isNumeric(j5.getText() JOptionPane.showMessageDialog(null, 入住天數(shù)必須是數(shù)字!);return null;if (!UtilHepler.isNumeric(j6.getText() JOptionPane.showMessageDialog(null, 押金必須是數(shù)字!);return null;String customerId, roomId;int checkId = Integer.parseInt(j1.getText();customerId = j2.getText();roomId = j3.

39、getText();System.out.println(j4.getText();SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss );java.util.Date date = UtilHepler.StrToDate(j4.getText();System.out.println(date.getTime();int checkInDay = Integer.parseInt(j5.getText();double depositmoney = Double.parseDouble(j6.getText();r

40、eturn new checkInfo(checkId, customerId, roomId, date, checkInDay, depositmoney);private void Callback(String text) AddCheckDialog.instance().dispose();MainPanel.instance().refresh();JOptionPane.showMessageDialog(null, text);附錄1.2 查詢代碼 package com.plat.db;import java.lang.reflect.InvocationTargetExc

41、eption;import java.lang.reflect.Method;import java.lang.reflect.Type;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.sql.Types;import java.util.ArrayList;import

42、 java.util.HashMap;import java.util.List;import java.util.Map;import com.plat.model.sysUser;/* * 注意利用查詢出數(shù)據(jù)庫的一條記錄映射到相應(yīng)的dao中,寫相應(yīng)的dao一定要注意字段,一定 * 要與數(shù)據(jù)庫的記錄字段相對應(yīng),大小寫能夠忽略,可是字段不一致就返回錯誤的數(shù)據(jù) * * private static Object getValueFromRs(ResultSet rs, String fieldName, Type t) throws SQLException * 此接口有個小的問題就是如果,獲取

43、的字段值是空值或者為null,而你自己的需求就是想要獲取的字段為一個 * 默認(rèn)的值,那就只需要客戶該寫這個方法,進(jìn)行判斷就能夠 * author Administrator * */public class DBUtil /* * 對操作的數(shù)據(jù)庫回滾 * param con 對數(shù)據(jù)庫操作所得到的鏈接 */public static void rollBack(Connection con)try con.rollback(); catch (SQLException e) e.printStackTrace();/* * * param con 數(shù)據(jù)庫jdbc鏈接 * param sql 執(zhí)行

44、的sql語句 * return 返回查詢的記錄數(shù),記錄存儲在集合List里面, * 里面的元素是集合Map,key是數(shù)據(jù)庫中的字段類型,value是 * 字段類型對應(yīng)的值 * throws SQLException */public static ListMap executeQuery(Connection con, String sql) throws SQLExceptionPreparedStatement pst = null;ResultSet rs = null;try pst = con.prepareStatement(sql);rs = pst.executeQuery()

45、;return getListFromRs(rs);finallycloseRs(rs);closePst(pst);/* * 執(zhí)行sql語句,把結(jié)果集存放到List集合里,集合的元素是dao對象 * param con 數(shù)據(jù)庫得到的鏈接 * param sql 執(zhí)行查詢的sql語句 * param c 把一條條記錄要映射的dao類中的對象中去 * return * throws SQLException */public static List executeQuery(Connection con, String sql, Class c) throws SQLExceptionPrepa

46、redStatement pst = null;ResultSet rs = null;try pst = con.prepareStatement(sql);rs = pst.executeQuery();return getListFromRs(rs, c);finallycloseRs(rs);closePst(pst);/* * 得到結(jié)果集存儲到list中 * param rs 查詢的結(jié)果集 * return * throws SQLException */public static ListMap getListFromRs(ResultSet rs) throws SQLExcep

47、tionResultSetMetaData md = rs.getMetaData();/得到結(jié)果集列的屬性int columns = md.getColumnCount();/得到記錄有多少列int i;ListMap list = new ArrayListMap();while(rs.next()Map map = new HashMap();for(i = 0; i columns; i+)map.put(md.getColumnName(i + 1), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1

48、);list.add(map);return list;/* * * param rs 查詢的結(jié)果集 * param c 集合元素存放的dao對象 * return * throws SQLException */public static List getListFromRs(ResultSet rs, Class c) throws SQLExceptionList list = new ArrayList();try while(rs.next()Object o = initObjectFromRsIfExist(rs, c);list.add(o); catch (IllegalAc

49、cessException e) e.printStackTrace(); catch (InstantiationException e) e.printStackTrace();return list;/* * * param rs 查詢的結(jié)果集 * param c 結(jié)果集一條記錄,而一條記錄所對應(yīng)的dao類 * return * throws SQLException */public static Object getFirstObjectFromRs(ResultSet rs, Class c) throws SQLExceptionObject o = null;try o = i

50、nitObjectFromRsIfExist(rs, c); catch (InstantiationException e) e.printStackTrace(); catch (IllegalAccessException e) e.printStackTrace();return o;/* * * param rs 查詢出來的結(jié)果集 * param type SQL type from java.sql.Types * param name 數(shù)據(jù)庫記錄所對應(yīng)的字段名稱 * return 返回一條記錄的一個列值 * throws SQLException */private static

51、 Object getValueByType(ResultSet rs, int type, String name) throws SQLExceptionswitch(type)case Types.NUMERIC:return rs.getLong(name);case Types.VARCHAR:if(rs.getString(name)=null)return ;return rs.getString(name);case Types.DATE:if(rs.getDate(name)=null)return System.currentTimeMillis();return rs.g

52、etDate(name);case Types.TIMESTAMP:if(rs.getTimestamp(name)=null)return System.currentTimeMillis();return rs.getTimestamp(name).toString().substring(0,rs.getTimestamp(name).toString().length()-2);case Types.INTEGER:return rs.getInt(name);case Types.DOUBLE:return rs.getDouble(name);case Types.FLOAT:re

53、turn rs.getFloat(name);case Types.BIGINT:return rs.getLong(name);default:return rs.getObject(name);/* * 查詢dao映射的字段是否在記錄在數(shù)據(jù)庫包含的字段 * param rs 查詢的記錄集 * param fieldName dao映射的字段 * return 如果包含在數(shù)據(jù)庫記錄集里面,返回true,否則false * throws SQLException */private static boolean rsContainsFields(ResultSet rs, String fie

54、ldName) throws SQLExceptionResultSetMetaData md = rs.getMetaData();for(int i = 0; i md.getColumnCount(); i+)if(md.getColumnName(i + 1).equalsIgnoreCase(fieldName)return true;return false;/* * 這個函數(shù)與initObjectFromRsIfExist函數(shù)實(shí)現(xiàn)的功能是一樣,只是 * 沒有判斷dao中的字段是否與數(shù)據(jù)庫記錄所定義的字段是一樣的, * 沒有判斷時如果自己設(shè)置的dao字段與數(shù)據(jù)庫的字段不一致就會報異

55、常 * param rs * param c * return * throws InstantiationException * throws SQLException * throws IllegalAccessException */private static Object initObjectFromRs(ResultSet rs, Class c) throws InstantiationException, SQLException, IllegalAccessExceptionObject o = c.newInstance();Method methods = o.getCl

56、ass().getMethods();for(Method m: methods)if(m.getName().startsWith(set)try m.invoke(o, getParamValueFromRs(rs, m); catch (IllegalArgumentException e) throw new RuntimeException(IllegalArgumentException: + e + nMethods: + m.getName(); catch (InvocationTargetException e) throw new RuntimeException(Inv

57、ocationTargetException: + e + nMethods: + m.getName();return o;/* * * 把數(shù)據(jù)庫的一條記錄映射到相應(yīng)的dao對象中, * 如果dao中的字段與數(shù)據(jù)庫字段不一致,返回的就是dao數(shù)據(jù)類型定義的默認(rèn)值 * 如:dao的字段long vehicleID;而數(shù)據(jù)庫的字段是vehicle_id,那么返回的 * 就定義的默認(rèn)值0. * param rs 查詢的結(jié)果集 * param c 結(jié)果集一條記錄,而一條記錄所對應(yīng)的dao類 * return * throws SQLException * throws IllegalAccessEx

58、ception * throws InstantiationException */private static Object initObjectFromRsIfExist(ResultSet rs, Class c) throws SQLException, IllegalAccessException, InstantiationExceptionObject o = c.newInstance();/一條記錄的dao,新建對象Method methods = o.getClass().getMethods();/dao對象所有的方法String field;for(Method m:

59、methods)/得到dao字段,如getRegdate,轉(zhuǎn)換成Regdatefield = m.getName().substring(3);/查詢dao映射的字段是否在記錄在數(shù)據(jù)庫包含的字段,dao方法對set開頭的方法進(jìn)行處理/因?yàn)橐獙⒔Y(jié)果集映射到dao里面if(m.getName().startsWith(set) & rsContainsFields(rs, field)try m.invoke(o, getParamValueFromRs(rs, m); catch (IllegalArgumentException e) throw new RuntimeException(Il

60、legalArgumentException: + e + nMethods: + m.getName(); catch (InvocationTargetException e) throw new RuntimeException(InvocationTargetException: + e + nMethods: + m.getName();return o;/* * * param rs 查詢的結(jié)果集 * param m dao映射字段對應(yīng)的一個set方法 * return * throws SQLException */private static Object getParamVa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論