Hibernate 框架简介

什么是Hibernate

Hibernate 是一个 Java 领域的持久化框架,是一个ORM框架。

1. 对象的持久化

  • 狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
  • 广义的理解,“持久化”包括和数据库相关的各种操作:
    保存:把对象永久保存到数据库中。
    更新:更新数据库中对象(记录)的状态。
    删除:从数据库中删除一个对象。
    查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
    加载:根据特定的OID,把一个对象从数据库加载到内存中。OID:为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID).

2. ORM(Object/Relation Mapping): 对象/关系映射

ORM 主要解决对象-关系的映射
这里写图片描述
ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.
这里写图片描述

流行的ORM框架

Hibernate:
非常优秀、成熟的 ORM 框架。
完成对象的持久化操作
Hibernate 允许开发者采用面向对象的方式来操作关系数据库。
消除那些针对特定数据库厂商的 SQL 代码
myBatis:
相比 Hibernate 灵活高,运行速度快
开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语
句,并且熟练使用sql语句优化功能
TopLink
OJB

Hibernate 的HelloWorld

下面我们来看 Hibernate 的第一个例子
我们这里使用 ecplise 进行开发,为了更方便的使用 Hibernate,需要安装一个 Hibernate 的插件 hibernatetools-4.3.1.Final,然后导入需要的 jar 包。

Hibernate开发步骤

这里写图片描述
1. 创建持久化 Java 类
提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。
使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理.
重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法
News.java

package com.hibernate.helloworld;

import java.util.Date;

public class News {

    private Integer id;
    private String title;
    private String author;
    private Date createDate;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public News() {
    }

    public News(String title, String author, Date createDate) {
        super();
        this.title = title;
        this.author = author;
        this.createDate = createDate;
    }

    @Override
    public String toString() {
        return "News [id=" + id + ", title=" + title + ", author=" + author
                + ", createDate=" + createDate + "]";
    }
}

2. 创建对象-关系映射文件
Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句
News.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-10-18 17:03:27 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.hibernate.helloworld.News" table="NEWS">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="TITLE" />
        </property>
        <property name="author" type="java.lang.String">
            <column name="AUTHOR" />
        </property>
        <property name="createDate" type="java.util.Date">
            <column name="CREATE_DATE" />
        </property>
    </class>
</hibernate-mapping>
  1. 创建 Hibernate 配置文件
    Hibernate 从其配置文件中读取和数据库连接的有关信息, 这个文件应该位于应用的 classpath 下.
    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>

        <!-- 配置 hibernate 基本连接属性 -->
        <property name="connection.username">root</property>
        <property name="connection.password">12345</property>
        <property name="connection.url">jdbc:mysql:///test</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <!-- 配置 hibernate 常用属性 -->
        <!-- 指定数据库所使用的方言 -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <property name="format_sql">true</property>
        <property name="show_sql">true</property>

        <!-- hbm2ddl.auto 指定运行程序是生成数据表的策略 -->
        <!-- create : 会根据 .hbm.xml  文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变 
             create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除 
             update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml  文件和数据库中对应的数据表的表结构不同, Hiberante  将更新数据表结构,但不会删除已有的行和列 
             validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常-->
        <property name="hbm2ddl.auto">update</property>

        <!-- 设置 hibernate 事务的隔离级别 -->
        <property name="connection.isolation">2</property>

        <!--  使删除对象后, 把其 OID 置为  null,不常使用 -->
        <!-- <property name="use_identifier_rollback">true</property> -->

        <!-- 指定需要映射关联的文件 -->
        <mapping resource="com/hibernate/helloworld/News.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

4. 通过 Hibernate API 编写访问数据库的代码
HibernateTest.java

package com.hibernate.helloworld;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class HibernateTest {

    @Test
    public void test() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

         //读取hibernate.cfg.xml文件  
        Configuration cfg = new Configuration().configure();  
        @SuppressWarnings("deprecation")
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
        //获取sessionFactory
        sessionFactory = cfg.buildSessionFactory(serviceRegistry);
        session = sessionFactory.openSession();

        //开启事务
        transaction = session.beginTransaction();

        //创建保存对象
        News news = new News("test", "lina", new Date());
        session.save(news);

        //提交事务
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
}

Configuration 类
Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:
Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
持久化类与数据表的映射关系(*.hbm.xml 文件)
创建 Configuration 的两种方式
1).属性文件(hibernate.properties):

Configuration cfg = new Configuration();

2).Xml文件(hibernate.cfg.xml)

Configuration cfg = new Configuration().configure();

Configuration 的 configure 方法还支持带参数的访问:

File file = new File(“simpleit.xml”);
Configuration cfg = new Configuration().configure(file);

SessionFactory 接口
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息
SessionFactory是生成Session的工厂
构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。
Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry 注册后才能生效
Hibernate4 中创建 SessionFactory 的步骤

//读取hibernate.cfg.xml文件  
Configuration cfg = new Configuration().configure();  
//创建 ServiceRegistry 对象
@SuppressWarnings("deprecation")
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
//获取sessionFactory
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);

Session 接口
Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。
Transaction(事务)
代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。

Transaction tx = session.beginTransaction();

常用方法:
commit():提交相关联的session实例
rollback():撤销事务操作
wasCommitted():检查事务是否提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值