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。