HibernateReview Day1

Hibernate已经学过去大概有半个月了,然后默默的忘掉了……所谓Practice makes perfect. 我尽力重新拾起来。

1.什么是ORM

在介绍Hibernate之前,我们先学习下ORM。

ORM全名是Object/Relation Mapping,即对象/关系数据库映射。ORM是一种规范,顾名思义,它描述了这一类框架的基本特征:完成面向对象编程语言到关系型数据库的映射关系。

对于用类似Java的语言进行应用开发的时候,我们从项目已开始就进行的是面向对象分析、设计和编程,但是当进行持久化数据库访问的时候,我们又必须又用到关系型数据库的访问方式。ORM此时,就拯救程序员于水火,它把关系型数据库包装成面向对象的模型。当我们应用ORM框架时,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象。

应用程序-------CRUD----->持久化对象(ORM工具)<-----相互映射------> 关系数据库

而Hibernate就是比较流行的ORM框架之一。

2.什么是Hibernate

Hibernate是一个面向Java环境的对象/关系数据库映射工具,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构当中,将开发者从繁重的数据持久化任务释放出来(当然,不是百分百)。

Hibernate不仅管理Java类到数据库的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法(如HQL),可以大幅度减少开发人员使用SQL和JDBC处理数据的时间。

Tips:POJO:Plain Ordinary Java Objects,普通Java对象,即普通JavaBeans;

PO:Persistent Object,持久化对象。

3. Hibernate的数据库操作

上文中提到ORM中一个重要的工具:PO。PO用来完成持久化操作,即以面向对象的方式操作关系型数据库。Hibernate中的PO完全可以用POJO来做为持久化对象使用。所以Hibernate又被称为低侵入式设计,即Hibernate不要求持久化继承人和父类,或者实现任何接口,这样可以保证代码不被污染。

public class News{
    //新闻类的标识属性
    private int id;
    //新闻标题
    private String title;
    //新闻内容
    private String content;

    //setters and getters
    ...
}

这个普通的JavaBean目前还不具备持久化操作的能力,为了使其具备持久化能力,还需要配置News.hbm.xml文件。

<?xml version="1.0" encoding="gb2312"?>
<!-- 指定Hiberante3映射文件的DTD信息 -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- hibernate-mapping是映射文件的根元素 -->
<hibernate-mapping>
    <!-- 每个class元素对应一个持久化对象 -->
    <class name="News" table="news">
        <!-- id元素定义持久化类的标识属性 -->
        <id name="id">
            <!-- 指定主键生成策略 -->
            <generator class="identity"/>
        </id>
        <!-- property元素定义常规属性 -->
        <property name="title"/>
        <property name="content"/>
    </class>
</hibernate-mapping>

主键生成策略详见>>>《Hibernate主键生成策略》

到此,我们可以看到,PO=POJO + XML映射文件。

接下来,要配置hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!-- 指定Hibernate配置文件的DTD信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- hibernate- configuration是连接配置文件的根元素 -->
<hibernate-configuration>
    <session-factory>
        <!-- 指定数据库方言 -->
        <property name="dialect">
            org.hibernate.dialect.OracleDialect
        </property>
        <!-- 指定连接数据库的url,hibernate连接的数据库名 -->
        <property name="connection.url">
            jdbc:oracle:thin:@localhost:1521:orcl
        </property>
        <!-- 指定连接数据库的用户名 -->
        <property name="connection.username">system</property>
        <!-- 指定连接数据库的密码 -->
        <property name="connection.password">tcpxcrt4f3</property>
        <!-- 指定连接数据库所用的驱动 -->
        <property name="connection.driver_class">
            oracle.jdbc.OracleDriver
        </property>
        <!-- 数据库实例名称 -->
        <property name="myeclipse.connection.profile">orcl</property>
        <!-- 罗列所有的映射文件 -->
        <mapping resource="com/zf/entity/News.hbm.xml" />

    </session-factory>

</hibernate-configuration>

最后一步,完成消息插入的代码:

public class NewsManager
{
    public static void main(String[] args)
        throws Exception
    {
       //实例化Configuration,
        Configuration conf = new Configuration()
       //下面方法默认加载hibernate.cfg.xml文件
            .configure();
       //以Configuration创建SessionFactory
       SessionFactory sf = conf.buildSessionFactory();
       //创建Session
       Session sess = sf.openSession();
       //开始事务
        Transaction tx = sess.beginTransaction();
       //创建消息实例
        News news = new News();
       //设置消息标题和消息内容
        news.setTitle("这里是新闻标题");
       news.setContent("这里是新闻的正文。"
            + "欢迎来这里交流http://www.cnblogs.com/zifo");
       //保存消息
        sess.save(news);
       //提交事务
        tx.commit();
       //关闭Session
       sess.close();
       sf.close();
    }
}

这就完成了一个简单的Hibernate消息插入的例子。

总结起来,为了使Hibernate进行持久化操作,通常有如下步骤:

1)开发持久化类,由POJO和映射文件组成。

2)获取Configuration。

3)获取SessionFactory。

4)获取Session,打开事务。

5)用面向对象的方式操作数据库。

6)关闭事务,关闭Session。

原文地址:https://www.cnblogs.com/zifo/p/3390711.html