首页 >> 文档 >> JSP专题

Hibernate入门教程+实例代码

发布日期:2008-06-14最近更新:2008-06-14来源:BHCODE作者:
1:什么是Hibernate
       说简单点就是对JDBC的封装。我们知道,我们常用的数据库都是关系型的,而我们的编程思维是OO(面向对象)的,而Hibernate就是想使用面向对象的思想来操作数据库。看来,Hibernate也不是非常神秘,只是一个工具。我们最需要适应的是编程思维的改变。
提醒:有些程序是以数据为中心的,把大量的商业逻辑写在存储过程里面,这样的程序就不适合使用Hibernate了,当然,这不是说Hibernate不能调用存储过程,只能说这样做将可能不是最好的解决之道!虽是如此,但是Hibernate号称对于开发人员在通常的数据持久化(长久保存数据)的相关任务中,节省95%的代码量。当然,对于任何一种新技术,你都需要时间来学习,最后的取舍还是你自己做判断吧,我这里可不是要推销Hibernate(因为我是靠兴趣写这个,除了希望我的Blog可以有更多的点击量外没有其他奢求了)
目前,阿佛使用MyEclipse版本是6.0.1GA,里面有自带Hibernate的入门教程,单击菜单栏的Help-Welcome,就会显示很多教程的页面,
Working with MyEclipse Hibernate Tools
Learn how to use Hibernate to generate object-relational mappings.
教程详细介绍了利用MyEclipse的Hibernate工具创建一个简单的读取表程序的操作。哦,差点忘了说,那个是英文版本的。上述的那个教程,太工具化了,更适合实际开发的需要,而不大适合学习的需要,因为你最好要了解Hibernate的机制。
所以,我还是推荐初学者详细看看Hibernate reference,目前有中文版的(满江红团队翻译的,baidu迅雷,应该不难找到)。
 
2:需要准备什么?
 
1.首先,你需要一定的Java和SQL知识(废话)。
 
2.JDK1.4或者5.0(建议你直接安装我推荐的MyEclipse 6.0.1GA,这样更方便操作后面的HSQL数据库)
 
3.使用的数据库是HSQL DB,一个驻留内存的java开源数据库,也许你还没有听说过这种数据库,完全不必担心,非常简单,下面我会介绍的。可以通过下面的链接下载:
http://nchc.dl.sourceforge.net/sourceforge/hsqldb/hsqldb_1_8_0_9.zip
如果不能下载,建议你google一下 hsqldb download(感觉baidu搜索到的技术资料是有限的,这时google确实帮了大忙,同时感谢我的高中校长卓全汉挽救了我们全班的英语)
 
4.还有最重要的Hibernate包,这个也是很容易搜到的。我不提供链接了,大家要学会自己动手找。如果你有安装我目前使用的MyEclipse版本6.0.1GA,按照我上面所说的官方教程的操作,就可以看到那些包自动添加到当前项目,你可以拷贝所有包到你的其他需要的项目lib下面就可以了。
 
3.1:开始了,编写一个持久化类先
首先,编写一个简单的JavaBean类 Event.java
//本类放置在src目录下的events包中,请你先新建这个包
package events;
//定义一个带有几个属性的简单Javabean类
import java.util.Date;
 
publicclass Event {
    private Long id;//用来对应数据库表中的id主键
   
    private String title;//头衔
    private Date date;//日期
   
    //Hibernate的运行机制要求有这个无参的构造函数,
    //因为它需要通过反射机制来实例化这个类的对象
    public Event()
    {
      
    }
//大家注意:下面的存取方法采用标准JavaBean的命名规范
    public Long getId()
    {
       returnid;
    }
   
/*这里为什么使用private?
 * 很多程序需要标识符来区别对象,这个容易理解,就像web程序中,
 *document.getElementById("id1"),就是通过id标识符来定位对象的。
 *所以,这里使用private限制我们手动操作这个id,让Hibernate来维护,
 *它会为对象分配的。
*/
    privatevoid setId(Long id)
    {
       this.id=id;
    }
   
    public Date getDate()
    {
       returndate;
    }
   
    publicvoid setDate(Date date)
    {
       this.date=date;
    }
   
    public String getTitle()
    {
       returntitle;
    }
   
    publicvoid setTitle(String title)
    {
       this.title=title;
    }
}
3.2 映射文件
       接下来要编写一个 映射文件,其实就是一个xml配置文件,它告诉Hibernate如何去加载和存储持久化类对象。说白了,就是该如何访问数据库里的表字段
 
       接下来的事情,你可能觉得有点麻烦,不过请不要这么想;刚开始学习基本知识时应该虚心一点,以后应用自如后,只要轻点几下鼠标就帮你自动生成了,不过现在还是老老实实的用手敲吧(可能你也喜欢crtl+C ,V 可惜这样不好记住,如果你可以的话,你真是天才,务必告诉我)!
 
       现在,开始动手吧。把文件新建在刚才那个JavaBean的包下,文件名为:Event.hbm
