hibernate4快速入门实例详解

时间:2022-09-23 15:46:50

hibernate是什么

hibernate是一个轻量级的ormapping框架

ormapping原理(object relationalmapping)

hibernate4快速入门实例详解

ormapping基本对应规则:

1:类跟表相对应

2:类的属性跟表的字段相对应

3:类的实例与表中具体的一条记录相对应

4:一个类可以对应多个表,一个表也可以对应对个类

5:db中的表可以没有主键,但是object中必须设置主键字段

6:db中表与表之间的关系(如:外键)映射成为object之间的关系

7:object中属性的个数和名称可以和表中定义的字段个数和名称不一样

ormapping的基本实现方式:

使用jdbc,用sql来操作数据库,只是看动态生成还是人工写代码来实现。

大家想想,我们实现过ormapping吗?

hibernate4快速入门实例详解

hibernate4快速入门实例详解

hibernate能干什么:

hibernate主要用来实现java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用sql和jdbc处理数据的时间。

hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,hibernate可能不是最好的解决方案;对于那些在基于java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,hibernate是最有用的。

hibernate可以帮助你消除或者包装那些针对特定厂商的sql代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。

hibernate4快速入门实例详解

一个非常简要的hibernate体系结构的高层概要图

hibernate4快速入门实例详解

hibernate运行时体系结构

“最小”的体系结构方案,要求应用程序提供自己的 jdbc连接并管理自己的事务。这种方案使用了hibernate api 的最小子集.

hibernate4快速入门实例详解

“全面解决”的体系结构方案,将应用层从底层的jdbc/jtaapi中抽象出来,而让hibernate来处理这些细节。

hibernate4快速入门实例详解

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:示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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:示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>

客户端文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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:sessionfactory sf = new configuration().configure().buildsessionfactory();这句话的意思是读取hibernate.cfg.xml,创建session工厂,是线程安全的。

默认是”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来代替,新的写法大致如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
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快速入门实例详解

总结

以上所述是小编给大家介绍的hibernate4快速入门实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://blog.sina.com.cn/s/blog_9c6852670102wvo9.html