Hibernate的入门知识
一,hibernate概述
Hibernate 是由JBoss公司著名构架师Gavin King设计,开发的一个开源ORM框架,可以从不同的角度解析Hibernate。
1. 它是连接java应用程序和关系数据库的中间件
2. 它对JDBC API进行了封装,负责Java对象的持久化
3. 在分层的软件架构中它位于持久化层,封装了所有数据访问细节,使业务逻辑层专注于实现业务逻辑。
4. 它是一种ORM工具,能够建立面向对象的域模型和关系模型的映射。
二.搭建Hibernate应用开发环境
1)下载和安装配置
第一步:下载。登录到Hibernate官方网站http://www.hibernate.org/6.html,下载
第二步:解压获取必需类库文件。解压缩丛Hibernate网站下载的hibernate发布包,在根目录下有Hibernate3.jar文件,该文件就是Hibernate Core的核心类库文件,把它添加到Hibernate应程序中,在根目录lib/required目录下的所有jar文件都是Hibernate3核心类库文件编译和运行所必须的第三方类库文件,也添加到Hibernate应用程序中。如图所示所需的包
三.第一个Hibernate应用程序
我们所做的第一件事就是创建我们的开发目录,并把所需要的java库文件放进去。解压缩丛Hibernate网站下载的Hibernate发布包,并把/lib目录下所有需要的库文件拷到我们新建的开发目录下的/lib目录下。
1) 第一个class
我们的第一个持久化类是一个带有一些属性(property)的简单
1.JavaBean类:
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定。同时把类属性的访问级别设为私有的(private),这是推荐的设计,但并不是必须的。Hibernate也可以直接访问这些属性,而使用访问方法的好处是提供了重构时的健壮,为了通过反射机制来实例化这个类的对象,我们需要提供一个无参的构造器。
所有的持久化类都要求有无参的构造器,因为Hibernate必须使用java反射机制来为你创建对象。构造器的访问级别可以是Private,然而当生成运行时代理时这则要求使用至少package级别的访问控制,这样在没有字节码的指令的情况下,从持久化类里获取数据会更有效率
2.映射文件:
Hibernate需要知道怎样去加载和存储持久化的对象。这正是hibernate映射文件发挥作用的地方,映射文件告诉Hibernate,应该访问数据库里面的哪一个表及应该使用表里面的那些字段。
一起看一下映射文件的基本结构:
|
在hibernate-mapping标签之间,含有一个class元素,所有的持久化实体类(再次声明,或许接下来会有依赖类,就是那些次要实体)都需要一个这样的映射,来把类对象映射到sql数据库里的表
User类对应的映射文件
|
id元素标识符属性的声明,name=”id”声明了java属性的名字(hibernate会使用getId()和SetId()来访为它),column属性则告诉Hibernate,我们使用User表的哪一个字段作为主键,嵌套的generator元素指定了标识符生成策略,在这里我们指定为native。它根据已配置的数据库自动选择最佳的标识符生成策略。
和id元素一样,property元素的name属性告诉hibernate使用哪个getter和setter方法,在此类之中会寻找getName(),getBrithday()
3.Hibernate配置
现在我们已经有了一个持久化类和它的映射文件,该是配置Hibernate的时候了。为了保存Hibernate的配置,我们可以使用一个简单的Hibernate.properties文件,或者一个稍微复杂的Hibernate.cfg.xml。
|
最开始的四个Property元素包含JDBC链接信息。方言(dialect)的property元素指明Hibernate生成的特定SQL变量。
把这个文件拷贝到源代码目录下面,这样他就位于classpath的根目录的最后。Hibernate在启动时会在classpath的根目录查找名为hibernate.cfg.xml的配置文件。
Hibernate.show-sql:指定是否把hibernate运行时的sql语句输出到控制台。
Hibernate.format_sql:指定是否把hibernate运行时的sql语进行格式化以便于阅读。
Hibernate.Hbm2ddl.auto:指定应用程序在运行时,当产生SessionFactory实例时对是否自动检查数据库结构,可选值有:vaildate(检查数据库结构),update(数据库结构发生变化是修改),create(将数据库的DDL导出到数据库)和crete-drop(SessionFactory实例创建时将数据库schema的DDL导入到数据库,在sessionFactory被显示关闭时将数据库自动删除)
启动和辅助类
是时候加载和储存一些Event对象了,但首先我们得编写一些基础的代码以完成设置。此过程包括创建一个全局sessionFactory,并把它储存在应用程序代码容易访问的地方。SessionFactory可以创建打开新的session,一个session代表一个单线程的单元操作,sessionFactory则是一个线程安全的全局对象,只需要被实例化一次。
我们将创建一个HibernateUtil辅助类来负责启动Hibernate和更方便的操作SessionFactory,让我们来看一下他的实现吧!
把HibernateUtil.java 放在开发目录的源代码路径下,与方User的包并列。
4.加载并存储对象
我们终于可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的TestHibernate类
|
我们创建了个新的User对象并把它传递给Hibernate。现在Hibernate负责与SQL打交道并把INSERT命令传给数据库。在运行之前,让那个我们来看一下处理session和Transaction的代码。
首先,只要你持有SessionFactory(幸亏我们有HIbernateUtil,可以随时获取得到),大可在任何时候,任何地点调用这个方法
其次,session在第一次被使用的时候,其生命周期就开始。然后它被Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate会自动把Session从当前线程剥离,并且关闭它。