hibernate4之原理浅析
2012-12-07 14:35
295 查看
Hibernate是一个对JDBC轻量封装后的轻量级ORMapping框架
ORMapping原理(Object Relational Mapping)
在以前使用的JDBC操作其实就是一个持久化的过程
JDBC的劣势:
对于小型的应用开发而言,使用JDBC也许还不错。但是对于大型应用而言,从上百张拥有几十个字段的数据表中读取数据的话,就要写很多getXXX()方法,所以JDBC在代码开发环节来讲有高出错率和低复用性。
随着Hibernate的日趋成熟,从易用性和高效性角度来讲,JDBC在记录的批量操作,多表连接,表单级联方面表现并不优秀。
ORMapping基本对应规则:
1:类跟表相对应
2:类的属性跟表的字段相对应
3:类的实例与表中具体的一条记录相对应
4:一个类可以对应多个表,一个表也可以对应对个类
5:DB中的表可以没有主键,但是Object中必须设置主键字段
6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系
7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样
Hibernate是怎么工作的?
Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间, Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。
整体流程
1:通过configuration来读cfg.xml文件
2:得到SessionFactory 工厂
3:通过SessionFactory 工厂来创建Session实例
4:通过Session打开事务
5:通过session的api操作数据库
6:事务提交
7:关闭连接
Hibernate4.1.4 API 简介
Configuration类(org.hibernate.cfg.Configuration)
负责配置和启动Hibernate,创建SessionFactory实例
SessionFactory接口(org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成Session的工厂,本身要用到ConnectionProvider,充当数据源代理,一个SessionFactory对应一个数据源。
Session接口(org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此接口对象生命周期很短,也是Transaction的工厂,负责CRUD的持久化操作,充当持久化管理器。约相当于JDBC的Connection+Statement/PreparedStatement的功能
Transaction接口(org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,此接口生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。其实就是封装了底层的事务。
Query接口(org.hibernate.Query)、Criteria接口(org.hibernate.Criteria)
执行数据库查询,是更加面向对象形式的方式,主要用于各种关联和条件查询。
搭建 Hibernate4.1.4 工作环境
把hibernate-release-4.1.4文件夹里面lib/required文件夹下的jar包全部添加到工程的library里面,另外还需添加slf4j的实现包slf4j-log4j12-1.6.4.jar和log4j的实现包log4j-1.2.16.jar,还有别忘了把JDBC的驱动jar包也加入到library里面。
配置hibernate.cfg.xml
1:缺省名称为hibernate.cfg.xml
2:存放在当前classes的根目录下,开发的时候在src根下就可以了
3:主要有如下四部分配置 :
(1)与DB的连接
(2)可选配置
(3)资源文件注册
(4)二级缓存
4:配置的时候可以到Hibernate发行包里面找个hibernate.cfg.xml的例子,比如可以用“hibernate-release-4.1.4\project\etc”下面的hibernate.cfg.xml作例子,当需要配置缓存的时候可以参考ehcache.xml文件,还有Hibernate的属性模版文件,你们都是可选的属性设置方法,另外该文件夹下的log4j.properties日志文件也可以用来参考
下面是手动用java代码来启动Hibernate4.1.4:
启动Hibernate其实就是创建一个SessionFatory,那么就可以用SessionFactory创建出来的一个个Session对象进行对数据库的持久化操作了。
Java代码
public class HibernateSessionFactoryUtil {
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory by xml file , default value: /hibernate.cfg.xml
sessionFactory = new Configuration()
.configure(CONFIG_FILE_LOCATION).buildSessionFactory();
/*
* 在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", "用户名");
builder.applySetting("connection.password", "密码");
builder.applySetting("connection.pool_size", "连接池最小连接数");
builder.applySetting("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
builder.applySetting("show_sql", "true");
MetadataSources sources = new MetadataSources( builder.buildServiceRegistry() );
sources.addResource("XML形式加载映射文件...xml");
sources.addAnnotatedClass(annoation形式映射...class);
MetadataImpl metadata = (MetadataImpl) sources.buildMetadata();
sessionFactory = metadata.getSessionFactoryBuilder().buildSessionFactory();
} catch (Throwable ex) {
System.out.println("【ERROR】创建SessionFactory对象出错,原因是:");
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
ORMapping原理(Object Relational Mapping)
在以前使用的JDBC操作其实就是一个持久化的过程
JDBC的劣势:
对于小型的应用开发而言,使用JDBC也许还不错。但是对于大型应用而言,从上百张拥有几十个字段的数据表中读取数据的话,就要写很多getXXX()方法,所以JDBC在代码开发环节来讲有高出错率和低复用性。
随着Hibernate的日趋成熟,从易用性和高效性角度来讲,JDBC在记录的批量操作,多表连接,表单级联方面表现并不优秀。
ORMapping基本对应规则:
1:类跟表相对应
2:类的属性跟表的字段相对应
3:类的实例与表中具体的一条记录相对应
4:一个类可以对应多个表,一个表也可以对应对个类
5:DB中的表可以没有主键,但是Object中必须设置主键字段
6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系
7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样
Hibernate是怎么工作的?
Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间, Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。
整体流程
1:通过configuration来读cfg.xml文件
2:得到SessionFactory 工厂
3:通过SessionFactory 工厂来创建Session实例
4:通过Session打开事务
5:通过session的api操作数据库
6:事务提交
7:关闭连接
Hibernate4.1.4 API 简介
Configuration类(org.hibernate.cfg.Configuration)
负责配置和启动Hibernate,创建SessionFactory实例
SessionFactory接口(org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成Session的工厂,本身要用到ConnectionProvider,充当数据源代理,一个SessionFactory对应一个数据源。
Session接口(org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此接口对象生命周期很短,也是Transaction的工厂,负责CRUD的持久化操作,充当持久化管理器。约相当于JDBC的Connection+Statement/PreparedStatement的功能
Transaction接口(org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,此接口生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。其实就是封装了底层的事务。
Query接口(org.hibernate.Query)、Criteria接口(org.hibernate.Criteria)
执行数据库查询,是更加面向对象形式的方式,主要用于各种关联和条件查询。
搭建 Hibernate4.1.4 工作环境
把hibernate-release-4.1.4文件夹里面lib/required文件夹下的jar包全部添加到工程的library里面,另外还需添加slf4j的实现包slf4j-log4j12-1.6.4.jar和log4j的实现包log4j-1.2.16.jar,还有别忘了把JDBC的驱动jar包也加入到library里面。
配置hibernate.cfg.xml
1:缺省名称为hibernate.cfg.xml
2:存放在当前classes的根目录下,开发的时候在src根下就可以了
3:主要有如下四部分配置 :
(1)与DB的连接
(2)可选配置
(3)资源文件注册
(4)二级缓存
4:配置的时候可以到Hibernate发行包里面找个hibernate.cfg.xml的例子,比如可以用“hibernate-release-4.1.4\project\etc”下面的hibernate.cfg.xml作例子,当需要配置缓存的时候可以参考ehcache.xml文件,还有Hibernate的属性模版文件,你们都是可选的属性设置方法,另外该文件夹下的log4j.properties日志文件也可以用来参考
下面是手动用java代码来启动Hibernate4.1.4:
启动Hibernate其实就是创建一个SessionFatory,那么就可以用SessionFactory创建出来的一个个Session对象进行对数据库的持久化操作了。
Java代码
public class HibernateSessionFactoryUtil {
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory by xml file , default value: /hibernate.cfg.xml
sessionFactory = new Configuration()
.configure(CONFIG_FILE_LOCATION).buildSessionFactory();
/*
* 在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", "用户名");
builder.applySetting("connection.password", "密码");
builder.applySetting("connection.pool_size", "连接池最小连接数");
builder.applySetting("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
builder.applySetting("show_sql", "true");
MetadataSources sources = new MetadataSources( builder.buildServiceRegistry() );
sources.addResource("XML形式加载映射文件...xml");
sources.addAnnotatedClass(annoation形式映射...class);
MetadataImpl metadata = (MetadataImpl) sources.buildMetadata();
sessionFactory = metadata.getSessionFactoryBuilder().buildSessionFactory();
} catch (Throwable ex) {
System.out.println("【ERROR】创建SessionFactory对象出错,原因是:");
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
相关文章推荐
- 相见恨晚之gstreamer核心源码走读typefind原理浅析(二)
- 虚拟现实眼镜(增强现实眼镜)成像原理浅析
- 浅析Java web程序之客户端和服务器端交互原理
- 关于微信检测SDK应用的原理浅析(iOS)
- java aqs原理浅析
- 线程池原理浅析
- React同构直出原理浅析
- Netty实现原理浅析
- 类继承中构造方法的调用原理浅析
- HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】(2)
- HashMap的实现原理浅析
- 浅析Java中的反射机制原理
- iPhone的Push(消息推送通知)功能原理浅析
- Android框架浅析之锁屏(Keyguard)机制原理
- iPhone的Push(推送通知)功能原理浅析
- 安卓手机屏幕投射到电脑以及一台电脑控制多台手机技术原理浅析
- Android框架浅析之锁屏(Keyguard)机制原理
- C# 2.0 中Iterators的改进与实现原理浅析
- [原创]Android Studio的Instant Run(即时安装)原理分析和源码浅析
- GWT RPC 原理浅析二