Hibernate开发流程(二)

来源:互联网 发布:c语言培训多少钱 编辑:程序博客网 时间:2024/04/30 03:58


Hibernate环境搭建

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

这里写图片描述

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

这里写图片描述



Hibernate开发步骤

这里写图片描述

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包添加到系统的类加载路径:

这里写图片描述

配置文件有代码指定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文件配置。

注解方式如下:

这里写图片描述

@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异常,从而不再要求程序必须处理异常。

1 0