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。

HibernateReview Day1 - Introduction的更多相关文章

  1. A chatroom for all! Part 1 - Introduction to Node.js(转发)

    项目组用到了 Node.js,发现下面这篇文章不错.转发一下.原文地址:<原文>. ------------------------------------------- A chatro ...

  2. Introduction to graph theory 图论/脑网络基础

    Source: Connected Brain Figure above: Bullmore E, Sporns O. Complex brain networks: graph theoretica ...

  3. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  4. INTRODUCTION TO BIOINFORMATICS

    INTRODUCTION TO BIOINFORMATICS      这套教程源自Youtube,算得上比较完整的生物信息学领域的视频教程,授课内容完整清晰,专题化的讲座形式,细节讲解比国内的京师大 ...

  5. mongoDB index introduction

    索引为mongoDB的查询提供了有效的解决方案,如果没有索引,mongodb必须的扫描文档集中所有记录来match查询条件的记录.然而这些扫描是没有必要,而且每一次操作mongod进程会处理大量的数据 ...

  6. (翻译)《Hands-on Node.js》—— Introduction

    今天开始会和大熊君{{bb}}一起着手翻译node的系列外文书籍,大熊负责翻译<Node.js IN ACTION>一书,而我暂时负责翻译这本<Hands-on Node.js> ...

  7. Introduction of OpenCascade Foundation Classes

    Introduction of OpenCascade Foundation Classes Open CASCADE基础类简介 eryar@163.com 一.简介 1. 基础类概述 Foundat ...

  8. 000.Introduction to ASP.NET Core--【Asp.net core 介绍】

    Introduction to ASP.NET Core Asp.net core 介绍 270 of 282 people found this helpful By Daniel Roth, Ri ...

  9. Introduction to Microsoft Dynamics 365 licensing

    Microsoft Dynamics 365 will be released on November 1. In preparation for that, Scott Guthrie hosted ...

随机推荐

  1. SDUT Fermat’s Chirstmas Theorem(素数筛)

    Fermat's Chirstmas Theorem Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 In a letter ...

  2. Swift - 文本输入框(UITextField)的用法

    1,文本框的创建,有如下几个样式: UITextBorderStyle.None:无边框 UITextBorderStyle.Line:直线边框 UITextBorderStyle.RoundedRe ...

  3. c++在string类源

    一:回想 (1)c++中的string类是在面试中和笔试中常常考的题目: project代码免费下载 string类的自行实现 (2)c++中的string类和fstream类合起来是处理外部数据的利 ...

  4. 运行yum报错Error: Cannot retrieve metalink for reposit

    http://www.netpc.com.cn/593.html 运行yum报错Error: Cannot retrieve metalink for reposit 今天给Centos通过rpm - ...

  5. LV在系统重启后不能自动激活(boot.lvm&after.loca)

    同类相关文章:http://blog.csdn.net/laven54/article/details/9121661 最近发现suse11sp2的系统解决了异常死机的问题之后,又引入了另外的问题,比 ...

  6. IE6_一些简单bug

    1.IE6调整窗口大小的 Bug 当把body居中放置,改变IE浏览器大小的时候,任何在body里面的相对定位元素都会固定不动了.给body定义position:relative;就行了. 2.避免百 ...

  7. anthelion编译

    编程工程 $ cd ./anthelion/anthelion/target/classes$ java -Xmx15G -cp ../Anthelion-1.0.0-jar-with-depende ...

  8. Postfix+Amavisd-new+Spamassassin+ClamAV整合安装

    1. 安装软件和依赖包 apt-get install amavisd-new spamassassin clamav-daemon mysql-client mysql-server apt-get ...

  9. [置顶] Cocos2d-x 实例源码分析之二 小实例的主框架

    这篇文章是分析第一个小实例ActionTest的源码.其实所有实例程序的结构都是一样的,只有特定方法里的代码不同,大的框架都是一样的.也就是说看完这篇文章你就可以自己开始分析其他源码了. 废话不多说, ...

  10. Android开发经验之—intent传递大数据

    在Activity或者组件之前传递信息时,一般採用intent绑定bundle的方式传值,但在使用过程中须要注意的是不要用bundle传递大容量数据: 在做项目的过程中,须要将听写界面的听写结果信息传 ...