🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### Hibernate引出 曾学过三层架构,三层分别为界面层、业务逻辑层、数据持久层。在javaweb中,界面层和业务逻辑层可以使用struts框架来封装一些常用的操作。而在我们的数据持久层中,对数据库的增删改查,我们经常要手动的控制事务,各种sql语句查询,各种参数传递,无论是对哪个表操作使用的均是同一种思路进行操作的。既然是同一种思路,那就是重复的东西了。而且我们还要和关系型数据库打交道,而不单单的是对象。而hibernate框架对此作了完美的封装。 ### Hibernate简介 hibernate是一个基于java的对象/关系数据库映射工具,它将对象模型表示的数据映射到SQL表示的关系模型上去。Hibernate管理java到数据库的映射,提供给了数据查询和存取的方法,减少了程序员对数据持久化层相关的编程任务。 ### 持久化与ORM 什么是持久化?是把数据保存到数据库或者某些存储设备中。在三层架构中,持久化是和数据库打交道的层次。在jsp的web开发中,经常有许多数据库连接、删除、查询等操作,在数据库相关工作中通过jdbc过于繁琐,就催生出了ORM(Object-RelationMapping),ORM作用是在关系数据库和对象之间做一个自动映射,这样在操作数据库时不需要使用复杂的sql语句,只要操作对象即可,ORM工具会自动将对象转换为sql语句操作。这样就只需要关注业务逻辑中的对象结构,而不用关心底层复杂的sql和jdbc代码。而Hibernate框架是ORM工具的一种,是关系/对象映射的解决方案(如图1.1)。 ![](https://box.kancloud.cn/2016-06-21_5769087ecbadf.jpg) 图1.1 ### Hibernate详细架构 Hibernate高层架构图和详细架构图如下图所示(图1.2和图1.3)。 ![](https://box.kancloud.cn/2016-06-21_576908bade1c4.jpg) 图1.2高层架构图 ![](https://box.kancloud.cn/2016-06-21_576908bb07eb7.jpg) 图1.3详细架构图 一些介绍。 (1)  会话工厂(SessionFactory) 会话工厂是对属于单一数据库的映射文件的线程安全的、不可变的缓存快照。它是会话的工厂类,可能持有一个可选的(二级)数据库缓存,可以在进程级别或集群级别保存可以在事务中重用的数据。 (2)  会话(Session) 对于Session我们是那么的熟悉,在javaweb开发中session可以用来保存用户会话过程中状态信息。而hibernate中的session是对象与数据库会话持久化管理器。 会话是单线程、声明短暂的对象,代表应用和持久化层之间的一次对话,封装了JDBC连接,事务的工程。保存必需持久化对象缓存,用于遍历对象图,或者表示查找对象。 (3)  持久化对象(PersistentObjects)和集合(Collection) 持久化对象是生命周期短暂的单线程对象,包含了持久化状态,他们从属于且仅从属于一个session。 (4)  临时对象(TransientObjects)和集合(Collection) 没有从属于一个session的持久化类的实例。它们可能是刚被程序实例化,还没来得及持久化的对象,或者是一个已经被关闭的Session所是实例化。 (5)  事务(Transaction) 单线程,应用程序用它表示一批不可分割操作。一个session在某些情况下可能跨越多个事务。 (6)  连接提供者(ConnectionProvider) JDBC连接工厂和池,从底层的Datasource或者DriverManager抽象而来。对应用程序不可见,但是可以被开发扩展或实现。 (7)  事务工厂(TransationFactory) 事务实例的工厂,对应用程序不可见,但可以被开发者扩展或实现。 ### Hibernate优点和缺点 优点:Hibernate持久层与数据库打交道的桥梁,彻底封装了JDBC,隐藏了更多的细节,有很好的移植性。JDBC语句繁琐,赋值执行我们不用再写相关代码,提高了效率,同时hibernate是一个轻量级框架(不依赖于别的运行),没有侵入性,测试简单,提高了生产力。 缺点:封装的太彻底导致不灵活,是用数据特定的东西比较不容易。对大量数据库的更新有问题,当程序大量查询统计,或批量更新无法使用数据库特性机制,例如存储过程等。 下一篇[Hibernate示例](http://blog.csdn.net/lovesummerforever/article/details/19170795)。