乐趣区

初识Hibernate

一、什么是 Hibernate?
Hibernate(开放源代码的对象关系映射框架): Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 POJO 与数据库表建立映射关系,是一个全自动的 ORM 框架,hibernate 可以自动生成 SQL 语句,自动执行,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
<!– more –>
二、为什么使用 Hibernate?
2.1 Hibernate 相对于传统 JDBC 的优点

对 JDBC 访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate 是一个基于 JDBC 的主流持久化框架,是一个优秀的 ORM 实现。他很大程度的简化 DAO 层的编码工作。
hibernate 使用 Java 反射机制,而不是字节码增强程序来实现透明性。
hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.2 Hibernate 相对于 MyBatis 的区别与联系
两者区别:

两者联系:
缓存方面
相同点:
Hibernate 和 Mybatis 的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓 存方案,创建适配器来完全覆盖缓存行为。
不同点:
Hibernate 的二级缓存配置在 SessionFactory 生成的配置文件中进行详细配置,然后再在具体的表 - 对象映射中配置是那种缓存。
MyBatis 的二级缓存配置都是在每个具体的表 - 对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且 Mybatis 可以在命名空间中共享相同的缓存配置和实例,通过 Cache-ref 来实现。
三、Hibernate 的使用
准备好 User 实体类和数据库记录
User.java
public class User {
private Integer id;
private String userName;
private String passWord;
//Get、Set 方法,此处省略。
}
mysql 数据库:

3.1 添加 pom 依赖
Hibernate 基础 Maven 依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<!– 添加 hibernate 的依赖 开始 –>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!– http://mvnrepository.com/artifact/org.hibernate/hibernate –>
<!– https://mvnrepository.com/artifact/org.hibernate/hibernate-core –>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.2.Final</version>
</dependency>

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!– <dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.1</version>
</dependency>
&lt;!&ndash; Hibernate library dependecy end &ndash;&gt;
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>–>
<!– 添加 hibernate 的依赖 结束 –>
<!– mysql 数据库的驱动包 –>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
3.2 hibernate.cfg.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=”hibernate.bytecode.use_reflection_optimizer”>false</property>–>
<!– 指定数据库的驱动程序 –>
<property name=”hibernate.connection.driver_class”>com.mysql.jdbc.Driver</property>
<!– 指定连接数据库的口令 –>
<property name=”hibernate.connection.password”>admin</property>
<!– 指定连接数据库的 URL–>
<property name=”hibernate.connection.url”>jdbc:mysql://localhost:3306/Hibernatetraning</property>
<!– 指定连接数据库的用户名 –>
<property name=”hibernate.connection.username”>root</property>
<!– 数据库方言,用于指定使用的 sql 从属于哪个数据库 –>
<property name=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</property>
<!– 如果为 true,表示在程序运行时会在控制台输出 SQL 语句,有利于跟踪 Hibernate 的运行状态,默认为 false。应用开发阶段设置为 true,发布阶段应设置为 false 提高运行性能 –>
<property name=”show_sql”>true</property>
<!– <property name=”hibernate.hbm2ddl.auto”>update</property>–>
<mapping resource=”mapper/User.hbm.xml”></mapping>
</session-factory>
</hibernate-configuration>
3.2 User.hbm.xml 映射文件
<?xml version=”1.0″ encoding=”utf-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 4.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>

<hibernate-mapping>
<class name=”com.entity.User” table=”tbl_user”>
<!– 在 User 里面 id 的 set 和 get 方法里 也要设置为 Integer 类型的,不然会报错 –>
<id name=”id” column=”id” type=”java.lang.Integer”>
<generator class=”assigned”/>
</id>
<property name=”userName” column=”username” type=”java.lang.String” length=”20″ />
<property name=”passWord” column=”password” type=”java.lang.String” length=”20″/>

</class>
</hibernate-mapping>
测试
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();

// 测试 session 是否创建,以及是否可以从 user 映射的表里获取记录
Session session = sessionFactory.openSession();
//System.out.println(“session==”+session);
User user = (User)session.get(User.class,1);
System.out.println(user);
// 关闭会话工厂,项目自动停止。生产环境中千万不要写这句。
//sessionFactory.close();
控制台输出:User{id=1, userName=’Jack’, passWord=’123′}
四、Hibernate 基本概念
Hibernate 是自动化程度更高 ORM(Object-Relational Mapping)框架,不是面向 SQL 的持久层框架,以更加 OO 方式来编写数据读写代码。

4.1 对象与关系型数据库

注意:一定要清楚当前操作的东西,是属于对象层面的还是关系型数据库层面的,解决异常也是如此。

Hibernate 中的对象有 3 中状态, 瞬时对象 (Transient Objects)、持久化对象(Persistent Objects) 和离线对象(Detached Objects 也叫做脱管对象)。
4.2 HibernateUtils.java 工具类
public class HibernateUtils {

private static SessionFactory sessionFactory = null;

static {
try {
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}catch (HibernateException e){
System.out.println(“SessionFactory 初始化失败 ”);
e.printStackTrace();
}
}

public static SessionFactory getSessionFactory() throws Exception{
if (sessionFactory != null){
return sessionFactory;
}else {
throw new Exception(“sessionFactory 为空,请检查配置文件 ”);
}
}

public static Session getSession(){
Session session = null;
try {
if (sessionFactory != null){
session = sessionFactory.openSession();
}
}catch (HibernateException e){
e.printStackTrace();
}
return session;
}

public static void closeSession(Session session){
try {
if (session != null && session.isOpen()){
session.close();
}
}catch (HibernateException e){
e.printStackTrace();
}
}
}
4.3 瞬时对象与持久化对象
测试代码:
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();

User user1 = new User();
user1.setId(2);
user1.setUserName(“Frank”);
user1.setPassWord(“111″);
// 当前 user1 在数据库中没有记录进行关联,所有此时 user1 是瞬时对象。

// 将 user1 持久化
session.save(user1);
tx.commit();

User user2 = (User)session.get(User.class, 2);
System.out.println(user2);
// 当前 user2 在数据库有唯一一条记录对应,所有此时 user2 是持久化对象。
4.4 hibernate.hbm2ddl.auto
hibernate.hbm2ddl.auto 属性值(从类自动生成数据库 DDL 操作)
<property name=”hibernate.hbm2ddl.auto”>update</property>

create:如果设置为该值,则每次加载 hibernate 时(准确说应是创建 SessionFactory 时)都会删除以前创建的表而根据 model 重新生成表,即使前后的表没有任何变化,通常会造成数据库数据丢失,需谨慎使用这个取值。
create-drop:与 create 差不多,所不同的是每次 sessionFactory 关闭时,就会删除所有表。
update(最常用):这个取值比较常用,需要先建立数据库,在第一次加载 hibernate 时会自动创建表,以后创建 hibernate 会自动根据 model 更新表结构,即使表结构改变了,以前的行不会被删除。

validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

退出移动版