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. Maven项目下 java.lang.ClassNotFoundException 常规解决的方法

    网上非常多要改动.class .project的比較麻烦有时候还不一定管用.以下的方法适合于项目用已经引用了jar.可是执行时却ClassNotFound,请用例如以下方法试试: 严重: Error ...

  2. paip.odbc DSN的存储与读取

    paip.odbc DSN的存储与读取 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/atti ...

  3. Network Panel说明

    Chrome Developer Tools:Network Panel说明   官方资料:Chrome Developer Tools: Network Panel 一.chrome Develop ...

  4. Linux下限制Shell:Rssh和Scponly

    限制Shell,正如Rsh和Scponly让系统管理员限制Linux用户可以做哪些操作,你可以创建用户,将被允许通过Scp复制文件,但不会被允许登录到系统的命令行.这是非常重要的安全功能,应考虑每个系 ...

  5. CSS 控制应为Html页面高度导致抖动的问题

    在CSS中添加如下代码: html,body{ overflow-y:scroll;} html,body{ overflow:scroll; min-height:101%;} html{ over ...

  6. 14.4.3.3 Making the Buffer Pool Scan Resistant

    14.4.3.3 Making the Buffer Pool Scan Resistant 让Buffer Pool 扫描 相比使用一个严格的LRU算法, InnoDB 使用一个技术来最小化数据的总 ...

  7. 2cifang.com_2次方学习

    2cifang.com_2次方学习

  8. jQuery遍历函数

    jQuery遍历函数包含了用于筛选.查找和串联元素的方法. .add():将元素加入到匹配元素的集合中. .andSelf():把堆栈中之前的元素集加入到当前集合中. .children():获得匹配 ...

  9. 使用KnockoutJs+Bootstrap实现分页

    [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页   一.引言 由于最近公司的系统需要改版,改版的新系统我打算使用KnockoutJs来制作Web前端 ...

  10. 使用ROW_NUMBER()查询:列名 'RowNumber' 无效。

    原文:使用ROW_NUMBER()查询:列名 'RowNumber' 无效. 使用ROW_NUMBER()方法查询结果集:语句如下:   select ROW_NUMBER() OVER(ORDER ...