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). 重要术语的解释
ORM:Object Relational Mapping 对象关系的映射
POJO:plain ordinary java object 普通的JAVA对象
4). Hibernate的6个核心接口:
分别为:Configuration、SessionFactory、Session、Transaction、Query、Criteria。
这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的缓存中