对“纯手工编写的第一个Hibernate程序”的改进

  1. 云栖社区>
  2. 博客>
  3. 正文

对“纯手工编写的第一个Hibernate程序”的改进

余二五 2017-11-22 13:15:00 浏览530
展开阅读全文

在上一篇博文《纯手工编写第一个Hibernate程序》中,介绍了如何手工编写第一个简单的Hibernate程序。在那个例子中,为了降低程序编写的难度,所有的类都没有包的声明。然而在实际开发中,为了解决命名冲突的问题,通常都把类声明在某个包中。因此,本篇博文就介绍如何在第一个程序例子的基础上,为类添加包声明,并访问上个例子保存的阿汤哥的信息(为方便阅读,所有程序、配置文件中与上个实例中重复的注释都被删除,读者若有不明白之处可参考上篇博文)。<?xml:namespace prefix="o">

 

?xml:namespace>

我们在目录E:\DemoPrograms下新建一个目录ImprovedHibernate,来保存本实例所有的文件。

 

首先来看UserUser.java文件中类。

 


  1. package com.abc.people;  

  2.  

  3. public class User {  

  4.       

  5.     private int id;  

  6.     private String name;  

  7.     private int age;  

  8.     private String gender;  

  9.       

  10.     public int getId() {  

  11.         return id;  

  12.     }  

  13.  

  14.     public void setId(int id) {  

  15.         this.id = id;  

  16.     }  

  17.  

  18.       

  19.     public String getName() {  

  20.         return name;  

  21.     }  

  22.  

  23.     public void setName(String name) {  

  24.         this.name = name;  

  25.     }  

  26.       

  27.     public int getAge() {  

  28.         return age;  

  29.     }  

  30.  

  31.     public void setAge(int age) {  

  32.         this.age = age;  

  33.     }  

  34.  

  35.   public String getGender()  

  36.   {  

  37.      return gender;  

  38.   }  

  39.     

  40.   public void setGender(String gender)  

  41.   {  

  42.      this.gender = gender;  

  43.   }  

  44.       

  45. }  

(User类)

如上述第一行代码所示,我们将User类声明在com.abc.people包中。包的层次结构与目录的层次结构是一一对应的。因此,我们在目录ImprovedHibernate下建立目录结构com\abc\people(如下图所示)。

 

然后将User.java放置到people目录中,编译之。实际上,User.java文件放置在哪里并不重要,重要的是编译后的User.class文件要在正确的位置。经过上述的编译后,就在正确的位置&mdash;&mdash;people目录下&mdash;&mdash;生成了User.class文件。

 

再来看User.hbm.xml映射文件。由于目前User类在包com.abc.people中,因此在hibernate-mapping元素中就用package属性指定了此包名。如下面的第六行所示。


  1. <?xml version="1.0" encoding="gb2312"?> 

  2. <!DOCTYPE hibernate-mapping PUBLIC  

  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

  4.     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

  5.     <!--package指定类的包前缀--> 

  6.     <hibernate-mapping package="com.abc.people"> 

  7.           

  8.     <class name="User" table="users"> 

  9.              

  10.            <id name="id" type="java.lang.Integer" column="ID"> 

  11.               <generator class="identity"/> 

  12.          </id> 

  13.          <property name="age" column="age"/> 

  14.          <property name="name"/> 

  15.          <property name="gender"/> 

  16.     </class> 

  17. </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行所示。 


  1. <?xml version="1.0" encoding="gb2312"?> 

  2.  

  3. <!DOCTYPE hibernate-configuration PUBLIC  

  4.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

  5.         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

  6.  

  7. <hibernate-configuration> 

  8.  

  9.        <session-factory> 

  10.  

  11.         <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 

  12.         <property name="connection.url">jdbc:sqlserver://localhost;databaseName=mydb</property> 

  13.         <property name="connection.username">sa</property> 

  14.         <property name="connection.password">admin123</property> 

  15.         <property name="connection.pool_size">1</property> 

  16.         <property name="dialect">org.hibernate.dialect.SQLServerDialect</property> 

  17.         <property name="current_session_context_class">thread</property> 

  18.         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

  19.         <property name="show_sql">true</property> 

  20.         <!--指定要用到的映射文件,要写出相对于ImprovedHibernate  

  21.         目录的完整路径。--> 

  22.         <mapping resource="com/abc/people/User.hbm.xml" /> 

  23.           

  24.     </session-factory> 

  25.  

  26. </hibernate-configuration> 

