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类:
public class User {
private int id;
private Name name;
private Date brithday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Date getBrithday() {
return brithday;
}
public void setBrithday(Date brithday) {
this.brithday = brithday;
}
}
你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定。同时把类属性的访问级别设为私有的(private),这是推荐的设计,但并不是必须的。Hibernate也可以直接访问这些属性,而使用访问方法的好处是提供了重构时的健壮,为了通过反射机制来实例化这个类的对象,我们需要提供一个无参的构造器。
所有的持久化类都要求有无参的构造器,因为Hibernate必须使用java反射机制来为你创建对象。构造器的访问级别可以是Private,然而当生成运行时代理时这则要求使用至少package级别的访问控制,这样在没有字节码的指令的情况下,从持久化类里获取数据会更有效率
2.映射文件:
Hibernate需要知道怎样去加载和存储持久化的对象。这正是hibernate映射文件发挥作用的地方,映射文件告诉Hibernate,应该访问数据库里面的哪一个表及应该使用表里面的那些字段。
一起看一下映射文件的基本结构:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
[....]
</hibernate-mapping>
在hibernate-mapping标签之间,含有一个class元素,所有的持久化实体类(再次声明,或许接下来会有依赖类,就是那些次要实体)都需要一个这样的映射,来把类对象映射到sql数据库里的表
User类对应的映射文件
<hibernate-mapping
package="com.hbsi.domain">--指定java实体类的包名
<class name="User" table="user">---说明实体类怎样映射成表
<id name="id" column="id">--column可省略
<generator class="native"/>--声明主键
</id>
<property name="name"/>
<property name="brithday"/>
</class>
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。
<!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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///demo</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/hbsi/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
最开始的四个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,让我们来看一下他的实现吧!
package com.hbsi.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public final class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil(){
}
static{
//第一步:读取配置文件并启动hibernate
Configuration cfg=new Configuration();
cfg.configure();
//第二步:获取会话工厂
sessionFactory=cfg.buildSessionFactory();}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();
}
}
把HibernateUtil.java 放在开发目录的源代码路径下,与方User的包并列。
4.加载并存储对象
我们终于可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的TestHibernate类
public class TestHibernate {
public static void main(String[] args) {
User user=new User();
user.setName("Tom");
user.setBrithday(new Date());
addUser(user);
}
public static void addUser1(User user){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
session.save(user);
tx.commit();
}finally{
if(session!=null)
session.close();
}
}
}
我们创建了个新的User对象并把它传递给Hibernate。现在Hibernate负责与SQL打交道并把INSERT命令传给数据库。在运行之前,让那个我们来看一下处理session和Transaction的代码。
首先,只要你持有SessionFactory(幸亏我们有HIbernateUtil,可以随时获取得到),大可在任何时候,任何地点调用这个方法
其次,session在第一次被使用的时候,其生命周期就开始。然后它被Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate会自动把Session从当前线程剥离,并且关闭它。