第1章 hibernate入门【hibernate部分】

1.为什么要学习hibernate?

根据与JDBC的对比学习,了解到JDBC开发效率低、代码冗余、重复性工作多,而hibernate简化了JDBC 繁琐的编码, JDBC访问数据库的代码做了封装,提高了开发效率。

Hibernate 是一个优秀的Java 持久化层解决方案;是当今主流的对象关系映射(ORM)工具; Hibernate 将数据库的连接信息都存放在配置文件中。

2. Hibernate是什么?

Hibernate是一种ORM工具,是连接java应用程序和关系数据库的中间件,这是对JDBC的封装,主要负责java对象的持久化

3.在哪里会用到hibernate?         

 

4. Hibernate怎么用?

    1). 前期准备?

         a. 下载需要的jar

                 Hibernate 的官方主页是www.hibernate.org

             推荐下载hibernate-distribution-3.3.2.GA-dist.zip

                 详细下载步骤参看《hibernate的下载步骤图.xls

 

            b.  Hibernate包目录结构

       

   c. 部署jar

             hibernate3.jar

                 required 目录下的jar

                 Oracle 数据库驱动jar

 

         d. 编写配置文件、映射文件及POJO类

             配置文件与映射文件的使用要求:会改写源码中提供的配置文件与映射文件。

             可到下面所示结构中去查找文件拷贝到自己的项目中并修改

            1) hibernate-distribution-3.3.2.GA\project\tutorials\web\src\main\resources   

                    

             2….\org\hibernate\tutorial\domain

    

              可以使用提供的模板文件, 自己根据需要对应的做修改即可。

              hibernate.hbm.xml文件

 

  <?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">

<hibernate-configuration>
	<session-factory>
	    <!-- 指定不同类型的数据库  -->
		<property name="dialect">
			org.hibernate.dialect.Oracle9Dialect
		</property>
		 <!-- 数据库连接的url  -->
		<property name="connection.url">
			jdbc:oracle:thin:@localhost:1521:orcl
		</property>
		<!-- 用户名  -->
		<property name="connection.username">test</property>
		<!-- 密码  -->
		<property name="connection.password">test</property>
		<!-- 数据库驱动  -->
		<property name="connection.driver_class">
			oracle.jdbc.driver.OracleDriver
		</property>
		<!-- 在控制台显示操作的sql语句  -->
		<property name="show_sql">true</property>
		<!-- 配置映射文件  -->
		<mapping resource="bean/Person.hbm.xml" />
	</session-factory>
</hibernate-configuration>

   创建POJO   

public class Type implements java.io.Serializable {
	// Fields
	private Integer id = 0;
	private String name = "";
	// Constructors
	public Type() {
	}
        省略 setter和getter
}
 

2). 使用Hibernate实现对数据库增、删、改操作的步骤?         

 

Configuration conf = null;
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
        //1. 读取并解析配置文件
        conf = new Configuration().configure();
        //2. 读取并解析映射信息,创建SessionFactory
        sessionFactory = conf.buildSessionFactory(); 
        //3. 打开Session
        session = sessionFactory.openSession();  
        //4. 开始一个事务(增删改操作必须,查询操作可选)
         tx = session.beginTransaction();  
         //5. 数据库操作
         session.save(user); 
         //6. 提交事务
         tx.commit(); 
} catch (HibernateException e) {
         //6. 回滚事务
         tx.rollback(); 
         e.printStackTrace();
} finally{
         //7. 关闭session, sessionFactory
         session.close();  
         sessionFactory.close();
}

  3). 重要术语的解释

        ORMObject Relational Mapping     对象关系的映射

        POJO:plain ordinary java object     普通的JAVA对象

  4). Hibernate6个核心接口:

     分别为:Configuration、SessionFactorySessionTransactionQueryCriteria

     这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。          下面对这6个核心接口分别加以介绍:

        a) Configuration接口: 

Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中, Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

b) SessionFactory接口: 

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

c) Session接口: 

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时Hibernate的session不同于JSP应用中的HttpSession。这里当用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。

d) Transaction接口:

Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。

e) Query和Criteria接口:

Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。

 5).   根据POJO类和映射文件自动生成数据库表:

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class TestExport {
	public static void main(String[] args) {
		//读取配置文件
		Configuration config = new Configuration().configure();		
		SchemaExport exp = new SchemaExport(config);
		//第一参数为true:就是把DDL语句输出到控制台
		//第二个参数为true:根据持久化类和映射文件先持行删除再执行创建操作
		exp.create(true, true);
	}
}

6). get 和 load 方法的作用:

     Object  get (Class clazz, Serializable id):通过实体类Class对象和ID加载数据

     Object  load(Class clazz, Serializable id):通过实体类Class对象和ID加载数据

7). 使用get和load加载数据的区别?

     当我们使用Session的get方法的时候,如果加载的数据不存在,get方法会返回一个null对象, 但是如果使用的是

     load方法,要加载的数据不存在,系统就会抛出异常,这就是get和load的区别之一。

8). 实体对象的三种状态?

     ①.瞬时状态(Transient)

     ②.刚用new语句创建,还没有被持久化,且不处于Session的缓存中

     ③.持久状态(Persistent)

     ④.已经被持久化,且加入到Session的缓存中

     ⑤.游离状态(Detached)

     ⑥.已经被持久化,但不再处于Session的缓存中

猜你喜欢

转载自yanln.iteye.com/blog/1573352