hibernate.cfg.xml文件

 

这里需要注意的是,用的是&ldquo;/&rdquo;作为分隔符,而不是Windows风格的&ldquo;\&rdquo;。

接着来修改TestHibernate.java文件。我们把它声明在com.abc包下,并修改此程序的功能为读取第一个hibernate程序中保存的阿汤哥的信息。具体如下所示:


  1. //包声明。  

  2. package com.abc;  

  3.  

  4. import org.hibernate.Session;  

  5. import org.hibernate.SessionFactory;  

  6. import org.hibernate.cfg.Configuration;  

  7. //注意要正确地引入User类。  

  8. import com.abc.people.User;  

  9.  

  10. public class TestHibernate {  

  11.       

  12.     public static void main(String[] args) {  

  13.                   

  14.     Configuration cfg = new Configuration().configure();  

  15.     SessionFactory factory = cfg.buildSessionFactory();  

  16.     Session session = factory.getCurrentSession();  

  17.         session.beginTransaction();  

  18.           

  19.         //从数据库中加载一个User实例。需要两个参数,第一个参数  

  20.         //com.abc.people.User.class是User类的Class(参见Class类  

  21.         //的相关内容)对象。1是这个User实例的标识属性。实际上就  

  22.         //是根据主键从数据库中读取一条记录,然后封装成一个User对象。  

  23.         //是不是比自己写JDBC语句方便、自然多了呢?  

  24.         User user = (User)session.load(com.abc.people.User.class1);  

  25.           

  26.         String name = user.getName();  

  27.         String gender = user.getGender();  

  28.           

  29.         System.out.println("****************");  

  30.         System.out.println("* 姓名:" + name+" *");  

  31.         System.out.println("* 性别:" + gender+"     *");  

  32.         System.out.println("****************");  

  33.           

  34.         session.getTransaction().commit();  

  35.           

  36.         factory.close();  

  37.       

  38.     }     

  39. }  

 (TestHibernate.java文件)

 

相应地,根据其所在包名,此文件应放置在ImprovedHibernate目录下的com\abc目录下。

 

此时若编译TestHibernate.java,则会报一大堆的错误,说XX包不存在,YY符号找不到这是因为我们还没有引入程序要用到的hibernate的JAR包,也没有正确地设置CLASSPATH环境变量。这次要用到的JAR包和上次一样,所以只需简单地把上次用到的lib目录拷贝到ImprovedHibernate下即可。此时,整个实例的目录结构如下图所示:

 

下一步就是应该编写批处理文件setclasspath.bat了。与上篇的批处理文件类似,需要把要用到的JAR包添加到CLASSPATH中。尤为重要的是,不要漏掉了当前目录。此批处理文件的内容如下。 


  1. 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\abccom\abc\people目录都是放置在此目录下的,因此在此目录下执行javacjava命令时,CLASSPATH中的当前目录就是此目录。这样User类等都可以被正确地加载。用如下的命令来编译TestHibernate.java

 

javac com\abc\TestHibernate.java

 

这样在com\abc目录下就生成了TestHibernate.class文件。运行用如下的命令:java com.abc.TestHibernate(写类的全名)。运行前别忘了开启SQL Server服务。我们可以看到在一长串的日志之后,程序运行的结果如下:

成功运行了。

点此处下载本示例的压缩包,或下面的&ldquo;附件下载&rdquo;。若创建了目录E:\DemoPrograms,则直接解压到此目录下,再把所需要的JAR包复制到lib目录中&mdash;&mdash;受上传文件最大尺寸限制,压缩包中没有JAR包&mdash;&mdash;就可以使用了。

(后记:十分感谢博友MJ007关于图片显示问题的提醒。此问题已解决。欢迎各位博友多提建设性建议,谢谢!)










本文转自 NashMaster2011 51CTO博客,原文链接:http://blog.51cto.com/legend2011/747483,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注