Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate 可以应用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序使用,也可以在 Servlet/JSP 的 web 应用中使用,最具革命意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成数据持久化的重任。
Hibernate 是一个轻量级的 ORMapping 框架,本文重点给大家介绍 hibernate4 入门实例详细,需要的朋友参考下吧
Hibernate 是什么Hibernate 是一个轻量级的 ORMapping 框架
ORMapping 原理(Object RelationalMapping)
ORMapping 基本对应规则:1:类跟表相对应
2:类的属性跟表的字段相对应
3:类的实例与表中具体的一条记录相对应
4:一个类可以对应多个表,一个表也可以对应对个类
5:DB 中的表可以没有主键,但是 Object 中必须设置主键字段
6:DB 中表与表之间的关系(如:外键)映射成为 Object 之间的关系
7:Object 中属性的个数和名称可以和表中定义的字段个数和名称不一样
ORMapping 的基本实现方式:使用 JDBC,用 SQL 来操作数据库,只是看动态生成还是人工写代码来实现。
大家想想,我们实现过 ORMapping 吗?
Hibernate 能干什么:Hibernate 主要用来实现 Java 对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用 SQL 和 JDBC 处理数据的时间。
Hibernate 的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的 95%。对于以数据为中心的程序来说, 它们往往只在数据库中使用存储过程来实现商业逻辑, Hibernate 可能不是最好的解决方案; 对于那些在基于 Java 的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate 是最有用的。
Hibernate 可以帮助你消除或者包装那些针对特定厂商的 SQL 代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。
一个非常简要的 Hibernate 体系结构的高层概要图
Hibernate 运行时体系结构"最小" 的体系结构方案,要求应用程序提供自己的 JDBC 连接并管理自己的事务。这种方案使用了 Hibernate API 的最小子集.
"全面解决" 的体系结构方案,将应用层从底层的 JDBC/JTAAPI 中抽象出来,而让 Hibernate 来处理这些细节。
- SessionFactory(org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成 Session 的工厂,本身要用到 ConnectionProvider。
- Session(org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了 JDBC 连接,也是 Transaction 的工厂。
- Transaction(org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的 JDBC、JTA 以及 CORBA 事务隔离开。
- ConnectionProvider(org.hibernate.connection.ConnectionProvider)
生成 JDBC 连接的工厂(有连接池的作用)。它通过抽象将应用从底层的 Datasource 或 DriverManager 隔离开。仅供开发者扩展 / 实现用,并不暴露给应用程序使用。
- TransactionFactory(org.hibernate.TransactionFactory)
生成 Transaction 对象实例的工厂。仅供开发者扩展 / 实现用,并不暴露给应用程序使用。
HelloWorld
要研究怎么做,先得搞清楚需要做什么
根据刚才的学习,做基本的 Hibernate 应用程序,要完成下面的工作:Object、数据库的表、两种配置文件、客户端程序来调用 Hibernate 的接口进行操作。
构建环境最简单的方法:把 hibernate-release-4.0.0.Beta4.zip 包里面 lib/required 下的 jar 包全部添加到工程的 library 里面,另外还需添加 slf4j 的实现包 slf4j-log4j12-1.5.8.jar 和 log4j 的实现包 log4j-1.2.16.jar,还有别忘了把 JDBC 的驱动 jar 包也加入到 library 里面
Object 怎么做1:就是前面学过的 vo 的写法(规则同样是那四点)
2:要求必须有一个 public 为空参的构造方法,现在写 vo 一般不写构造方法,默认就有一个,但是写构造方法的时候要注意写上一个 public 为空参的构造方法
3:要求提供一个标识属性 (identifier)
4:使用非 final 的类(因为要使用代理来延迟实体的装载)
5:设若构建一个对象:com.bjpowernode.h4.hello.UserModel,有四个属性:uuid,userId,name,age
在数据库中建表设若构建一个表为 tbl_user,字段:uuid,userId,name,age
配置 xxx.cfg.xml
1:缺省名称为 hibernate.cfg.xml
2:存放在当前 classes 的根目录下,开发的时候在 src 根下就可以了
3:主要有如下四部分配置 :
(1)与 DB 的连接
(2)可选配置
(3)资源文件注册
(4)二级缓存
4:配置的时候可以到 Hibernate 发行包里面找个 hibernate.cfg.xml 的例子,比如可以用 "\project\hibernate-documentation\quickstart\tutorials\basic\src\test\resources" 下面的 hibernate.cfg.xml 作例子
5:示例如下:
- <?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.driver_class">oracle.jdbc.driver.OracleDriver</property>
- <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
- <property name="connection.username">test</property>
- <property name="connection.password">test</property>
- <property name="connection.pool_size">2</property>
- <property name="dialect">org.hibernate.dialect.OracleDialect</property>
- <property name="show_sql">true</property>
- <mapping resource="cn/bjpowernode/h4/hello/UserModel.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
配置 xxx.hbm.xml
1:与被描述的类同名 ,如:UserModel.hbm.xml
2:存放位置与所描述类存放在同一文件夹下
3:主要有如下四部分配置 :
(1)类和表的映射
(2)主键的映射
(3)类的属性和 DB 中字段的映射
(4)关系的映射
4:配置的时候可以到 hibernate 发行包里面找个例子,比如可以用 "\project\hibernate-core\src\test\java\org\hibernate\test\cid" 下面的 Customer.hbm.xml 作例子
5:示例如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
- 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
- <hibernate-mapping>
- <class name="com.bjpowernode.h4.hello.UserModel" table="tbl_user">
- <id name="uuid">
- <generator class="assigned"/>
- </id>
- <property name="userId"></property>
- <property name="name"></property>
- <property name="age"></property>
- </class>
- </hibernate-mapping>
客户端文件:
- package com.bjpowernode.h4.hello;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- public class Client {
- public static void main(String[] args) {
- SessionFactory sf = new Configuration().configure().buildSessionFactory();
- Session s = null;
- Transaction t = null;
- try {
- //准备数据
- UserModel um = new UserModel();
- um.setUuid("1");
- um.setUserId("id1");
- um.setName("name1");
- um.setAge(1);
- s = sf.openSession();
- t = s.beginTransaction();
- s.save(um);
- t.commit();
- } catch(Exception err) {
- t.rollback();
- err.printStackTrace();
- } finally {
- s.close();
- }
- }
- }
测试:直接在 Elipse 里面运行 Client 文件即可,运行结束,你将会看到在 console 输出:"Hibernate: insert into tbl_user (userId, name, age, uuid) values (?, ?, ?, ?)",打开数据库的数据表,你会看到一条值已经加入了。
说明:
1:
这句话的意思是读取 hibernate.cfg.xml,创建 Session 工厂,是线程安全的。
- SessionFactory sf = new Configuration().configure().buildSessionFactory();
默认是 "hibernate.cfg.xml",不用写出来,如果文件名不是 "hibernate.cfg.xml",那么需要显示指定,如下:
- SessionFactory sf = new Configuration(). configure("bjpowernode.cfg.xml").buildSessionFactory();
2:Session 是应用程序主要使用的 Hibernate 接口,约相当于 JDBC 的 Connection+Statement/PreparedStatement 的功能,是线程不安全的
3:在 Hibernate4 里面,已经不推荐使用 Configuration 类了,而改为使用 ServiceRegistryBuilder 和 MetadataSources 来代替,新的写法大致如下:
- ServiceRegistryBuilder builder = new ServiceRegistryBuilder().configure();
- builder.applySetting("connection.driver_class", "oracle.jdbc.driver.OracleDriver");
- builder.applySetting("connection.url", "jdbc:oracle:thin:@localhost:1521:orcl");
- builder.applySetting("connection.username", "ztb");
- builder.applySetting("connection.password", "ztb");
- builder.applySetting("connection.pool_size", "2");
- builder.applySetting("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
- builder.applySetting("show_sql", "true");
- MetadataSources sources = new MetadataSources(builder.buildServiceRegistry());
- sources.addResource("cn/bjpowernode/h4/hello/UserModel.hbm.xml");
- MetadataImpl metadata = (MetadataImpl) sources.buildMetadata();
- SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory();
这种写法,现在还没有实现完全,不太好用,所以官方给出的示例里面还是采用以前的方式,大家先了解一下。
4:这里使用的事务 Transaction 是 Hibernate 的 Transaction,需要有,不能去掉。
为什么必须有这个 Hibernate 的事务呢?以 HelloWorld 为例来看看:
总结以上所述是小编给大家介绍的 hibernate4 快速入门实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 PHPERZ 网站的支持!
来源: http://www.phperz.com/article/18/0104/353587.html