1、Hibernate入门

1.1 hibernate是什么?

一个轻量级的ORMapping框架。

O:object             对象

R:Relational       关系--关系型的数据库、

Mapping:                   映射

1.2 Hibernate原理

ORMapping的基本规则:

类和表映射

实例和数据库表中的一条记录映射

实例的属性和数据库表中的字段映射

 

表名和类名可以不一样

一个类可以映射多个表

一个表可以映射多个对象

数据库表里可以没有主键,但是对象里面一定要设置主键字段

 

ORMapping的基本实现方式:

使用JDBC,用SQL来操作数据库。

1.3 Hibernate能干什么

1.实现ORMapping。

2.减少JDBC+SQL的开发时间,提高开发效率。

3.屏蔽不同数据库的实现,可以在不同数据库之间移植。

 

1.4 Hibernate有什么

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

Hibernate运行时体系结构

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

  

“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让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对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。

1.5 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:设若构建一个对象:cn.javass.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:示例如下:

java代码:

查看复制到剪贴板打印

1.   <?xml version='1.0' encoding='utf-8'?>  

2.   <!DOCTYPE hibernate-configuration PUBLIC  

3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  

5.   <hibernate-configuration>  

6.       <session-factory>  

7.           <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>  

8.           <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>  

9.           <property name="connection.username">test</property>  

10.          <property name="connection.password">test</property>  

11.    

12.          <property name="connection.pool_size">2</property>  

13.          <property name="dialect">org.hibernate.dialect.OracleDialect</property>  

14.          <property name="show_sql">true</property>  

15.    

16.          <mapping resource="cn/javass/h4/hello/UserModel.hbm.xml"/>  

17.      </session-factory>  

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

  

java代码:

查看复制到剪贴板打印

1.   <?xml version="1.0" encoding="UTF-8"?>  

2.   <!DOCTYPE hibernate-mapping PUBLIC  

3.           '-//Hibernate/Hibernate Mapping DTD 3.0//EN'  

4.           'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>  

5.   <hibernate-mapping>  

6.       <class name="cn.javass.h4.hello.UserModel" table="tbl_user">  

7.           <id name="uuid">  

8.               <generator class="assigned"/>  

9.           </id>  

10.          <property name=“userId”></property>  

11.          <property name=“name”></property>  

12.          <property name="age"></property>  

13.      </class>  

14.  </hibernate-mapping>  

 

客户端文件:

1.   package cn.javass.h4.hello;  

2.     

3.   import org.hibernate.Session;  

4.   import org.hibernate.SessionFactory;  

5.   import org.hibernate.Transaction;  

6.   import org.hibernate.cfg.Configuration;  

7.     

8.   public class Client {  

9.       public static void main(String[] args) {  

10.          SessionFactory sf = new Configuration().configure().buildSessionFactory();  

11.          Session s = null;  

12.          Transaction t = null;  

13.    

14.          try{  

15.              //准备数据  

16.              UserModel um = new UserModel();  

17.              um.setUuid("1");  

18.              um.setUserId("id1");  

19.              um.setName("name1");  

20.              um.setAge(1);  

21.              s = sf.openSession();  

22.              t = s.beginTransaction();  

23.              s.save(um);  

24.              t.commit();  

25.         }catch(Exception err){  

26.              t.rollback();  

27.              err.printStackTrace();  

28.        }finally{  

29.              s.close();  

30.        }  

31.      }  

32.  }  

 

测试:直接在Elipse里面运行Client文件即可,运行结束,你将会看到在console输出:“Hibernate: insertinto tbl_user (userId, name, age, uuid) values (?, ?, ?, ?)”,打开数据库的数据表,你会看到一条值已经加入了。

 

说明:

1:SessionFactory sf = newConfiguration().configure().buildSessionFactory();这句话的意思是读取hibernate.cfg.xml,创建Session工厂,是线程安全的。

默认是”hibernate.cfg.xml”,不用写出来,如果文件名不是”hibernate.cfg.xml”,那么需要显示指定,如下:

SessionFactory sf = new Configuration(). configure( “javass.cfg.xml” ).buildSessionFactory();

2:Session是应用程序主要使用的Hibernate接口,约相当于JDBC的Connection+Statement/PreparedStatement的功能,是线程不安全的

 

3:在Hibernate4里面,已经不推荐使用Configuration类了,而改为使用ServiceRegistryBuilder和MetadataSources来代替,新的写法大致如下:

ServiceRegistryBuilder builder = newServiceRegistryBuilder().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 = newMetadataSources( builder.buildServiceRegistry() );

sources.addResource("cn/javass/h4/hello/UserModel.hbm.xml");

 

MetadataImpl metadata = (MetadataImpl)sources.buildMetadata();

SessionFactory sf =metadata.getSessionFactoryBuilder().buildSessionFactory();

这种写法,现在还没有实现完全,不太好用,所以官方给出的示例里面还是采用以前的方式,大家先了解一下。

4:这里使用的事务Transaction是Hibernate的Transaction,需要有,不能去掉。

 

为什么必须有这个Hibernate的事务呢?以HelloWorld为例来看看:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值