Hibernate 架构解析

09/01/2010

1.Hibernate是一个优秀的 Java 持久化层解决方案,是当今主流的 对象-关系 映射工具。
2.什么是 持久化?
JDBC就是一种持久化机制。将程序数据直接保存成文本文件也是持久化机制的一种实现。但我们常用的是将程序数据保存到数据库中。
在 MVC 三层结构中,DAO层(数据访问层)有时候也成为持久化层。

[singlepic id=80 w=320 h=240 float=none]
3.什么是 对象-关系 映射?
我们多以面向对象的方式组织程序,瞬时的数据也多以对象的形式存在,而持久的数据多保存在关系型数据库中。所以,在通常的情况下,持久化将要完成的操作就是把对象保存到关系型数据库中,或者把关系型数据库中的数据读取出来以对象的形式封装。
基于以上所述:我们的持久化工作主要在 O(Object) – R(Relational Database) 之间完成。
Hibernate 就是在 JDBC 的方式上进行封装,以简化 JDBC 方式繁琐的编码工作。是一个轻量级的优秀的 ORM 实现。它能很大程度地简化 DAO 层的编码工作。
[singlepic id=81 w=320 h=240 float=none]
4.使用 Hibernate 的基本步骤
Hibernate 的使用主要有 “3个准备,7个步骤”

  • 准备1:导入需要的 jar 包
    1. http://www.hibernate.org 下载
    2. MyEclipse 集成了对 Hibernate 的支持,可以直接引用
  • 准备2:添加配置文件 — hibernate.cfg.xml
  • <session-factory>
    		<!-- 配置数据库连接 -->
    		<property name="connection.url">
    			jdbc:mysql://localhost:3306/users
    		</property>
    		<property name="connection.username">root</property>
    		<property name="connection.password">1111</property>
    		<property name="connection.driver_class">
    			com.mysql.jdbc.Driver
    		</property>
    
    		<!-- 数据库'方言'支持数据库的种类 -->
    		<property name="dialect">
    			org.hibernate.dialect.MySQLDialect
    		</property>
    
    		<!-- 属性:运行时后台显示SQL语句 -->
    		<property name="show_sql">true</property>
    
    		<!-- ORM 映射文件 配置 -->
    		<mapping resource="cn/net/royakon/entity/User.hbm.xml" />
    </session-factory>
  • 准备3:添加实体类和映射文件
    1. 实体类注意事项:
      实现 implements java.io.Serializalbe 接口
      添加默认构造方法
    2. package cn.net.royakon.entity;
      
      public class User implements java.io.Serializable {
      
      	private Integer userId;
      	private String userName;
      	private String userPass;
      
      	public User() {
      	}
      
      	public User(Integer userId) {
      		this.userId = userId;
      	}
      
      	public User(Integer userId, String userName, String userPass) {
      		this.userId = userId;
      		this.userName = userName;
      		this.userPass = userPass;
      	}
      
      	public Integer getUserId() {
      		return this.userId;
      	}
      
      	public void setUserId(Integer userId) {
      		this.userId = userId;
      	}
      
      	public String getUserName() {
      		return this.userName;
      	}
      
      	public void setUserName(String userName) {
      		this.userName = userName;
      	}
      
      	public String getUserPass() {
      		return this.userPass;
      	}
      
      	public void setUserPass(String userPass) {
      		this.userPass = userPass;
      	}
      
      }
    3. 添加 User.hbm.xml 映射文件
    4. <hibernate-mapping>
      	<!-- 实体类-数据库表 的映射 -->
          <class name="cn.net.royakon.entity.User" table="user" catalog="users">
          	<!-- 主键 映射 -->
              <id name="userId" type="java.lang.Integer">
                  <column name="userId" />
                  <!-- 主键生成方式  identity-自动生成 assigned-程序中指定 根据数据库不同参数有可能不同 -->
                  <generator class="identity" />
              </id>
              <!-- 属性-字段 映射 -->
              <property name="userName" type="java.lang.String">
                  <column name="userName" length="50" />
              </property>
              <property name="userPass" type="java.lang.String">
                  <column name="userPass" length="50" />
              </property>
          </class>
      </hibernate-mapping>
  • ‘7个步骤’来使用 Hibernate
    [singlepic id=82 w=320 h=240 float=none]
  • 	try {
    		//步骤1.读取配置文件
    		Configuration cfg=new Configuration().configure();
    		//步骤2.创建 SessionFactory 
    		SessionFactory sf=cfg.buildSessionFactory();
    		//步骤3.打开 Session
    		Session s=sf.openSession();
    		//步骤4.开始一个事务
    		Transaction t=s.beginTransaction();
    		//步骤5.持久化操作
    		User user=new User();
    		user.setUserName("Test");
    		user.setUserPass("Test");
    		s.save(user);
    		//步骤6.提交事务
    		t.commit();
    	} catch (Exception e) {
    		if (null!=t){t.rollback();}
    		e.printStackTrace();      
        } finally {
        	// 7、关闭Session
    		s.close();
        }

5. Hibernate 实现 数据操作

  1. 根据主键查询
  2. User user = (User)session.get(User.class,id);
  3. 更新数据
  4. User user = this.get(59);
    user.setUserName("new Name");
    session.update(user);
  5. 删除数据
  6. User user = this.(59);
    session.delete(user);