Hibernate還是比較常用的,於是我研究了一下Hibernate數據庫連接,在這裡拿出來和大家分享一下,希望對大家有用。
最近在做一個JavaWeb程序,用MyEclipse開發,用Struts(*.do)做開發框架,Hibernate做數據庫代理類,負責對數據庫的操作,維持數據持久和數據訪問,Spring用來整和注入,哎,還用了Ajax,在Java中實現真他媽的讓人煩,什麼Ajax,根本就是寫JS腳本嘛(不過本來也是,就是最原始的那種拉),自己手寫了JS腳本,好久沒寫過這麼多了,也當練習一下XMLHTTPRequest拉。
要是在.NET中那就方便多了,直接就拖AjaxControlToolkit控件,5個AJAX Extensions核心組件,還有幾十個ajax Toolkit控件,有兩邊對聯做廣告的,有做像Google智能提示的(說到這個,我做每回有一個問題,就是在指定了返回記錄的Item每一行Css樣式之後,當用鍵盤上下的方向鍵移動所選條的時候,它就出現了腳本錯誤,也不能用方向鍵移動所選條了,我試過了,只要不設置class他就沒一點問題,能正常移動選擇和智能提示,但是不設置樣式那哪看得?
他默認都是黑字白背景,不過不曉得是不是DIV層做的,我以前用返回<span style='color:red'>Jonllen</span>做測試,他卻沒能返回Jonllen,然後我對他進行Html編碼和反編碼都試過了,也不行,在頁面裡面要是能得到顯示Html的效果(說到這裡我呀有要叉開話題了,等後面講考試在說了),要是這樣能行的話那也能設置它的Css style了,但是就是不行,不知道大家有沒有碰到我這種情況過,還請知道的大蝦指點)還有做瑣定凍結頁面做實現的,還有談出的等等...要什麼有什麼,看你要實現什麼功能了,但我覺得就是MS這些Ajax控件調用WebServer的太多了,就有時要新寫個WebMethod不習慣感覺麻煩了,不過這倒是順了Ajax的本質咯,就是要回調WebServer的Xml,不過我覺得以前做的Ajax還可以,他沒有做成控件,只是要引用dll,回調的是一個 Ajax方法,我以前在VS2003裡用AjaxPro.dll,感覺還可以,雖然此方法有很多局限性,但用起來感覺挺方便的.MS真是夠人性化,Sun 也要學著點就好了,不過當前Sun還是做好它的J2EE規范在說吧。
剛開始還可以,就是JS不好怎麼調試,就只能做死了alert看執行到了那一步,不一會兒JS搞定了,我在JS裡面調用的open url是一個servlet類,然後在這裡調用Hibernate對數據庫操作,以達到Ajax的異步處理,因為我這個項目以前是連SQL Server 2000的,不過現在我要用MYSQL數據庫了,呵呵,免費的那種,我就把以前工程裡面的Hibernate要連SQL Server 2000的三個驅動包給刪了,接著選擇DB Browser(數據庫浏覽器)重新設置了Hibernate的數據連接,Edit更改端口,輸入數據庫口令,哦,還要添加一個MQSQL數據庫連接驅動連接包(jar文件),找啊找,在E盤,選擇,配置 OK,Next,Finish完成,Open Connection,一長串進度條到結尾後,OK連接成功了,一帆風順,點開一看幾個database下面幾個table都對數,我刪掉了以前的工程底下hibr包下的一些數據映射對象和相應的DAO數據訪問,然後Hibernate Reverse Engineering重新添加刪除的那些Hibernate數據庫映射對象,用assigned(有主鍵)的用assigned,用native(自動增長主鍵)用native,OK,Hibernate代理類搞定,現在只要看servlet裡面,...DAO dao = new ...DAO()…對數據庫操作完成!
現在就看Ajax的了,它是如何的偉大,在不刷新的情況下異步的CallBack服務器,配置一下WebLogic,Redeploy重新部署,Run運行,打開Brower鍵如URL看效果咯,滿懷期待,想著:onclick提交,addshow()調用JS一個函數,回發到服務器,結果···返回的是一個alert('你所請求的頁面有異常'),呵呵~哎,為什麼類?我關閉一下調試,在重新啟動一下,還是提示有異常,為什麼,為什麼,為什麼呢?
我認真的檢查了我一下JS代碼,認真的過了一遍JS裡面的function,一個個檢查,定義XMLHttpRequest對象、 sendRequest(url)發送函數請求、processResponse()處理返回信息的函數,等等...sendRequest(url)發送函數請求,對URL,應該是這個問題,我的url是"servlet/FindServlet?sn=" +ss;FindServlet是我工程ss包下面的FindServlet.java的servlet類,ss是在JS裡面var的一個變量,在細想了一下,servlet/FindServlet?sn="+ss,不是ss/FindServlet?sn="+ss嗎?不是,後來也用ss也測試了一下,確實不是,那是什麼問題呢?難道問題不是出在URL上面,url沒錯,想了一陣了,靈機一動,測試一下不就知道了嗎!
我連忙打開 FindServlet這個類,一時間還很狠啪著自己的後老勺:你真笨啊!進入FindServlet,在doGet方法裡邊String shen = request.getParameter("sn");System.out.println(shen);獲取sn查詢字符串(呵呵.NET學多了),然後再在控制台輸出,保存運行,哎,真的輸出了,控制台裡面輸出了"湖南",我sn查詢字符串的值,那這麼來說,URL確實沒有問題,它已經把請求發送到我的這個FindServlet類裡面來了,這裡我已經能接受到了,接著在FindServlet類往下看,在一些關鍵性的代碼後加上 System.out.println("變量值");我習慣性調試Java的方法,調試運行,果然還沒有執行完就報異常了,控制台在輸出了DAO前面的變量值後後面的就都沒有輸出了,一定就是DAO的問題了!
我把目光轉到DAO,第一行AddrtableDAO dao = new AddrtableDAO();就實例化絕對沒問題List list = dao.findAll(shen);應該問題System.out.print(list。size());此行在控制台沒有輸出結果,List list = dao.findAll(shen),findAll(shen)是按指定條件shen對數據庫執行查詢返回List集合的方法,就是這句對數據庫查詢有問題了(一時間感覺自己真的了不起,我這個人比容易較驕傲自滿,我自己都受不了自己了),馬上寫了一個static void main()方法測試,果然是Hibernate代理數據庫操作類出現了問提,提示Can not Connection不能連接,為什麼類?
連不上,我明明在DB Browser裡配置好了連MySQl的設置,在那裡連上了啊,還可以看到數據庫和表啊,怎麼建的Hibernate數據庫代理類就連不上了類,我馬上轉到了hibernate。cfg.xml Hibernate配置文件,一看,暈了,怎麼在配置文件裡面用的還是以前的那個的配置設置,我不是改成MySql了嗎,我知道了,你在DB Browser選擇好數據庫連接對象,並未更改Hibernate數據庫連接配置,暈了,這MyEclipse怎麼這麼蠢啊,不知道自動更改 Hibernate配置文件,唉癡哦,手動更改後調試運行,心想這次應該能OK了吧,但結果總是出現意外,老和所想的背道而馳的,有出西西了,一長串異常:什麼Error Creating SessionFactory等一大片英文,搞得我頭都大了,點異常進去看,就是到了那些Hibernate那些砸七砸八的那些包的原類型裡了,一個個類 N多代碼,看得真叫人煩拉,想起就郁悶,這MyEclipse調試可真JB麻煩,又全英文版的(想起.NET中調試,哎```個人覺得Java中就是 jar包太繁多了,而一些重要的設置都保存在Xml的配置文件裡面,感覺喜歡拿xml配置文件出氣!
如頁面導航等, 但內容多了就顯得繁雜了,就只能手動修改Source了),心裡直罵Java垃圾,不禁雙手抱著後老勺往後仰,看這天花板郁悶ING。
回下頭來看到了這 MyEclipse工具,蔑視了工程一下,回到電腦面前,看啊看,順眼看了這些砸七砸八的包,哎,似乎少了什麼東西,憑直覺我又過了那些jar包文件一便,細想了一翻,又仔細看了那些包一遍,我的MySql數據庫驅動jar包文件類!怎麼沒有呢?我再Refresh一下還是沒有看到啊!拐了,我雖然刪除了以前連Sql Server 2000的3個包,但是怎麼MySql的包怎麼沒有導進來呢?
第一時間問為什麼?難道又是DB Browser的問題,你在那裡選擇Add JARS選擇是驅動包文件是用的磁盤物理路徑,也就是說他沒有自動把你所選擇的包自動加在到你的工程裡面進來了,該死的DB Browser,害得我Hibernate老是連不上,這個問題好象只在你以前用一個數據源現在又換掉一個新的Hibernate數據庫連接時才有,我打工程文件所在目錄,進入WebRoot\WEB-INF\lib 目錄,手動將我E盤底下個那個MySQL數據庫連接驅動Jar包Copy到這個目錄下,再在工程裡面Refresh一下,MySql包就出來了,運行 WebLogic打開浏覽器,onclick,啊````終於出來了,通過JS查詢到數據庫服務器裡面的數據了。
我在Java中實現Ajax就這樣成功了!你們看了我寫了這麼多覺得好不好笑啊,是不是感覺我是垃圾啊,菜鳥一個,我的確也是菜鳥,本來就是,要是高手的話可能一看就知道錯誤出在那裡了,就不會想我這樣折騰了吧!是不是我說了一些Java很低級的常識類?而我自己卻不清白類!希望大家莫見笑我了,第一次寫這些Hibernate知識,我犯的一些錯誤,應該大家有些Java的朋友在些Hibernate的時候沒出現過我這樣的問題吧,其實我對Java 是比較感興趣的,但是由於我所學的Java的知識太少,對有一點難的就不知道做了,那是因為我個人學的 Java太膚淺的原因,我知道其實在.NET中實現在在Java裡基本上可以實現的,只不過可能比在.NET中實現難一點而已吧。在網上看到有很多朋友有拿過JAVA的Hibernate和.NET中的ADO.NET進行比較,也有很多人說兩著不能進行相比,就像SQL語句不能和存儲過程進行相比一樣,只要能在恰當的時候用就是好的,我都很認同的他們的觀點和看法,而我個人認為呢,只要有自己的對事物認識的觀點就是好的。
我是一個比較愛說的人,我覺得你只要能認真的去思考分析一件事物,不管你得到的結論是怎麼樣的,旨在在這個過程你從中是否學到了一些東西,我不喜歡那些平時不愛說話的,因為那時候我們不知道他對這個事物的看法是怎樣的,也難以猜測他心裡到底在想什麼。既然上面有說到Hibernate和ADO.NET,所以我又加上了這一段羅嗦起來了,呵呵,就我這皮毛也當回顧我以前一些知識,談不上總結也算小記一翻,希望高手們別笑話我們這些新手了,下面就我所了解的 Hibernate和ADO.NET比較如下:在Hibernate中,首先我們需要在JAVA工程裡面添加Hibernate標簽庫(我用的是 Hibernate 3.1 Core Libraries)的引用,在.NET中我覺得就是using、import名稱空間SqlClient、OleDb添加程序集的過程,然後我們需要打開DB Brower建立數據庫連接字符串,就是打服務器名用戶名密碼等,然後Hibernate數據庫連接信息保存在hibernate。cfg.xml(默認缺省)這一個xml文件中,在連接數據庫的時候值得一提的是需要數據庫連接驅動包,不同的數據庫有不同的驅動包,個人覺得不同的驅動包作用在與,由於不同數據庫用的可能的是不同連接操作方式,如Oracle是表空間的形式存在數據庫等,而其他的可能略有不同。
正確配置好連接成功後,我們就能在DB Brower裡看到數據庫和數據庫對應的表了,在你連接數據庫前添加Hibernate時它會叫你選擇包,添加後包下面就會多3個類了,IBaseHibernateDAO、BaseHibernateDAO、HibernateSessionfactory 從名字就可以看出來就是一個接口、一個接口實現類(implements)、一個工廠,具體裡面是如何實現的以及其原理機制我此小輩能講清楚的,我還是有自知知明的,等下甭被我的這點Java皮毛知識給歪曲了那就不好了,不過我看裡面的代碼也很少簡單,要理解起來也不難,反正就創建了這3個類,然後我就需要在DB Brower裡面選擇相應的表Hibernate Reverse Engineering添加對應DAO和Model,Model就是數據庫表對象映射實例,數據庫表的每一列充當Model類的屬性字段,並添加有 get、set規則的屬性訪問器,而DAO類裡面則封裝的是對該表的一些常見的數據訪問操作(insert、delete、update、 select),它有自己的HibernateSQL語句(不是一般的sql語句),這一塊我手動寫得很少,不過和一般的sql語句語法還是很相似,如有按屬性名查詢返回Model強類型化List集合等,除此之外,每添加一個表還會自動添加表名.hbm.xml文件,這個xml文件保存數據庫映射到 Hibernate表字段的具體信息,如主鍵信息、列長度相應的Java類型等,要注意的是在添加的時候它會叫你選擇ID Generator表的信息,這裡常見的是assigned(有表主鍵)和native(自動增長主鍵),因為在呆後創建的時候它會根據你所選擇的信息創建不同的DAO和Model,如在構造函數和一些數據訪問的方法裡面就可能有需要ID主鍵的,而對於自動增長的則無須輸入ID主鍵即可。
你可以對多個可能用的到表執行上述Hibernate Reverse Engineering映射操作,你可以在不寫一局代碼的情況下完成對數據庫的大多數的一般操作在其他地方很方便的調用,我覺得這就是Hibernate 的最大的好處優點;而在.NET中類,相對Hibernate來說我想是一步一個腳印,什麼DAO方法等代碼一行行寫,不過我覺得這樣也沒什麼不好的,我們一般在項目中就用一個SqlHelper類,裡面寫上對數據庫的一些增刪改查方法等。
根據傳來的SQL語句和參數組或存儲過程等動態的返回數據集合(List)或記錄數等,用起來也挺好的,頂多還對不同的實例添加對應的DAL,這些基本上能滿足我們對數據庫的基本操作了。
不過我覺得在Java中這樣實現也可以啊,我以前就在Java裡面寫了一個SqlHelper類代替了Hibernate,用的是JdbcOdbc數據庫連接,感覺也很實用,簡單明了,但是Hibernate在一些性能等方面的優勢我們上不容忽視的。