Hibernate开发流程(二)


Hibernate环境搭建

1. 导入hibernate-release-5.1.0.Final\lib\required路劲下所有的jar包:

Hibernate开发流程(二)_第1张图片

2. 导入数据库驱动的jar包:

这里写图片描述


Hibernate开发步骤

Hibernate开发流程(二)_第2张图片

1. Hibernate配置文件


Hibernate配置文件的默认文件名为hibernate.cfg.xml,当程序调用Configuration对象的configure()方法时,Hibernate将自动加载该文件。

Hibernate配置文件时个XML文件,第一行是XML文件声明,指定该XML文件的版本和存储该文件所用的字符集。

Hibernate配置文件的根元素是< hibernate-configuration…/>,根元素下有< session-factory…/>子元素,该元素下有很多< property…/>子元素,是配置Hibernate连接数据的必要信息,如连接数据库的驱动、URL、用户名、密码等。

<?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="connection.username">root</property>
    <property name="connection.password">mysqladmin</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/jkxyshsflower</property>
   <!-- 使用数据源管理数据库连接 -->
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.min_size">1</property>
    <property name="hibernate.c3p0.timeout">5000</property>

    <property name="hibernate.c3p0.max_statements">100</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.c3p0.acquire_increment">2</property>
    <property name="hibernate.c3p0.validate">true</property>

    <!-- 配置 hibernate 的基本信息 -->
    <!-- hibernate 所使用的数据库方言 -->
    <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>        

    <!-- 执行操作时是否在控制台打印 SQL -->
    <property name="show_sql">true</property>

    <!-- 是否对 SQL 进行格式化 -->
    <property name="format_sql">true</property>

    <!-- 指定自动生成数据表的策略 -->
    <property name="hbm2ddl.auto">update</property>

    <!-- 指定关联的 .hbm.xml 文件 -->
    <mapping resource="com/afy/hibernate/helloworld/News.hbm.xml"/>

  </session-factory>

</hibernate-configuration>

此外,Hibernate推荐使用数据源管理数据库连接,这样能提高数据库连接性能,数据源负责维持一个数据连接池,当程序创建数据源是,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中。当程序需要进行数据库访问时,无需重新获得数据库连接,而是从连接池中取出一个空闲的数据库连接。当程序使用数据库访问数据库结束后,无需 关闭数据库连接,而是将数据库连接归还给连接池即可。通过这种方式,可以避免频繁地获取数据库连接、关闭数据库连接所导致的性能下降。Hibernate推荐使用C3P0数据源,以上配置文件指定C3P0数据源配置信息,包括最多连接数、最小连接数等。

使用C3P0连接池需要将ibernate-release-5.1.0.Final\lib\optional\c3p0整个目录下所有jar包添加到系统的类加载路径:

Hibernate开发流程(二)_第3张图片

配置文件有代码指定hbm2ddl.auto属性,该属性指定是否需要Hibernate根据持久化类自动创建数据表,这里指定update,表示Hibernate会根据持久化类的映射关系类创建数据表。

< session-factory…/>元素还可接受多个< mapping…/>元素,每个< mappinng…/>元素指定一个持久化类,< mappinng…/>元素的class属性指定Hibernate持久化类的类名,还有resource属性,用于将.hbm.xml配置文件包含进来,注意这里包含进来的是目录格式的路径。

2. 持久化类

ORM框架中都要有PO(持久化对象),来完成持久化操作,通过该对象可对数据执行增、删、改的操作,以面向对象的方式操作数据库。

应用程序不用直接访问数据库,不用关心底层采用数据库(这点也可以看作是多态的体现)。应用程序只需要创建、修改、删除持久化对象,Hibernate会把这种操作转换为对指定数据表的操作。

Hibernate的PO是普通的Java对象,低侵入式设计,不要求 继承任何父类,或者实现任何接口。以下代码是个POJO(普通的、传统的Java对象)类。

public class News {

    private Integer id; 
    private String title;
    private String author;  
    private String desc;
    private String content; 
    private Blob picture;
    private Date date;
    //以下省略相关的setter和getter方法 

    ......

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

