对“纯手工编写的第一个Hibernate程序”的改进
在上一篇博文《純手工編寫第一個Hibernate程序》中,介紹了如何手工編寫第一個簡單的Hibernate程序。在那個例子中,為了降低程序編寫的難度,所有的類都沒有包的聲明。然而在實際開發中,為了解決命名沖突的問題,通常都把類聲明在某個包中。因此,本篇博文就介紹如何在第一個程序例子的基礎上,為類添加包聲明,并訪問上個例子保存的阿湯哥的信息(為方便閱讀,所有程序、配置文件中與上個實例中重復的注釋都被刪除,讀者若有不明白之處可參考上篇博文)。<?xml:namespace prefix="o">
?
?xml:namespace>
我們在目錄E:\DemoPrograms下新建一個目錄ImprovedHibernate,來保存本實例所有的文件。
?
首先來看User(User.java文件中)類。
?
package?com.abc.people; ?
?
public?class?User?{ ?
???? ?
????private?int?id; ?
????private?String?name; ?
????private?int?age; ?
????private?String?gender; ?
???? ?
????public?int?getId()?{ ?
????????return?id; ?
????} ?
?
????public?void?setId(int?id)?{ ?
????????this.id?=?id; ?
????} ?
?
???? ?
????public?String?getName()?{ ?
????????return?name; ?
????} ?
?
????public?void?setName(String?name)?{ ?
????????this.name?=?name; ?
????} ?
???? ?
????public?int?getAge()?{ ?
????????return?age; ?
????} ?
?
????public?void?setAge(int?age)?{ ?
????????this.age?=?age; ?
????} ?
?
??public?String?getGender() ?
??{ ?
?????return?gender; ?
??} ?
?? ?
??public?void?setGender(String?gender) ?
??{ ?
?????this.gender?=?gender; ?
??} ?
???? ?
} ?
(User類)
如上述第一行代碼所示,我們將User類聲明在com.abc.people包中。包的層次結構與目錄的層次結構是一一對應的。因此,我們在目錄ImprovedHibernate下建立目錄結構com\abc\people(如下圖所示)。
?
然后將User.java放置到people目錄中,編譯之。實際上,User.java文件放置在哪里并不重要,重要的是編譯后的User.class文件要在正確的位置。經過上述的編譯后,就在正確的位置——people目錄下——生成了User.class文件。
?
再來看User.hbm.xml映射文件。由于目前User類在包com.abc.people中,因此在hibernate-mapping元素中就用package屬性指定了此包名。如下面的第六行所示。
<?xml?version="1.0"?encoding="gb2312"?>?
<!DOCTYPE?hibernate-mapping?PUBLIC ?
????"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN" ?
????"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">?
????<!--package指定類的包前綴-->?
????<hibernate-mapping?package="com.abc.people">?
???????? ?
????<class?name="User"?table="users">?
??????????? ?
???????????<id?name="id"?type="java.lang.Integer"?column="ID">?
??????????????<generator?class="identity"/>?
?????????</id>?
?????????<property?name="age"?column="age"/>?
?????????<property?name="name"/>?
?????????<property?name="gender"/>?
????</class>?
</hibernate-mapping>?
(User.hbm.xml文件)
?
此文件應與User.java文件放置在同一目錄下(更準確地講,是應該與User.class放置在同一目錄下),即ImprovedHibernate下的com\abc\people目錄下。
?
接著來看配置文件hibernate.cfg.xml。由于映射文件User.hbm.xml放置在了目錄com\abc\people中,因此需要修改resource的值。如下面的20至22行所示。?
<?xml?version="1.0"?encoding="gb2312"?>?
?
<!DOCTYPE?hibernate-configuration?PUBLIC ?
????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN" ?
????????"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">?
?
<hibernate-configuration>?
?
???????<session-factory>?
?
????????<property?name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>?
????????<property?name="connection.url">jdbc:sqlserver://localhost;databaseName=mydb</property>?
????????<property?name="connection.username">sa</property>?
????????<property?name="connection.password">admin123</property>?
????????<property?name="connection.pool_size">1</property>?
????????<property?name="dialect">org.hibernate.dialect.SQLServerDialect</property>?
????????<property?name="current_session_context_class">thread</property>?
????????<property?name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>?
????????<property?name="show_sql">true</property>?
????????<!--指定要用到的映射文件,要寫出相對于ImprovedHibernate ?
????????目錄的完整路徑。-->?
????????<mapping?resource="com/abc/people/User.hbm.xml"?/>?
???????? ?
????</session-factory>?
?
</hibernate-configuration>?
hibernate.cfg.xml文件
?
這里需要注意的是,用的是“/”作為分隔符,而不是Windows風格的“\”。
接著來修改TestHibernate.java文件。我們把它聲明在com.abc包下,并修改此程序的功能為讀取第一個hibernate程序中保存的阿湯哥的信息。具體如下所示:
//包聲明。 ?
package?com.abc; ?
?
import?org.hibernate.Session; ?
import?org.hibernate.SessionFactory; ?
import?org.hibernate.cfg.Configuration; ?
//注意要正確地引入User類。 ?
import?com.abc.people.User; ?
?
public?class?TestHibernate?{ ?
???? ?
????public?static?void?main(String[]?args)?{ ?
???????????????? ?
????Configuration?cfg?=?new?Configuration().configure(); ?
????SessionFactory?factory?=?cfg.buildSessionFactory(); ?
????Session?session?=?factory.getCurrentSession(); ?
????????session.beginTransaction(); ?
???????? ?
????????//從數據庫中加載一個User實例。需要兩個參數,第一個參數 ?
????????//com.abc.people.User.class是User類的Class(參見Class類 ?
????????//的相關內容)對象。1是這個User實例的標識屬性。實際上就 ?
????????//是根據主鍵從數據庫中讀取一條記錄,然后封裝成一個User對象。 ?
????????//是不是比自己寫JDBC語句方便、自然多了呢? ?
????????User?user?=?(User)session.load(com.abc.people.User.class,?1); ?
???????? ?
????????String?name?=?user.getName(); ?
????????String?gender?=?user.getGender(); ?
???????? ?
????????System.out.println("****************"); ?
????????System.out.println("*?姓名:"?+?name+"?*"); ?
????????System.out.println("*?性別:"?+?gender+"?????*"); ?
????????System.out.println("****************"); ?
???????? ?
????????session.getTransaction().commit(); ?
???????? ?
????????factory.close(); ?
???? ?
????}??? ?
} ?
?(TestHibernate.java文件)
?
相應地,根據其所在包名,此文件應放置在ImprovedHibernate目錄下的com\abc目錄下。
?
此時若編譯TestHibernate.java,則會報一大堆的錯誤,說XX包不存在,YY符號找不到。這是因為我們還沒有引入程序要用到的hibernate的JAR包,也沒有正確地設置CLASSPATH環境變量。這次要用到的JAR包和上次一樣,所以只需簡單地把上次用到的lib目錄拷貝到ImprovedHibernate下即可。此時,整個實例的目錄結構如下圖所示:
?
下一步就是應該編寫批處理文件setclasspath.bat了。與上篇的批處理文件類似,需要把要用到的JAR包添加到CLASSPATH中。尤為重要的是,不要漏掉了當前目錄。此批處理文件的內容如下。?
set?classpath=.;E:\DemoPrograms\ImprovedHibernate\lib\hibernate3.jar;E:\DemoPrograms\ImprovedHibernate\lib\sqljdbc4.jar;E:\DemoPrograms\ImprovedHibernate\lib\dom4j-1.6.1.jar;E:\DemoPrograms\ImprovedHibernate\lib\slf4j-api-1.6.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\slf4j-simple-1.6.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\hibernate-jpa-2.0-api-1.0.1.Final.jar;E:\DemoPrograms\ImprovedHibernate\lib\cglib-2.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\commons-collections-3.1.jar;E:\DemoPrograms\ImprovedHibernate\lib\javassist-3.12.0.GA.jar;E:\DemoPrograms\ImprovedHibernate\lib\jta-1.1.jar?
(批處理文件setclasspath.bat)
?
注意:上述set命令是一個完整的DOS命令,不要隨便加回車鍵,否則會報錯。
在命令行窗口中把目錄切換到ImprovedHibernate下,運行此批處理文件。由于前面的com\abc和com\abc\people目錄都是放置在此目錄下的,因此在此目錄下執行javac和java命令時,CLASSPATH中的當前目錄就是此目錄。這樣User類等都可以被正確地加載。用如下的命令來編譯TestHibernate.java。
?
javac?com\abc\TestHibernate.java
?
這樣在com\abc目錄下就生成了TestHibernate.class文件。運行用如下的命令:java?com.abc.TestHibernate(寫類的全名)。運行前別忘了開啟SQL?Server服務。我們可以看到在一長串的日志之后,程序運行的結果如下:
成功運行了。
(點此處下載本示例的壓縮包,或下面的“附件下載”。若創建了目錄E:\DemoPrograms,則直接解壓到此目錄下,再把所需要的JAR包復制到lib目錄中——受上傳文件最大尺寸限制,壓縮包中沒有JAR包——就可以使用了。)
(后記:十分感謝博友MJ007關于圖片顯示問題的提醒。此問題已解決。歡迎各位博友多提建設性建議,謝謝!)
?????? 猛戳這里全面系統地學習MyBatis 3
轉載于:https://blog.51cto.com/legend2011/747483
總結
以上是生活随笔為你收集整理的对“纯手工编写的第一个Hibernate程序”的改进的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: WYSE率先支持RemoteFX功能
- 下一篇: linux 查看文件夹大小 du命令
