作者:非得高档防水 | 来源:互联网 | 2023-09-25 16:37
目录1Hibernate1.1简介1.2Hibernate能干什么1.3Hibernate运行时体系结构1.3.1SessionFactory(org.hibernate.Sess
目录
- 1 Hibernate
- 1.1 简介
- 1.2 Hibernate能干什么
- 1.3 Hibernate运行时体系结构
- 1.3.1 SessionFactory (org.hibernate.SessionFactory)
- 1.3.2 Session (org.hibernate.Session)
- 1.3.3 Transaction (org.hibernate.Transaction)
- 1.3.4 ConnectionProvider (org.hibernate.connection.ConnectionProvider)
- 1.3.5 TransactionFactory (org.hibernate.TransactionFactory)
- 1.4 HelloWorld示例
- 1.5 示例说明
1 Hibernate
1.1 简介
Hibernate
是一个轻量级的ORMapping
框架
ORMapping
原理(Object Relational Mapping
)
ORMapping
基本对应规则:
- 类跟表相对应
- 类的属性跟表的字段相对应
- 类的实例与表中具体的一条记录相对应
- 一个类可以对应多个表,一个表也可以对应对个类
DB
中的表可以没有主键,但是Object
中必须设置主键字段
DB
中表与表之间的关系(如:外键)映射成为Object
之间的关系
Object
中属性的个数和名称可以和表中定义的字段个数和名称不一样
ORMapping
的基本实现方式:
使用JDBC
,用SQL
来操作数据库,只是看动态生成还是人工写代码来实现
1.2 Hibernate能干什么
Hibernate
主要用来实现Java
对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL
和JDBC
处理数据的时间。
Hibernate
的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate
可能不是最好的解决方案;对于那些在基于Java
的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应 用,Hibernate
是最有用的。
Hibernate
可以帮助你消除或者包装那些针对特定厂商的SQL
代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。
一个非常简要的Hibernate
体系结构的高层概要图
1.3 Hibernate运行时体系结构
最小
的体系结构方案,要求应用程序提供自己的 JDBC
连接并管理自己的事务。这种方案使用了Hibernate API
的最小子集.
“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API
中抽象出来,而让Hibernate来处理这些细节。
1.3.1 SessionFactory (org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成Session
的工厂,本身要用到ConnectionProvider
。
1.3.2 Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了JDBC
连接,也是Transaction
的工厂。
1.3.3 Transaction (org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA
以及CORBA
事务隔离开。
1.3.4 ConnectionProvider (org.hibernate.connection.ConnectionProvider)
生成JDBC
连接的工厂(有连接池的作用)。它通过抽象将应用从底层的Datasource
或DriverManager
隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。
1.3.5 TransactionFactory (org.hibernate.TransactionFactory)
生成Transaction
对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。
1.4 HelloWorld示例
根据刚才的学习,做基本的Hibernate
应用程序,要完成下面的工作:Object、数据库的表、两种配置文件、客户端程序来调用Hibernate的接口进行操作。
构建环境
最简单的方法:把hibernate-release-4.0.0.Beta4.zip
包里面lib/required
下的jar
包全部添加到工程的library
里面
在数据库中建表
设若构建一个表为tbl_user,字段:uuid,userId,name,age
配置xxx.cfg.xml
- 缺省名称为 hibernate.cfg.xml
- 存放在当前classes的根目录下,开发的时候在src根下就可以了
- 主要有如下四部分配置 :
与DB的连接
可选配置
资源文件注册
二级缓存
- 配置的时候可以到Hibernate发行包里面找个
hibernate.cfg.xml
的例子,比如可以用“\project\hibernate- documentation\quickstart\tutorials\basic\src\test\resources”下面的 hibernate.cfg.xml作例子
- 示例如下:
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:orcl
test
test
2
org.hibernate.dialect.OracleDialect
true
配置xxx.hbm.xml
- 与被描述的类同名 ,如:UserModel.hbm.xml
- 存放位置与所描述类存放在同一文件夹下
- 主要有如下四部分配置 :
类和表的映射
主键的映射
类的属性和DB中字段的映射
关系的映射
- 配置的时候可以到hibernate发行包里面找个例子,比如可以用“\project\hibernate-core\src\test\java \org\hibernate\test\cid”下面的Customer.hbm.xml作例子
- 示例如下:
'-//Hibernate/Hibernate Mapping DTD 3.0//EN'
'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
客户端文件:
package cn.javass.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.5 示例说明
SessionFactory sf = new Configuration().configure().buildSessionFactory();
这句话的意思是读取hibernate.cfg.xml
,创建Session
工厂,是线程安全的。
默认是hibernate.cfg.xm
,不用写出来,如果文件名不是hibernate.cfg.xml
,那么需要显示指定,如下:
SessionFactory sf = new Configuration(). configure( “javass.cfg.xml” ).buildSessionFactory();
Session
是应用程序主要使用的Hibernate接口,约相当于JDBC
的Connection+Statement/PreparedStatement
的功能,是线程不安全的
- 在
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/javass/h4/hello/UserModel.hbm.xml");
MetadataImpl metadata = (MetadataImpl) sources.buildMetadata();
SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory();
这种写法,现在还没有实现完全,不太好用,所以官方给出的示例里面还是采用以前的方式,大家先了解一下。