    public News() {

    }

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


3. 对象-关系映射关系

上面写的普通JavaBean目前还不具备持久化操作的能力,为了使其具备持久化操作的能力,还需要为这个POJO进行对象-关系映射配置,有两种方式可以完成对象-关系映射配置,一种是注解,另一种是通过*.hbm.xml文件配置。

注解方式如下:

Hibernate开发流程(二)_第4张图片

@Entity注解声明该类是一个Hibernate的持久化类。
@Table指定该类映射的表。此处指定该类映射到new_info表。
@Id用于指定该类的标识属性。所谓标识属性,就是可以唯一标识该对象的属性,标识属性通常映射到数据表的主键列。
@GeneratedValue用于指定主键生成侧路,其中strategy属性指定了主键生成策略为IDENTITY策略,就是采用自动增长的主键生成策略。

Hibernate与JPA关系密切,Hibernate4.3遵守最新的JPA2.1规范,Hibernate基本上直接使用了JPA2.1的标准注解。以上4个主键都是JPA的标准注解,位于java.persistence包下。在Hibernate解压路径的lib\required目录包含一个hibernate-jpa-2.1-api-1.0.0.Final文件,该文件是JPA规范的jar包。PA注解的API文档,包含在JavaEE7的API文档里。

*.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">

<hibernate-mapping package="com.afy.hibernate.helloworld">

    <class name="news_info" table="NEWS" dynamic-insert="true">

       <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <!-- 指定主键的生成方式, native: 使用数据库本地方式 -->
            <generator class="native" />
        </id>

        <property name="title" not-null="true" unique="true" index="news_index" length="50" type="java.lang.String" column="TITLE" >
        </property>

        <property name="author" type="java.lang.String" index="news_index">
            <column name="AUTHOR" />
        </property>

        <property name="date" type="date">
            <column name="DATE" />
        </property>

        <property name="desc" formula="(SELECT concat(title, ',', author) FROM NEWS n WHERE n.id = id)"></property>

        <property name="content">
          <column name="CONTENT" sql-type="text"></column>
        </property>

        <property name="picture" column="PICTURE" type="blob"></property>

    </class>

</hibernate-mapping>

class对应类,使用反射方式,对应table生成表NEWS,往下依次指定映射列等,运行时Hibernate还根据该映射文件生成各种SQL语句。

完成对象映射关系,Hibernate可以理解持久化类和数据表之间的对应关系,持久化类的属性与表的各列之间的对应关系。

4. 通过Hibernate API访问数据库

接下来要创建一个对象,通过Hibernate API访问数据库:

public class HibernateTest {

    @Test
    public void test() {

        System.out.println("test...");

        //1. 创建一个 SessionFactory 对象
        SessionFactory sessionFactory = null;

        //1). 创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息
        Configuration configuration = new Configuration().configure();

        //2). 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象
        //hibernate 的任何配置和服务都需要在该对象中注册后才能有效. 
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

        //3).
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);

        //2. 创建一个 Session 对象
        Session session = sessionFactory.openSession();

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

        //4. 执行保存操作
        News news = new News("Java12345", "ATGUIGU", new Date(new java.util.Date().getTime()));
        session.save(news);

        //5. 提交事务 
        transaction.commit();

        //6. 关闭 Session
        session.close();

        //7. 关闭 SessionFactory 对象
        sessionFactory.close();
    }

}

程序运行结束后,数据库中会多出一个数据表news_info,该表中包含News实例对应的记录。

基本流程如上面代码所示,

1. 首先要获取Configuration;
2. 再获取SessionFactory;
3. 获取Session,打开事物;
4. 用面向对象的方式打开数据库;
5. 关闭事物、关闭Session。

在执行session.save(News)之前,现有获取Session对象,PO只有在Session的管理下才可完成数据库访问。


小结

为使用Hibernate进行持久化操作,通常需要如下几个步骤:

1. 创建Hibernate配置文件*.cfg.xml指定连接数据库基本信息等;
2. 开发持久化类POJO;
3. 注解/*.hbm.xml文件配置对象关系-对象映射关系;
4. 创建实例对象,通过Hibernate API访问数据库。

根据PO与Session的关联关系,PO有如下三种状态:

瞬态:如果PO实例从未与Session关联过,该PO实例处于瞬态。
持久化:如果PO实例与Session关联,且该实例对应到数据库记录,则该实例处于持久化状态。
脱管:如果PO实例曾经与Session关联过,因为Session的关闭等原因,PO实例脱离了Session的管理,这种状态称为脱管状态。

对PO的操作必须在Session管理下才能同步到数据库。Session由SessionFactory工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象,SessionFactory对象由Configuration对象生成,Configuration对象负责加载Hibernate配置文件夹。

1. 使用Hibernate添加记录,对比与JDBC操作数据库,Hibernate体现出显著的优势:

2. 不用编写SQL语句,而是采用OO方式访问数据库;
在JDBC访问过程中大量的check异常被包装成Hibernate的Runtime异常,从而不再要求程序必须处理异常。

你可能感兴趣的:(Hibernate)