(如果使用MyEclipse可以通过向导来新建,这样可以生成一些基本框架),新建的文件如下:
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
    <id name="id" column="EVENT_ID">
       <generator class="native"></generator>
    </id>
    <property name="date" type="timestamp" column="EVENT_DATE"></property>
    <property name="title"></property>
</class>
</hibernate-mapping>
 
现在简要解释一下:这个xml的作用就是映射(还记得高中的函数映射这个概念吗?其实和这里很相似),要把我们刚才写的那个类映射到SQL数据库里的表(关于表后面会介绍,一步一步来,别着急)。现在应该明白了这是一个Hibernate映射文件,自然外围的根节点 就是
<hibernate-mapping> </hibernate-mapping>
 
接下来看看这个
<class name="events.Event" table="EVENTS">
 
看到这个 events.Event 应该有点印象吧,不就是我们刚才新建的类吗?自然后面的table(表)就是我们要利用这个类来操作的表EVENTS。
 
映射完表,当然就是映射表中字段啦,刚才新建的类就三个字段,可以猜到操作的表要提供这三个字段(这里我们为方便演示倒过来了,本来应该先有表的,你可以通过MyEclipes里的DB Browser新建一个HSQL数据库连接,然后建表)
 
<id name="id" column="EVENT_ID">
       <generator class="native"></generator>
</id>
 
这里的id是标识符属性的声明,而name=”id”,声明了Java类属性的名称,这样Hibernate才会使用getId()和setId来访问。Column属性指定了Events的主键字段。
<generator class="native"></generator>这个你可以先不必太在意,它根据不同的数据库自动选择最好的标识符生成策略。
 
<property name="date" type="timestamp" column="EVENT_DATE"></property>
 
这里的type指定Hibernate的映射类型,这样做的原因是Hibernate必须把java类型转换成数据库类型,而它又无法知道上面的类定义中的属性date应该映射成SQL中的date、timestamp还是time
 
<property name="title"></property>
</class>
你应该注意到了title没有指定type,因为Hibernate利用java的反射机制来自动判断你所期待的值。
 
3.3  HSQL DB数据库
 
    请将你下载的hsqldb.jar包放在lib文件夹下,通过开始-运行
java -classpath lib/hsqldb.jar org.hsqldb.Server就可以启动那个数据库,注意,运行这个命令之前,你要保证在你的项目根目录下运行。要是每次都要运行这个,这样很麻烦,所以我把这条命令写到批处理里面。打开一个记事本,把java -classpath lib/hsqldb.jar org.hsqldb.Server拷贝进去,然后另存到项目路径下所有文件,随便命名成***.bat,建个快捷方式,以后只要双击就可以了。
 
3.4 配置Hibernate
 
前面配置了映射,这里剩下配置Hibernate,让它知道如何才能访问数据库。它是连接数据库和程序的中间层。
 
结果如下 hibernate.cfg.xml:(src根目录下)
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
 
    <session-factory>
   
    <!--Database connection settings -->
    <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
    <property name="connection.url">jdbc:hsqldb:.</property>
    <property name="connection.username">sa</property>
    <property name="connection.password"></property>
   
    <!-- JDBC 连接池 -->  
    <property name="connection.pool_size">1</property>  
      
    <!-- SQL 方言,适应不同数据库的需要 -->
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
 
    <!--数据库连接配置 -->
    <property name="myeclipse.connection.profile">HibernateHsqldb</property>
    <!—启动时自动重建数据库模式-->
    <property name="hbm2ddl.auto">create</property>
    <property name="max_fetch_depth">1</property>
    <!—输出sql脚本-->
    <property name="show_sql">true</property>
   
   <mapping resource="Event.hbm.xml" />
 
    </session-factory>
 
</hibernate-configuration>
 
这里连接池配置和JDBC中遇到差不多,就不多做介绍了。这边的内容比较多,对初学者可能有一定困难,所以如果你有我刚才反复提及的6.0.1GA版本的话就容易多了,它提供Hibernate Configuration配置的可视化设计功能。上面的属性比较多,如果想详细知道的话,请搜索一下,这里不介绍了。
 .........还有一大推DAO操作这里不废话了,可以参考下面推荐的教程哦。
写了这么多还真是累,原本一直看E文的资料,其实有很好的中文资料,夏昕的《深入浅出Hibernate》网上也可以下载到。
觉得大家还是看那个比较好(上面的所有过程都可以通过工具生成,自己写实在效率低下,但是对于追求原理的朋友还是需要的,所以我这里给的例子是我项目中自己用的,大家如果有什么问题可以留言),最后给出页面最终代码(这不是上面建立的表,但也类似)
<%
try
{
FloorModelDAO fmDAO=new FloorModelDAO();
FloorModel fm=fmDAO.findById(1);
if(fm!=null)
{
    out.print(fm.getFloorCode());
}
else
{
    out.print("数据未找到!");
}
}
catch(HibernateException e)
{
    e.printStackTrace();
    //Assert.
}
%>
本周推荐
MORE
热点关注
MORE