版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1需求分析1.1課題設(shè)計(jì)目的使用面向?qū)ο笳Z言java設(shè)計(jì)一個(gè)員工工資管理程序,有顯示、儲(chǔ)存、顯示、修改和刪除功能。每個(gè)員工有員工工號(hào)、姓名、基礎(chǔ)工資、職務(wù)工資、獎(jiǎng)金和工資總額。其中員工工號(hào)不需要用戶輸入,存儲(chǔ)時(shí),數(shù)據(jù)庫系統(tǒng)按順序自動(dòng)遞增。1.2功能要求(1)查詢功能中,用戶查詢時(shí)可以選擇按工號(hào)查詢,也可以選擇姓名進(jìn)行查詢,也可以選擇查詢工資總額在某個(gè)范圍內(nèi)的員工的工資信息,比如查詢工資總額在1000~2000的全體員工的信息,還以查詢?nèi)w員工工資,并且選擇按某種方式排序。(2)修改功能中,用戶可以選擇修改方式,比如修改某一行,即選擇修改某個(gè)員工的工資,此時(shí)需要輸入修改項(xiàng),即基礎(chǔ)工資、職務(wù)工資和獎(jiǎng)金中的一項(xiàng),因?yàn)楣べY總額是基礎(chǔ)工資、職務(wù)工資和獎(jiǎng)金的綜合,故不能直接修改,同時(shí)還需要輸入工號(hào),為了避免誤改,所以需要確認(rèn)修改后才能修改;也可以選擇修改某一列,即選擇修改全體員工的某一項(xiàng)工資,所以還需要選擇修改項(xiàng),其中的修改項(xiàng)也只有基礎(chǔ)工資、職務(wù)工資和獎(jiǎng)金三項(xiàng)。(3)儲(chǔ)存功能即增加用戶的功能中,用戶不需要輸入員工工號(hào),但必須輸入員工姓名,其他幾項(xiàng)均可以不輸入,基礎(chǔ)工資、職務(wù)工資、獎(jiǎng)金和工資總額均被系統(tǒng)初始化為零。(4)刪除功能中,必須慎重操作,刪除時(shí)必須輸入員工工號(hào),先查詢出來,把員工的各項(xiàng)信息顯示在下方的文本框中,在用戶點(diǎn)擊確認(rèn)刪除時(shí)系統(tǒng)就將該工號(hào)的用戶的各項(xiàng)信息從數(shù)據(jù)庫中刪除。在此說明一點(diǎn),由于工資總額是員工基礎(chǔ)工資、職務(wù)工資和獎(jiǎng)金的綜合?;A(chǔ)工資、職務(wù)工資和獎(jiǎng)金中的任意一項(xiàng)改變都會(huì)影響工資總額的數(shù)值,當(dāng)修改頻繁是,將會(huì)大大增加數(shù)據(jù)庫系統(tǒng)的負(fù)擔(dān),且設(shè)計(jì)起來更加繁瑣,所以工資總額并沒有真正的儲(chǔ)存在數(shù)據(jù)庫中,每一次的查詢或者其他顯示工資總額的地方全都是用SQL或者HQL的函數(shù)查詢語句來實(shí)現(xiàn)的。1.3設(shè)計(jì)流程設(shè)計(jì)流程采用先界面后模型外層全局界面設(shè)計(jì)界面設(shè)計(jì):外層全局界面設(shè)計(jì)界面設(shè)計(jì):刪除模塊各組件事件處理修改模塊各組建事件處理儲(chǔ)存模塊各組件事件處理查詢模塊各組件事件處理擅長模塊設(shè)計(jì)修改模塊設(shè)計(jì)查詢模塊設(shè)計(jì)儲(chǔ)存模塊設(shè)計(jì)刪除模塊各組件事件處理修改模塊各組建事件處理儲(chǔ)存模塊各組件事件處理查詢模塊各組件事件處理擅長模塊設(shè)計(jì)修改模塊設(shè)計(jì)查詢模塊設(shè)計(jì)儲(chǔ)存模塊設(shè)計(jì)各組件事件處理功能實(shí)現(xiàn)設(shè)計(jì):各組件事件處理功能實(shí)現(xiàn)設(shè)計(jì):外層全局界面各組件事件處理設(shè)計(jì)外層全局界面各組件事件處理設(shè)計(jì)數(shù)據(jù)庫及表的設(shè)計(jì)數(shù)據(jù)庫及表的設(shè)計(jì) Hibernate實(shí)現(xiàn)查詢功能HHibernate實(shí)現(xiàn)查詢功能Hibernate實(shí)現(xiàn)儲(chǔ)存功能Hibernat和jdbc實(shí)現(xiàn)修改功能Hibernate刪除功能圖11.4工資表模式根據(jù)上述目的和各項(xiàng)功能要求,選擇如表1的數(shù)據(jù)庫表來儲(chǔ)存員工各項(xiàng)工資信息其中的Id號(hào)即為員工工號(hào)。表1ID姓名基礎(chǔ)工資職務(wù)工資獎(jiǎng)金3張三500020003000…………1.5開發(fā)環(huán)境JDK1.6Myeclipse6.5Mysql5.22Hibernateannotation3.4測(cè)試工具:junit4.7注明:(1)在詳細(xì)設(shè)計(jì)中的代碼均為局部的關(guān)鍵代碼,完整代碼均在附錄里;(2)數(shù)據(jù)庫里的信息只為了測(cè)試,與其含義沒有關(guān)系;(3)所有模塊的模樣圖中,圓角框表示容器,直角框表示組件。2詳細(xì)設(shè)計(jì)2.1外層模塊設(shè)計(jì)2.1.1外層模塊模樣根據(jù)個(gè)人設(shè)計(jì)思路,設(shè)計(jì)的外側(cè)模塊的模樣如圖2外層模塊外層模塊Myplet系統(tǒng)名稱:工資管理系統(tǒng)子容器Panel3子容器系統(tǒng)名稱:工資管理系統(tǒng)子容器Panel3子容器Panel2子容器Panel1刪除按鈕修改按鈕儲(chǔ)存按鈕查詢按鈕刪除按鈕修改按鈕儲(chǔ)存按鈕查詢按鈕以卡片布局放置查詢、儲(chǔ)存、修改、刪除模塊,默認(rèn)顯示查詢模塊以卡片布局放置查詢、儲(chǔ)存、修改、刪除模塊,默認(rèn)顯示查詢模塊圖2外側(cè)模塊設(shè)計(jì),首先新建一個(gè)叫MyApplet的類,并繼承java下applet包中的Applet類,在這里,也可以自己定義一個(gè)自己的框架的類,去繼承Frame類,但是簡單起見,我就定義了自己的框架的類,并繼承了Applet類,這樣有些Applet已經(jīng)實(shí)現(xiàn)的功能就不需要我自己去實(shí)現(xiàn)了,比如當(dāng)你點(diǎn)擊這個(gè)類運(yùn)行而得的窗口的右上角的“X”時(shí),窗口就關(guān)閉了,如果沒有繼承Applet類,那么這些功能將由自己實(shí)現(xiàn),查看java的那套api會(huì)發(fā)現(xiàn)里面有個(gè)一屬性常量,給定義的窗口設(shè)置該屬性就可以解決。參考印旻主編的《java與面向?qū)ο蟪绦蛟O(shè)計(jì)教程》第八章的布局設(shè)計(jì)可知:FlowLayout的布局方式雖然非常簡單,但是這種布局的容器會(huì)將容器的里的組件按照加入的順序一個(gè)個(gè)從左往右,從上往下的排列。這樣的布局顯然不合適,也不美觀。而BorderLayout則將整個(gè)容器分為東、西、南、北、中,這樣的布局比較死,限制了設(shè)計(jì)者自己定義布局的功能。GridLayout的布局形式,雖然給了設(shè)計(jì)者自己定義布局的一部分功能,但是還是存在很大一部分的限制,還有CardLayout(卡片布局設(shè)計(jì))和GridBagLayout,卡片布局設(shè)計(jì)顯然是可以采用的,但是不能只用卡片布局設(shè)計(jì),因?yàn)橹挥盟@得單一,而且功能不全。剩下的GridBagLayout的布局設(shè)計(jì)是很適合我想象的布局的,因?yàn)檫@種布局設(shè)計(jì)給了設(shè)計(jì)者很大的自定義空間,并且各個(gè)行或者列的大小都可以由設(shè)計(jì)者自己指定,也不要求容器中的組件按個(gè)空格地放。經(jīng)過上述外層模塊布局設(shè)計(jì)的分析,最適合外層模塊布局設(shè)計(jì)的方式就是GridBagLayout。GridBagLayout布局設(shè)計(jì)方式的使用步驟如下:創(chuàng)建GridBagLayout的對(duì)象;將容器的布局設(shè)置成這個(gè)對(duì)象;創(chuàng)建GridBagConstraints對(duì)象,并指定其各項(xiàng)屬性;設(shè)置GridBagConstraints對(duì)象和組件的關(guān)聯(lián);將組件加入容器中。為了使窗口中的標(biāo)簽和文本框等東西的大小可以隨窗口的變大而變大,或者縮小而縮小,所以在外層容器里面的組件不是直接加入外層容器的,本質(zhì)是在外層容器中加入子容器,然后在子容器中加入組件。外層容器的對(duì)子容器放置的布局是GridBagLayout布局設(shè)計(jì),而子容器中又使用簡單布局設(shè)計(jì)。所以整體上是使用混合布局設(shè)計(jì),這樣可以實(shí)現(xiàn)更多的界面設(shè)計(jì)樣式。2.1.2外層模塊代碼解析(1)MyApplet類繼承Applet,所以本身就是一個(gè)容器,不需要自己再去創(chuàng)建外層容器了,就把this(本容器)當(dāng)成外層容器就可以了。對(duì)本容器采用GridBagLayout的布局設(shè)計(jì),按照上述的步驟:創(chuàng)建GridBagLayout布局對(duì)象,即GridBagLayoutgbLayout=newGridBagLayout();設(shè)置本容器為該布局對(duì)象,即this.setLayout(gbLayout);(2)創(chuàng)建一個(gè)大小為3的Panel數(shù)組p,并實(shí)例化三個(gè)Panel。(3)創(chuàng)建一個(gè)顯示系統(tǒng)名稱的Label類型的tittle,設(shè)置其中字體的大小和顏色,并將Label加入到Panel[0]中的語句分別是:Labeltittle=newLabel("工資管理系統(tǒng)");tittle.setFont(newFont("Serif",50,50));tittle.setBackground(Color.GREEN);p[0].add(tittle);并且對(duì)Panel[0]采用Gridlayout的布局設(shè)計(jì),由于只需添加標(biāo)題這樣一個(gè)組件就可以了,所以設(shè)置為一行一列:p[0]=newPanel(newGridLayout(1,1))。并用GridBagLayout的布局設(shè)計(jì)將Panel1加入到容器MyApplet中,具體實(shí)現(xiàn)代碼如下:gbc.gridwidth=GridBagConstraints.BOTH;//占據(jù)橫向剩余空間gbc.weightx=1;//橫向可擴(kuò)展gbc.gridwidth=GridBagConstraints.REMAINDER;gbLayout.setConstraints(p[0],gbc);//將gridbagconstraints對(duì)象與組建相聯(lián)系 add(p[0]);(4)用GridLayout的布局設(shè)計(jì)分別將查詢按鈕、儲(chǔ)存按鈕、修改按鈕和刪除按鈕加入Panel[1]中,然后用GridBagLayout的布局設(shè)計(jì)將Panel[1]加入MyApplet中。具體過程是定義各一個(gè)四個(gè)元素的Button類型的數(shù)組,并實(shí)例化其中每個(gè)元素。參數(shù)分別為“查詢”、“儲(chǔ)存”、“修改”和“刪除”。并依次將該數(shù)組的每個(gè)按鈕加入到Panel[1]中。其實(shí)現(xiàn)代碼如下: Button[]b=newButton[4];b[0]=newButton("查詢");b[0].addActionListener(this);//注冊(cè)監(jiān)聽b[1]=newButton("儲(chǔ)存");b[1].addActionListener(this);b[2]=newButton("修改");b[2].addActionListener(this);b[3]=newButton("刪除");b[3].addActionListener(this); p[1]=newPanel(newGridLayout(1,4));for(inti=0;i<4;i++){p[1].add(b[i]);p[1].add(newLabel(""));//將按鈕分開 }gbc.insets=newInsets(20,4,4,4);gbLayout.setConstraints(p[1],gbc); add(p[1]);(5)初始化的Panel數(shù)組的第三個(gè)元素p[3]采用卡片的布局設(shè)計(jì),卡片設(shè)計(jì)的顯示形式是讓要顯示的東西像撲克一樣疊起來,每次都只能顯示最表面的一張,其他的都在下方,不顯示。目的是使得查詢模塊、儲(chǔ)存模塊、修改模塊和刪除模塊以卡片的形式顯示在四個(gè)選擇功能的按鈕下方。讓頁面看起來簡潔、清晰、明朗。CardLayout的使用步驟:創(chuàng)建一個(gè)CardLayout對(duì)象作為布局編輯器:Mycard=newCardLayout();將容器p[3]設(shè)置為Mycard的布局:p[3].setLayout(Mycard);將p[3]加入MyApplet中;設(shè)置中各組件的顯示方式。本設(shè)計(jì)中,p[3]中各組件的顯示方式只有設(shè)置為按名顯示最為適合,窗口的顯示如圖3,創(chuàng)建到顯示的實(shí)現(xiàn)代碼如下: QueryPanelqp=newQueryPanel();//查詢模塊 addPanelap=newaddPanel();//增加用戶模塊 updatePanelup=newupdatePanel();//修改模塊 deletePaneldp=newdeletePanel();//刪除模塊p[2]=newPanel(myCard);p[2].setLayout(myCard);p[2].add(qp,"查詢");p[2].add(ap,"儲(chǔ)存");p[2].add(up,"修改");p[2].add(dp,"刪除");gbc.insets=newInsets(20,4,4,4);gbLayout.setConstraints(p[2],gbc); add(p[2]);//事件處理:當(dāng)用戶點(diǎn)擊四大功能按鈕時(shí),下方顯示對(duì)應(yīng)的功能的子模塊publicvoidactionPerformed(ActionEvente){myCard.show(p[2],e.getActionCommand()); }圖32.1.3外層模塊事件處理(1)分別將查詢按鈕、儲(chǔ)存按鈕、修改按鈕和刪除按鈕注冊(cè)給監(jiān)聽器,并在類頭的繼承類后面加上implementsActionListener實(shí)現(xiàn)接口ActionListener之后,重寫接口里定義的抽象方法publicvoidactionPerformed(ActionEvente);在該方法里設(shè)計(jì)按名顯示功能模塊的程序,即publicvoidactionPerformed(ActionEvente){myCard.show(p[2],e.getActionCommand()); }2.2查詢模塊設(shè)計(jì)2.2.1查詢模塊模樣查詢模塊的模樣如圖4所示。查詢模塊的設(shè)計(jì)查詢模塊的設(shè)計(jì)查詢按鈕排序方式排列依據(jù)查詢范圍查詢方式Panelselect查詢按鈕排序方式排列依據(jù)查詢范圍查詢方式Panelselect:Panelid:PanelnamePanelid:Panelname:顯示查詢結(jié)果:按工號(hào)查詢輸入框標(biāo)簽(輸入按工號(hào)查詢輸入框標(biāo)簽(輸入ID)按姓名查詢輸入框標(biāo)簽(輸入姓名)按姓名查詢輸入框標(biāo)簽(輸入姓名)顯示結(jié)果的文本框顯示結(jié)果的文本框圖4查詢模塊的設(shè)計(jì),新建一個(gè)叫QueryPanel的java類,這各類也繼承了Applet類,所以本身就是一個(gè)容器。并對(duì)本容器設(shè)置GridBagLayout的布局設(shè)計(jì),從上往下,加入三個(gè)子容器。第一個(gè)叫select,用來裝載查詢方式下拉框、查詢范圍下拉框、排列下拉框、排序下拉框和查詢按鈕;第二個(gè)容器id,作用是當(dāng)用用戶在select容器中的查詢方式選擇為“按工號(hào)查詢”時(shí),光標(biāo)跳轉(zhuǎn)到id容器的id輸入框,之后,當(dāng)用戶點(diǎn)擊“按工號(hào)查詢”按鈕時(shí),結(jié)果顯示文本框中顯示用戶輸入的id號(hào)即工號(hào)的員工的工資信息;第二個(gè)容器叫name,作用是當(dāng)用戶點(diǎn)擊按姓名查詢的時(shí)候,光標(biāo)跳轉(zhuǎn)到提示輸入姓名的標(biāo)簽的后面的輸入框中,同第二個(gè)一樣,當(dāng)用戶點(diǎn)擊“按姓名查詢”按鈕后,所輸入姓名的員工的工作信息會(huì)顯示在下方的文本里;最下方的就用文本框了,作用上述已經(jīng)說明了。缺省情況下,即用戶什么都沒有選擇的情況下,直接點(diǎn)擊“查詢”按鈕后,將顯示全體員工的工資信息。查詢方式下拉框中有按工號(hào)、按姓名和默認(rèn)全部的選項(xiàng);查詢范圍的下拉框中有各個(gè)階段范圍的對(duì)應(yīng)選擇,默認(rèn)是范圍不限;排列下拉框中有按基礎(chǔ)工資、職務(wù)工資、獎(jiǎng)金、工資總額和默認(rèn)是工號(hào)的選項(xiàng);排序下拉框中就升序和降序兩種選擇,默認(rèn)是升序排序。這些下拉框的中的每一個(gè)選項(xiàng)都是任由用戶選擇的,但是選擇的項(xiàng)不能相互矛盾,比如選擇了按工號(hào)查詢,就不能在輸入姓名的輸入框中輸入信息。這些跳轉(zhuǎn)控制,在事件處理中有詳細(xì)的設(shè)計(jì)。布局設(shè)計(jì)的代碼和外層模塊設(shè)計(jì)的完全一樣,不再重復(fù),代碼中有注明,下拉框是用一個(gè)Choice類型的數(shù)組來表示的,窗口顯示如圖5。實(shí)現(xiàn)下拉框的代碼如下: Choicec[]=newChoice[5];//下拉框數(shù)組for(inti=0;i<4;i++) {c[i]=newChoice();c[i].addItemListener(this);select.add(c[i]); }c[0].add("查詢方式");c[0].add("按工號(hào)");c[0].add("按姓名");c[0].add("默認(rèn)是全部");c[1].add("查詢范圍");c[1].add("0-2000");c[1].add("2000-5000");c[1].add("5000-8000");c[1].add("800-10000");c[1].add("10000-20000");c[1].add(">20000");c[1].add("默認(rèn)全部");c[2].add("排列");c[2].add("按工資總額");c[2].add("按基礎(chǔ)工資");c[2].add("按職務(wù)工資");c[2].add("按獎(jiǎng)金");c[2].add("默認(rèn)按工號(hào)");c[3].add("排序");c[3].add("升序");c[3].add("降序");c[3].add("默認(rèn)升序");圖52.2.2查詢模塊事件處理該模塊中共有四個(gè)下拉框,一個(gè)工號(hào)輸入框,一個(gè)姓名輸入文本框和一個(gè)現(xiàn)實(shí)文本框,第一個(gè)個(gè)查詢方式下拉框。(1)當(dāng)用戶選擇的是查詢方式或者默認(rèn)全部時(shí),系統(tǒng)將查詢的對(duì)象定位整個(gè)員工工作表;第二個(gè)是供用戶可以選擇查詢的范圍的下拉框,這里的范圍是指工資總額在所在的范圍,比如用戶選擇8000~10000則表示用戶選擇了工資總額在8000~10000的員工,上下限選擇均包括端點(diǎn)值;第三個(gè)是排列下拉框,表示用戶選擇按什么什么數(shù)值排列,結(jié)合第四個(gè)排序下拉框的意思就是用戶選擇按什么的數(shù)值以什么的順序排列;這四個(gè)下拉框均有默認(rèn)值,用戶不顯示的做任何選擇,當(dāng)用戶直接點(diǎn)擊查詢按鈕時(shí),系統(tǒng)將查詢?nèi)繂T工則工資信息,按工號(hào)的升序排列打印在顯示文本框。(2)當(dāng)用在查詢方式下拉框中選擇按工號(hào)查詢時(shí),系統(tǒng)自動(dòng)跳轉(zhuǎn)到工號(hào)輸入框,提示用戶輸入員工工號(hào),然后點(diǎn)擊按工號(hào)查詢按鈕,系統(tǒng)查詢用戶所輸入的工號(hào)的工資信息,并打印到顯示文本框。關(guān)鍵代碼如下:if(c[0].getSelectedIndex()==0||c[0].getSelectedIndex()==3)//選擇查詢方式c[1].requestFocus();elseif(c[0].getSelectedIndex()==1){inputId.requestFocus();inputId.setText("轉(zhuǎn)到這里");inputName.setText(""); }(3)當(dāng)用戶在查詢方式下拉框中選擇按姓名查詢時(shí),系統(tǒng)將自動(dòng)跳轉(zhuǎn)到姓名輸入框,提示用戶輸入姓名。elseif(c[0].getSelectedIndex()==2){inputName.requestFocus();inputName.setText("轉(zhuǎn)到這里");inputId.setText(""); }2.3儲(chǔ)存模塊設(shè)計(jì)2.3.1儲(chǔ)存模塊模樣儲(chǔ)存模塊的模樣如圖6所示。儲(chǔ)存模塊的設(shè)計(jì)姓名基礎(chǔ)工資職務(wù)工資輸入信息獎(jiǎng)金文本框,用來顯示剛才增加的用戶的信息對(duì)應(yīng)的輸入框:提示性標(biāo)簽:儲(chǔ)存模塊的設(shè)計(jì)姓名基礎(chǔ)工資職務(wù)工資輸入信息獎(jiǎng)金文本框,用來顯示剛才增加的用戶的信息對(duì)應(yīng)的輸入框:提示性標(biāo)簽:按鈕按鈕按鈕按鈕圖6儲(chǔ)存模塊的設(shè)計(jì),新建一個(gè)叫AddPanel的java類,繼承了Applet類,采用的布局設(shè)計(jì)和查詢模塊的完全一樣,不再贅述。在儲(chǔ)存子容器中添加去的是三個(gè)Panel。第一個(gè)是用來顯示提示性標(biāo)簽的,即顯示姓名、基礎(chǔ)工資、職務(wù)工資、獎(jiǎng)金、輸入對(duì)應(yīng)信息,其作用是提示用戶根據(jù)提示,在對(duì)應(yīng)的輸入框中輸入合法的信息;第二個(gè)Panel就是在第一個(gè)提示標(biāo)簽的下方添加相對(duì)應(yīng)的輸入框,以便用戶對(duì)應(yīng)輸入信息,這個(gè)Panel的右端添加了兩個(gè)按鈕,前一個(gè)是“增加員工”,是往數(shù)據(jù)庫存數(shù)據(jù)的事件源,第二個(gè)按鈕是“清空”,用來清空全部輸入框中殘留的信息;第三個(gè)就是一個(gè)文本框,作用就是顯示新增員工的信息。其中的提示性標(biāo)簽是用Label數(shù)組來實(shí)現(xiàn)的,并且在中間加入了空的標(biāo)簽,目的是是標(biāo)簽分開,不至于排列太緊密,影響美觀,窗口顯示如圖7。實(shí)現(xiàn)代碼如下:L[0]=newLabel("姓名");L[1]=newLabel("基礎(chǔ)工資");L[2]=newLabel("職務(wù)工資");L[3]=newLabel("獎(jiǎng)金");L[4]=newLabel("輸入對(duì)應(yīng)信息");for(inti=0;i<4;i++) {t[i]=newTextField();tPanel.add(t[i]);LPanel.add(L[i]); }tPanel.add(add);tPanel.add(re);tPanel.add(newLabel(""));LPanel.add(L[4]);LPanel.add(newLabel(""));LPanel.add(newLabel(""));2.3.2儲(chǔ)存模事件處理本模塊共有四個(gè)輸入文本框,一個(gè)增加員工按鈕,一個(gè)清空按鈕和一個(gè)顯示文本框。當(dāng)用用戶點(diǎn)擊增加員工按鈕時(shí),系統(tǒng)將讀取四個(gè)輸入文本框中的內(nèi)容,在姓名不為空,三項(xiàng)金額為整數(shù)的情況下,系統(tǒng)將員工信息存入數(shù)據(jù)庫,并在下方的顯示文本框中打印剛增加的員工的工號(hào)、姓名和工資信息。當(dāng)用戶點(diǎn)擊清空按鈕時(shí),系統(tǒng)將四個(gè)輸入文本框中的殘留信息全部清空。其中的flag不只是在這兩個(gè)地方處理,在討論異常的時(shí)候會(huì)詳細(xì)介紹。操作實(shí)例如圖7所示。這段內(nèi)容的關(guān)鍵代碼如下:booleanflag;if(e.getSource()==re)for(inti=0;i<4;i++)t[i].setText("");if(e.getSource()==add)//插入數(shù)據(jù) { flag=true;if(t[0].getText().equals("")){ flag=false;result.setText("增加用戶失?。罕仨気斎胗脩裘?"); }elsename=t[0].getText();if(flag){ HibernateOperateq=newHibernateOperate(); q.testsave(name,basicWage,postWage,bonus); }圖72.4修改模塊設(shè)計(jì)修改模塊模樣修改模塊如圖8所示。修改模塊設(shè)計(jì):修改按鈕輸入框輸入新值輸入框輸入工號(hào)修改項(xiàng)修改方式修改模塊設(shè)計(jì):修改按鈕輸入框輸入新值輸入框輸入工號(hào)修改項(xiàng)修改方式圖8修改模塊的設(shè)計(jì),新建一個(gè)叫UpdatePanel的java類,布局設(shè)計(jì)同上。修改子容器比較簡單,里面就裝有個(gè)一子容器select,容器select中添加了下拉框“修改方式”、下拉框“修改項(xiàng)”、標(biāo)簽“輸入新值”、工號(hào)輸入框、標(biāo)簽“輸入新值”、新值輸入框、修改按鈕。修改方式中有修改行和修改列兩個(gè)選項(xiàng);改項(xiàng)中可以選擇的只有基礎(chǔ)工資、職務(wù)工資和獎(jiǎng)金;由于是修改,所以每項(xiàng)都必須輸入或者選擇,否則不執(zhí)行操作。該模塊中各部分的實(shí)現(xiàn)代碼前面均有提到過,不再贅述,窗口顯示如圖9所示。圖92.4.2修改模塊事件處理當(dāng)用戶點(diǎn)擊主模塊中的修改按鈕時(shí),下方將顯示修改模塊的界面。修改界面中結(jié)構(gòu)比較簡單,兩個(gè)下拉框和兩個(gè)輸入文本框,兩個(gè)下拉框分別是修改方式的選擇和修改項(xiàng)的選擇。(1)修改方式中有修改行和修改列兩種選擇,修改行是修改一行,然后選擇修改項(xiàng),這種情況必須輸入工號(hào),新值在不輸入的情況下將以0為缺省型,但是不推薦。(2)當(dāng)用戶選擇的修改方式為修改列時(shí),不需要輸入工號(hào),此時(shí),工號(hào)輸入框不能進(jìn)行輸入,只要為輸入框設(shè)置屬性setFocusable(false);即可;當(dāng)用戶選擇修改行時(shí)重置過來即setFocusable(true);即可。(3)做完(1),(2)的選擇后,用戶點(diǎn)擊修改按鈕時(shí),系統(tǒng)將彈出確認(rèn)修改的對(duì)話框,讓用戶選擇是都確認(rèn)修改,如果用戶點(diǎn)擊對(duì)話框上的確認(rèn),系統(tǒng)將執(zhí)行修改。如果修改成功,系統(tǒng)將會(huì)彈出修改成功的對(duì)話框。操作實(shí)例如圖9,關(guān)鍵代碼如下:introw;if(e.getActionCommand()=="修改"){try{num=Integer.parseInt(no.getText()); }catch(NumberFormatExceptione2){num=-1; }try{newValue=Integer.parseInt(data.getText()); }catch(NumberFormatExceptione1){newValue=-1; }if(or==1&&!colum.equals("xx")&&num>=0&&newValue>=0){//選擇的是修改行y_n=newDialog(this.y_n,"確定修改?",true);//實(shí)例化一個(gè)對(duì)話框 Panelp1=newPanel();Y=newButton("yes");Y.addActionListener(this);N=newButton("no");N.addActionListener(this); p1.add(newLabel("確認(rèn)請(qǐng)按“yes”,撤銷請(qǐng)按“no”")); p1.add(Y); p1.add(N);y_n.add("Center",p1);y_n.pack();y_n.setVisible(true); }elseif(or==2&&!colum.equals("xx")&&newValue>=0){y_n=newDialog(this.y_n,"確定修改?",true); Panelp1=newPanel();Y=newButton("yes");Y.addActionListener(this);N=newButton("no");N.addActionListener(this); p1.add(newLabel("確認(rèn)請(qǐng)按“yes”,撤銷請(qǐng)按“no”")); p1.add(Y); p1.add(N);y_n.add("Center",p1);y_n.pack();y_n.setVisible(true); }else {y_n=newDialog(this.y_n,"信息不全",true); Panelp1=newPanel();Y=newButton("yes");Y.addActionListener(this); p1.add(newLabel("您選擇的條件有誤,請(qǐng)重新選填;按“yes”繼續(xù)補(bǔ)全")); p1.add(Y);y_n.add("Center",p1);y_n.pack();y_n.setVisible(true); } }if(e.getSource()==Y&&or==1&&!colum.equals("xx")&&num>=0&&newValue>=0){//選擇修改行y_n.dispose(); HibernateOperateq=newHibernateOperate(); q.testUpdateByRow(colum,num,newValue);success=newDialog(this.success,"修改成功",true); Panelp2=newPanel(); p2.add(newLabel("修改成功!"));confirm=newButton("確認(rèn)");confirm.addActionListener(this); p2.add(confirm);success.add(p2);success.pack();success.setVisible(true); }elseif(e.getSource()==Y&&or==2&&!colum.equals("xx")&&newValue>=0){//確認(rèn)修改列y_n.dispose(); HibernateOperateq=newHibernateOperate(); row=q.testUpdateByColum(colum,newValue);if(row>0){success=newDialog(this.success,"修改成功",true); Panelp2=newPanel(); p2.add(newLabel("修改成功!"));confirm=newButton("確認(rèn)");confirm.addActionListener(this); p2.add(confirm);success.add(p2);success.pack();success.setVisible(true); } }elseif(e.getActionCommand()=="no"){y_n.dispose();success=newDialog(this.success,"修改失敗",true); Panelp2=newPanel(); p2.add(newLabel("修改失?。?));confirm=newButton("確認(rèn)");confirm.addActionListener(this); p2.add(confirm);success.add(p2);success.pack();success.setVisible(true); }elsey_n.dispose();if(e.getActionCommand()=="確認(rèn)"){success.dispose(); }2.5刪除模塊設(shè)計(jì)2.5.1刪除模塊模樣刪除模塊模樣如圖10所示。刪除模塊設(shè)計(jì):刪除模塊設(shè)計(jì):刪除按鈕輸入框輸入提示(工號(hào))刪除按鈕輸入框輸入提示(工號(hào))顯示用戶信息文本框,用來顯示將要?jiǎng)h除的用戶信息:顯示用戶信息文本框,用來顯示將要?jiǎng)h除的用戶信息:圖10刪除模塊的設(shè)計(jì),新建一個(gè)叫DeletePanel的java類,布局設(shè)計(jì)同上。刪除容器中加入了一個(gè)子容器select,Panelselect中加入了提示輸入工號(hào)的標(biāo)簽、工輸入框、空標(biāo)簽和刪除按鈕;下方是一個(gè)和select平級(jí)的文本框,用來顯示用戶刪除的員工的信息。功能和實(shí)現(xiàn)都非常簡單,沒有超出前面設(shè)計(jì)的范圍,故簡略說明,窗口顯示如圖11所示。圖11刪除模塊事件處理該模塊幾個(gè)模塊中事件處理最簡單的一個(gè)模塊,其中需要說明的就是刪除操作只能按工號(hào)刪除。當(dāng)用戶輸入工號(hào)后,點(diǎn)擊刪除按鈕是并未進(jìn)行刪除操作,系統(tǒng)將準(zhǔn)備刪除的員工信息打印在下方的顯示文本框中,當(dāng)用戶點(diǎn)擊確認(rèn)對(duì)話框中的確認(rèn)時(shí),系統(tǒng)才進(jìn)行員工信息刪除。操作實(shí)例如圖12,關(guān)鍵代碼如下:if(e.getActionCommand()=="刪除"){try{inta=Integer.parseInt(input.getText()); HibernateOperateq=newHibernateOperate(); q.testQueryById(a,result); }catch(NumberFormatExceptione1){result.setText("請(qǐng)輸入合法的整數(shù)??!"); }y_n=newDialog(this.y_n,"確定刪除?",true); Panelp1=newPanel();Y=newButton("yes");Y.addActionListener(this);N=newButton("no");N.addActionListener(this); p1.add(newLabel("確認(rèn)請(qǐng)按“yes”,撤銷請(qǐng)按“no”")); p1.add(Y); p1.add(N);y_n.add("Center",p1);y_n.pack();y_n.setVisible(true); }if(e.getSource()==Y){y_n.dispose();id=Integer.parseInt(input.getText()); HibernateOperateq=newHibernateOperate();if(q.testDeleteById(id)){success=newDialog(this.success,"刪除成功",true); Panelp2=newPanel(); p2.add(newLabel("刪除成功!"));confirm=newButton("確認(rèn)");confirm.addActionListener(this); p2.add(confirm);success.add(p2);success.pack();success.setVisible(true); }else{success=newDialog(this.success,"刪除失敗",true); Panelp2=newPanel(); p2.add(newLabel("該用戶不存在,刪除失??!"));confirm=newButton("確認(rèn)");confirm.addActionListener(this); p2.add(confirm);success.add(p2);success.pack();success.setVisible(true); } }elseif(e.getActionCommand()=="no"){y_n.dispose(); System.out.println("刪除失??!");success=newDialog(this.success,"刪除失敗",true); Panelp2=newPanel(); p2.add(newLabel("刪除失??!"));confirm=newButton("確認(rèn)");confirm.addActionListener(this); p2.add(confirm);success.add(p2);success.pack();success.setVisible(true); }if(e.getActionCommand()=="確認(rèn)"){success.dispose(); }圖123Hibernate重要配置根據(jù)本課題內(nèi)容要求可知,該課題對(duì)數(shù)據(jù)庫表格的要求并不復(fù)雜,僅用一張表即可,并且能使數(shù)據(jù)的冗余度非常小,所以就一個(gè)數(shù)據(jù)庫,一張表即可滿足本課程設(shè)計(jì)的要求。(1)建立數(shù)據(jù)庫。在mysql命令行執(zhí)行語句createdatabasecoursedesign;后,建數(shù)據(jù)庫的工作將就完成了。(2)引入相關(guān)jar包,將下載好的hibernate、Junit、日志文件和mysql驅(qū)動(dòng)類import到該課題的工程中,具體引入的jar包如下:(3)建立實(shí)體類。新建一個(gè)叫User的java類。加上hibernate的實(shí)體類的注解,并寫好員工的屬性。代碼如下:@EntitypublicclassUser{privateintid;privateStringname;privateintbasicWage;privateintpostWage;privateintbonus;}寫好各個(gè)屬性的get和set方法,特殊一點(diǎn)是在主鍵id的get方法前加上注解@Id和@GeneratedValue,前者表示該屬性是主鍵,后者表示該屬性的數(shù)值自增類型,具體如下:@Id@GeneratedValuepublicintgetId(){returnid; }此外,添加一個(gè)get方法,并注解為@Transient,表示不存入數(shù)據(jù)庫的,改方法的功能是用來獲取工資總額,具體如下:@Transient//不存入數(shù)據(jù)庫,只是為了方便查詢publicintgetAllWage(){returnthis.getBasicWage()+this.getPostWage()+this.getBonus(); }還有,必須重寫實(shí)體類的toString方法如下:publicStringtoString(){return"ID:"+getId()+"姓名:"+getName()+"基礎(chǔ)工資:"+getBasicWage() +"職務(wù)工資:"+getPostWage()+"獎(jiǎng)金:"+bonus+"工資總額:"+getAllWage()+"\n\n"; }(4)配置好hibernate的配置文件。去自己下載的hibernate-distribution-3.3.2.GA\documentation\manual\zh-CN\html_single中參考,把配置文件copy過來,按自己的需要配置上。直觀起見,直接在配置文件中注釋了,每個(gè)語句都有注釋,即這里打算的寫的解釋。代碼如下:<!--加載mysql驅(qū)動(dòng)--><propertyname="connection.driver_class"></property><!--連接到本地的一個(gè)叫coursedesign的數(shù)據(jù)庫--><propertyname="connection.url">jdbc:mysql://localhost/coursedesign</property><!--數(shù)據(jù)庫用戶名--><propertyname="connection.username">root</property><!--數(shù)據(jù)庫用戶密碼--><propertyname="connection.password">root</property><!--配置數(shù)據(jù)庫方言--><propertyname="dialect"></property><!--配置數(shù)據(jù)庫連接池,這里單一訪問就配置為1--><propertyname="connection.pool_size">1</property><!--配置線程--><!--EnableHibernate'sautomaticsessioncontextmanagement--><propertyname="current_session_context_class">thread</property><!--Disablethesecond-levelcache--><!--不用hibernate的二級(jí)緩存--><propertyname="vider_class"></property><!--EchoallexecutedSQLtostdout--><!--配置在執(zhí)行過程中打印sql語句,方便查錯(cuò)--><propertyname="show_sql">true</property><!--顯示格式化的sql語句--><propertyname="format_sql">true</property><!--Dropandre-createthedatabaseschemaonstartup--><!--配置為每次不先刪表再建表,否則每次都會(huì)刪除以前的數(shù)據(jù)--><propertyname="hbm2ddl.auto">update</property><!--配置自己寫的實(shí)體類--><mappingclass="com.wangzhu.model.User"/>(5)配置日志文件,將日志文件按perties也配置好。其作用是顯示hibernate執(zhí)行過程中的詳細(xì)情況,非常有必要步驟,對(duì)于查錯(cuò),測(cè)試修改非常重要的。直接去hibernate附帶的例子里copy就行。并將里面如下行的注釋解開:log4j.appender.stdout=log4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}%5p%c:%L-%m%nlog4j.rootLogger=warn,.hibernate.tool.hbm2ddl=debug4后臺(tái)功能實(shí)現(xiàn)四大功能的實(shí)現(xiàn)。增、刪、改、查功能的實(shí)現(xiàn)中大部分是通過hibernate訪問數(shù)據(jù)庫,進(jìn)而對(duì)數(shù)據(jù)庫的操縱,但是某些操縱通過hibernate會(huì)得不償失,會(huì)占用大量內(nèi)存,更有甚者,hibernate不能直接實(shí)現(xiàn),這種情況下是通過jdbc連接訪問數(shù)據(jù)庫,并操縱的。為了便于測(cè)試,這些方法都是先新建一個(gè)測(cè)試類MyTest,用Junit4.7測(cè)試通過了,再將方法改成相應(yīng)的傳引用的方法封裝在一個(gè)叫HibernateOperate的java類,各種功能的實(shí)現(xiàn)均封裝在這個(gè)類中,在附錄里兩個(gè)類都有完整的代碼,下面將逐一介紹MyTest類中的方法。4.1新建測(cè)試類由于是在測(cè)試類中,所以每一個(gè)方法中都有重復(fù)的語句獲得session,所以先定義一個(gè)beforeclass方法并注解為@BeforeClass,同時(shí)定義一個(gè)@AfterClass方法,并注解為@afterClass。在main方法中調(diào)用beforeclass就可以了。以后每次執(zhí)行注解為@Test的方法時(shí)都會(huì)先調(diào)用beforeclass方法,結(jié)束時(shí)都會(huì)調(diào)用afterclass方法。代碼如下:@BeforeClasspublicstaticvoidbeforeclass(){sf=newAnnotationConfiguration().configure().buildSessionFactory(); System.out.println(sf); }@AfterClasspublicstaticvoidafterclass(){sf.close(); }4.2存儲(chǔ)方法實(shí)例化一個(gè)User對(duì)象,在(1)的情況下,拿到session后,調(diào)用session的方法即可完成,具體如下:@Testpublicvoidtestsave(){ Useru=newUser(); u.setName("d但是"); u.setBasicWage(5000); u.setPostWage(2000); u.setBonus(1000); Sessionsession=sf.getCurrentSession();//拿到當(dāng)前內(nèi)存中的session,如果沒有則創(chuàng)建一個(gè) session.beginTransaction();//開始事物 session.save(u);//調(diào)用session的方法 session.getTransaction()mit();//提交事務(wù) }4.3查詢方法查詢?nèi)繒r(shí),用list來裝從數(shù)據(jù)庫拿到的對(duì)象,用迭代器Iterator來遍歷。如: Iterator<User>users=session.createQuery("fromUser").list().iterator();,里面值得注意的是查詢語句from的后面不是表明,而是類名(實(shí)體類),是通過HQL拿到的,這點(diǎn)要與SQL語句分開。其余地方與儲(chǔ)存的一模一樣,不再贅述。在按工號(hào)和姓名查詢的過中和上述方法沒有重要區(qū)別,完全是SQL條件的差異,這里也省略了,詳情見附件。查詢方法中區(qū)別較大的是在儲(chǔ)存員工時(shí)用到的查詢方法,因?yàn)閙ysql中有一特殊語句查詢最后插入的記錄,直接用hibernate的注解和擴(kuò)展注解都不好用,所以我使用了hibernate的SQLQuery接口,在hibernate中使用原生態(tài)的sql,這樣使用起來就方便多了,使用方法如下:對(duì)原生SQL查詢執(zhí)行的控制是通過SQLQuery接口進(jìn)行的,通過執(zhí)行Session.createSQLQuery()獲取這個(gè)接口。最簡單的情況下,我們可以采用以下形式:Listcats=sess.createSQLQuery("select*fromcats").addEntity(Cat.class).list();這個(gè)查詢指定了:SQL查詢字符串和查詢返回的實(shí)體。所以查詢最后一條記錄的方法如下:@TestpublicvoidtestQueyLast(){ Sessionsession=sf.getCurrentSession(); session.beginTransaction(); Stringsqls="select*fromuserwhereid=(selectmax(id)fromuser)"; Iterator<User>u=session.createSQLQuery(sqls).addEntity("u",User.class).list().iterator(); session.getTransaction()mit();while(u.hasNext()){ System.out.println(u.next()); } }4.4數(shù)據(jù)更新方法該課程設(shè)計(jì)中用到的數(shù)據(jù)更新有兩種,即更新某一條記錄的某一項(xiàng)和更新所有記錄的某一列,更新某一條記錄的某一項(xiàng)的時(shí)候,和前面講述的查詢基本相同,關(guān)鍵的不同的地方是 Queryq=session.createQuery("updateUserusetu.postWage=4555whereu.id=3"); q.executeUpdate();這里,這些通過hibernate的自帶文檔可以輕易得知。但是哎更新所以記錄的某一列時(shí),hibernate會(huì)將這個(gè)數(shù)據(jù)表都load到內(nèi)存中,然后在內(nèi)存中逐條修改,這樣執(zhí)行耗資源的同時(shí),效率太低,還不如返回去用jdbc操縱。先將mysql的驅(qū)動(dòng)import到工程中,在myeclipse下的操作步驟是右鍵單擊工程—>buildpathconfigurebuildpath-->選擇libraries的對(duì)話框中點(diǎn)擊addexternaljars找到—>點(diǎn)擊ok就行。加載驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver").newInstance();然后通過url,username和password取得連接就可以了,具體方法如下:@TestpublicvoidtestUpdateByColum(){ Stringsql="updateuserusetu.postWage=8888";try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); Connectioncn=DriverManager.getConnection("jdbc:mysql://localhost:3306/coursedesign","root","root"); PreparedStatementps=cn.prepareStatement(sql);introw=ps.executeUpdate(); System.out.println("row="+row); ps.close(); cn.close(); }catch(Exceptione){//TODOAuto-generatedcatchblock System.out.println("更新數(shù)據(jù)失敗"); } }4.5刪除員工方法這過程比較特殊,先將給定id的對(duì)象load到內(nèi)存中,然后執(zhí)行刪除,提交事務(wù)就可以完成。具體方法如下:@TestpublicvoidtestDeleteById(){//按工號(hào)刪除 Sessionsession=sf.openSession(); session.beginTransaction(); Useru=(User)session.load(User.class,5); session.delete(u); session.getTransaction()mit(); session.close(); }到此,通過hibernate或者jdbc操縱數(shù)據(jù)的方法以設(shè)計(jì)完成,下一步只要將測(cè)試類中的方法copy到HibernateOperate類中,對(duì)每個(gè)方法中都加上beforeclass和afterclass中的內(nèi)容,并且設(shè)計(jì)好引用的傳遞就可以了,因?yàn)樵诟郊杏型暾a,所以這里不再討論HibernateOperate類中的方法。5異常處理根據(jù)本課題的設(shè)計(jì)思路,在外層模塊的設(shè)計(jì)中,一般不涉及到異常的處理,由于整個(gè)過程中有很多異常,并且一類異常也有很多,所以就將異常分類來討論,這樣就不會(huì)重復(fù),過程中把有些系統(tǒng)異常改為了自定義異常,作為自定義異常的示例。分析該課程設(shè)計(jì)的異常主要出現(xiàn)在輸入檢驗(yàn)、連接數(shù)據(jù)庫和數(shù)據(jù)操縱這兩個(gè)地方。下面將按這兩類進(jìn)行解析:5.1輸入檢驗(yàn)異常在增加員工的模塊的設(shè)計(jì)中,由于本課題設(shè)計(jì)將工工資的各項(xiàng)數(shù)據(jù)都確定為整型,所以當(dāng)用戶輸入的是不能轉(zhuǎn)化為整型數(shù)據(jù)的字符串時(shí),將引起異常,代碼中的處理如下:if(!t[1].getText().equals("")&&flag){try{basicWage=Integer.parseInt(t[1].getText()); }catch(NumberFormatExceptione1){ flag=false;result.setText("您輸入的基礎(chǔ)工資有誤!"); } }if(!t[2].getText().equals("")&&flag){try{postWage=Integer.parseInt(t[2].getText()); }catch(NumberFormatExceptione1){ flag=false;result.setText("您輸入的職務(wù)工資有誤!"); } }if(!t[3].getText().equals("")&&flag){try{bonus=Integer.parseInt(t[3].getText()); }catch(NumberFormatExceptione1){ flag=false;result.setText("您輸入的獎(jiǎng)金有誤!"); } }在查詢時(shí),當(dāng)用戶輸入的工號(hào)不合法時(shí)也是同樣的處理方式,如:try{inta=Integer.parseInt(inputId.getText()); HibernateOperateq=newHibernateOperate(); q.testQueryById(a,result); }catch(NumberFormatExceptione1){result.setText("請(qǐng)輸入合法的工號(hào)!!"); }5.2數(shù)據(jù)操縱異常修改和刪除中均有用到工號(hào),但是處理方法完全一樣,所以修改和刪除中的異常不再贅述。在用jdbc連接數(shù)據(jù)庫的過程中可能產(chǎn)生的異常有如下: Try{……}catch(InstantiationExceptione){ e.printStackTrace(); }catch(IllegalAccessExceptione){ e.printStackTrace(); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); }由于這里的設(shè)計(jì)沒有必要分得太細(xì),所以不再細(xì)化,用面向?qū)ο蠖鄳B(tài)的應(yīng)用,將這個(gè)整體的異常作為一個(gè)異常信息傳出去:Try{……}catch(Exceptione){ row=-1; }5.3自定義異常首先得自己新建一個(gè)異常類,必須繼承與系統(tǒng)已有的異常類,為了方便直觀,我重寫了父類的toString方法。如下:publicclassUserExceptionextendsException{privatestaticfinallongserialVersionUID=1L; UserException(){super(); }publicStringtoString(){return"通過hibernate訪問和操縱數(shù)據(jù)庫異常!??!"; }}在通過hibernate操縱數(shù)據(jù)時(shí)的異常,我把它定義成了一個(gè)自定義異常實(shí)例,在HibernateOperate類中時(shí)久讓它往外拋,在各個(gè)模塊中來catch,這樣就是一個(gè)成功的自定義異常了。如:在HibernateOperate中的publicvoidtestQuerySpecil(Stringmsg,Stringmss,Stringmgg,TextAreata)throwsUserException{sf=newAnnotationConfiguration().configure().buildSessionFactory(); Sessionsession=sf.openSession(); session.beginTransaction(); Iterator<User>users=session.createQuery("fromUseruwhere(u.basicWage+u.postWage+u.bonus)"+msg+"orderby"+mss+""+mgg).list().iterator(); session.getTransaction()mit(); ta.setText("");while(users.hasNext()){ ta.append(users.next().toString()); } session.close();sf.close(); }在QueryPanel中來catch HibernateOperateq=newHibernateOperate();try{ q.testQuerySpecil(msg,mss,mgg,result); }catch(UserExceptione1){result.setText(e.toString()); }如果沒有將顯示給用戶看的界面元素的引用沒有傳過來的時(shí)候,就用讓它往外拋,拋到可以顯示的地方就catch住,這樣增強(qiáng)了程序的靈活性。就如上述的這種用法。也可以在HibernateOperate的方法中catch,特別是已經(jīng)將顯示文本框的引用傳過來后,在這里catch就方便多了,如按工號(hào)刪除員工的方法:publicbooleantestDeleteById(intid,TextFieldtf){//按工號(hào)刪除booleanflag=false;sf=newAnnotationConfiguration().configure().buildSessionFactory(); Sessionsession=sf.openSession();try{ session.beginTransaction(); Useru=(User)session.load(User.class,id); tf.setText(u.toString()+"已經(jīng)刪除"); session.delete(u); session.getTransaction()mit(); flag=true; }catch(HibernateExceptione){ tf.setText("由于hibernate連接和操縱數(shù)據(jù)異常,刪除失敗??!"); } session.close();sf.close();returnflag; }6總結(jié)與體會(huì)6.1總結(jié)本課程設(shè)計(jì)重點(diǎn)分為兩個(gè)方面,一是圖形界面的設(shè)計(jì),主要包括界面圖形的設(shè)計(jì)、監(jiān)聽器的使用、事件處理;二是后臺(tái)數(shù)據(jù)操作,主要包括數(shù)據(jù)庫的連接、hibernate的基礎(chǔ)配置、增刪改查操作、異常處理。圖形界面的設(shè)計(jì)中,根據(jù)課題要求,個(gè)人安排設(shè)計(jì)成一個(gè)主模塊,四個(gè)子模塊的形式。子模塊以卡片的形式在主模塊中,這樣不至于所有的操作接賣弄都擠在一起。在主模塊中,有按鈕可以隨時(shí)選擇四個(gè)子模塊中的任意一個(gè),用戶可以隨時(shí)選擇。后臺(tái)數(shù)據(jù)操縱中,主要使用的是通過hibernate訪問數(shù)據(jù)庫的,hibernate訪問數(shù)據(jù)庫還有另一種比較你麻煩的訪問方式,那就是不用注解,全部通過配置hibernate的xml文件訪問,寫起來比較麻煩。本課題中用到了hibernate的幾種注解,也用了幾種系統(tǒng)定義的異常,同時(shí)自定義了異常類。6.2體會(huì)在圖形界面設(shè)計(jì)中,使用了系統(tǒng)里提供的多種圖形常用類,通過查閱相關(guān)書籍和查閱sun公司給出的api,加深了對(duì)gui編程這一塊的掌握程度,比如其中的布局設(shè)計(jì)、監(jiān)聽器、事件處理等。設(shè)計(jì)方面,四個(gè)子模塊的設(shè)計(jì)中,查詢模塊有查詢方式、查詢范圍、排列依據(jù)和排序方式的多種情況供用戶選擇,然后將查詢結(jié)果顯示在下方的顯示文本框中。在增加員工的子模塊中,如果增加成功,系統(tǒng)會(huì)將增加的那個(gè)員工的信息打印出來,每個(gè)這樣讓每個(gè)員工都知道自己的工號(hào)。另外,結(jié)合增加員工的模塊中規(guī)定,增加員工時(shí),員工姓名不能空,否則無法增加,在修改子模塊中,本課程設(shè)計(jì)值提供以工號(hào)方式的修改,但是不能修改員工的姓名,這也是合情合理的。當(dāng)修改員工信息時(shí),一定要確認(rèn)才能修改,以避免誤改的可能。刪除時(shí)更是謹(jǐn)慎,在執(zhí)行刪除操作前,系統(tǒng)會(huì)將用戶將要?jiǎng)h除的員工的信息打印在顯示文本框中,提示用戶是否確認(rèn)刪除,確保用戶不會(huì)誤改。這些是設(shè)計(jì)思路的嚴(yán)謹(jǐn)范疇的體會(huì)。在編寫hibernate訪問數(shù)據(jù)庫程序時(shí),更多的解決方法是看hibernate自帶的文檔,各種注解、各種訪問方式,都非常有必要參考這個(gè)文檔。通過查閱官方給出的一手文檔,可以更清楚的指導(dǎo)其運(yùn)行機(jī)制學(xué)到更多的新知識(shí)。比如對(duì)所有行的某一列進(jìn)行修改的時(shí)候,查閱了hibernate的參考文檔,也在網(wǎng)上尋找了很多方法,也感覺用起來沒有使用jdbc那樣簡便。測(cè)試類的應(yīng)用,在寫一個(gè)比較大的項(xiàng)目時(shí),測(cè)試類非常有用,并且應(yīng)配置日志文件,打印sql語句。這樣為開發(fā)過程中查漏檢錯(cuò)提供了線索和思路,否則將會(huì)在不重要的地方浪費(fèi)大量的時(shí)間。7用戶使用說明書運(yùn)行叫MyApplet的類;在第一排四個(gè)按鈕中選擇將要進(jìn)行的操作;查詢操作時(shí),選擇按工號(hào)查詢則必須輸入工號(hào);選擇按姓名查詢則必須輸入姓名,其他查詢中的選項(xiàng)任由用戶選擇;增加員工時(shí),員工工號(hào)由系統(tǒng)給出,無需輸,但是必須輸入員工姓名,其他項(xiàng)非必填項(xiàng);進(jìn)行修改操作時(shí),系統(tǒng)彈出是否確認(rèn)修改,在系統(tǒng)提示修改成功時(shí)才表明修改成功,都則失敗;進(jìn)行刪除操作時(shí),系統(tǒng)將用戶將要?jiǎng)h除的員工信息打印在下方文本框中,請(qǐng)確認(rèn)后選擇是否刪除;關(guān)閉系統(tǒng)時(shí),請(qǐng)點(diǎn)擊窗口右上角的“X”。參考文獻(xiàn)[1]印旻.Java與面向?qū)ο蟪绦蛟O(shè)計(jì)教程.北京:高等教育出版社,1999.[2]JoshuaBloch,NealGafter.Java解惑.北京:人民郵電出版社,2006.[3]BruceEckel.Java編程思想(第四版).北京:機(jī)械工業(yè)出版社,2007:378-485,576-582.[4]孫衛(wèi)琴.Java面向?qū)ο缶幊蹋本弘娮庸I(yè)出版社,2006.[5]GayS.Horstmann,GaryCornell.Java核心技術(shù)卷I.北京:機(jī)械工業(yè)出版社,2023:270-302,523-533.[6]ChristianBauer,GavingKing.Hibernate實(shí)戰(zhàn)(第二版).北京:人民郵電出版社,2023.[6].[7].附錄1外層模塊源碼packagecom.wangzhu.view;importjava.applet.Applet;importjava.awt.Button;importjava.awt.CardLayout;importjava.awt.Color;importjava.awt.Font;importjava.awt.GridBagConstraints;importjava.awt.GridBagLayout;importjava.awt.GridLayout;importjava.awt.Insets;importjava.awt.Label;importjava.awt.Panel;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassMyAppletextendsAppletimplementsActionListener{privatestaticfinallongserialVersionUID=1L; Labeltittle=newLabel("工資管理系統(tǒng)"); Panelp[]=newPanel[3]; GridBagLayoutgbLayout=newGridBagLayout();//創(chuàng)建布局對(duì)象 GridBagConstraintsgbc=newGridBagConstraints(); CardLayoutmyCard=newCardLayout(); Button[]b=newButton[4]; QueryPanelqp=newQueryPanel();//查詢模塊 AddPanelap=newAddPanel();//增加用戶模塊 UpdatePanelup=newUpdatePanel();//修改模塊 DeletePaneldp=newDeletePanel();//刪除模塊@Overridepublicvoidinit(){this.setLayout(gbLayout);this.setBackground(Color.LIGHT_GRAY);tittle.setFont(newFont("Serif",50,50));tittle.setBackground(Color.GREEN);b[0]=newButton("查詢");b[0].addActionListener(this);//注冊(cè)監(jiān)聽b[1]=newButton("儲(chǔ)存");b[1].addActionListener(this);b[2]=newButton("修改");b[2].addActionListener(this);b[3]=newButton("刪除");b[3].addActionListener(this);p[0]=newPanel(newGridLayout(1,1));p[0].setBackground(Color.RED);p[0].add(tittle);//加載標(biāo)題p[1]=newPanel(newGridLayout(1,4));p[2]=newPanel(myCard);p[2].setLayout(myCard);p[2].add(qp,"查詢");p[2].add(ap,"儲(chǔ)存");p[2].add(up,"修改");p[2].add(dp,"刪除");for(inti=0;i<4;i++){p[1].add(b[i]);p[1].add(newLabel(""));//將按鈕分開 }gbc.gridwidth=GridBagConstraints.BOTH;//占據(jù)橫向剩余空間gbc.weightx=1;//橫向可擴(kuò)展gbc.gridwidth=GridBagConstraints.REMAINDER;gbLayout.setConstraints(p[0],gbc);//將gridbagconstraints對(duì)象與組建相聯(lián)系 add(p[0]);gbc.insets=newInsets(20,4,4,4);gbLayout.setConstraints(p[1],gbc); add(p[1]);gbc.insets=newInsets(20,4,4,4);gbLayout.setConstraints(p[2],gbc); add(p[2]); }publicvoidactionPerformed(ActionEvente){//下方四個(gè)模塊按名顯示myCard.show(p[2],e.getActionCommand()); }}附錄2查詢模塊源碼packagecom.wangzhu.view;importjava.applet.Applet;importjava.awt.Button;importjava.awt.Choice;importjava.awt.GridBagConstraints;importjava.awt.GridBagLayout;importjava.awt.GridLayout;importjava.awt.Insets;importjava.awt.Label;importjava.awt.Panel;importjava.awt.TextArea;importjava.awt.TextField;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;importcom.wangzhu.model.HibernateOperate;importcom.wangzhu.model.UserException;publicclassQueryPanelextendsAppletimplementsActionListener,ItemListener{privatestaticfinallongs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026安徽蕪湖市運(yùn)達(dá)軌道交通建設(shè)運(yùn)營有限公司對(duì)外招聘62人筆試參考題庫附帶答案詳解
- 2026年服裝設(shè)計(jì)創(chuàng)意與制作工藝流程模擬題
- 2026年儲(chǔ)能設(shè)備綠色處理工程師專業(yè)技能測(cè)試題
- 2026年心理學(xué)愛好者必學(xué)心理測(cè)評(píng)題目集及答案解析
- 湖北省武漢市新洲三中2026屆生物高二上期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 2026年影視制作核心技能中級(jí)影視剪輯師筆試練習(xí)題
- 2026年旅游市場(chǎng)調(diào)研與分析??碱}庫
- 甘肅省天水市第六中學(xué)2026屆高二數(shù)學(xué)第一學(xué)期期末監(jiān)測(cè)模擬試題含解析
- (2026年)一例心梗、心衰合并重度肺部感染患者護(hù)理疑難病例討論課件
- 2026年市場(chǎng)營銷策略與實(shí)踐認(rèn)證題庫
- 人教版小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)全冊(cè)同步練習(xí)含答案
- 加油站防投毒應(yīng)急處理預(yù)案
- 閉合導(dǎo)線計(jì)算(自動(dòng)計(jì)算表)附帶注釋及教程
- 項(xiàng)目1 變壓器的運(yùn)行與應(yīng)用《電機(jī)與電氣控制技術(shù)》教學(xué)課件
- 網(wǎng)店運(yùn)營中職PPT完整全套教學(xué)課件
- 北師大版八年級(jí)數(shù)學(xué)下冊(cè)課件【全冊(cè)】
- 關(guān)于提高護(hù)士輸液時(shí)PDA的掃描率的品管圈PPT
- 針入度指數(shù)計(jì)算表公式和程序
- XGDT-06型脈動(dòng)真空滅菌柜4#性能確認(rèn)方案
- 繩正法曲線撥道量計(jì)算器
- 壓縮空氣管道安裝作業(yè)指導(dǎo)書
評(píng)論
0/150
提交評(píng)論