hibernate作为一个成熟且强大的持久层框架,集诸多持久层设计思想之大成,是一种ORM(对象关系映射)映射工具,能建立面向对象的域模型与关系模型之间的映射。
一、分层体系结构
分层体系结构定义了实现不同关系代码之间的接口,允许关系实现方式的改变不会对其它层的代码造成重大的破坏。
同时,分层也决定了其间出现的中间层的类型。分层规则如下:
①层由上到下进行通信。每一层仅依赖于其直接的下层;
②除了其直接下层,每一层都不知道任何其它层。
二、MVC模式
在分层体系结构中,最常见、最简单也是最有效的就是MVC(Model View Control)模式了。
①表示层,即MVC模式中的V,提供与用户交互的界面。GUI和Web页面是表示层的两个典型的例子。
②业务逻辑层,即MVC模式中的C,用于实现各种业务逻辑,它相当于整个系统的大脑,负责思考数据如果取得,如何处理以及数据流向何处。
③数据库层,即MVC模式中的M,代表数据实体,也可以是数据库,负责存放和管理应用程序的持久性业务数据。
持久层是在MVC三层架构的基础上提出的。在提出持久层之前,业务逻辑层在实现业务逻辑的同时,还需要访问数据库,这为业务逻辑的扩展增加了难度。
有了持久层,业务逻辑层只需负责业务逻辑的实现,对数据的操作则交给持久层,使每一段业务逻辑代码的目的更明确,对后台数据库的改变也变得非常简单。
三、持久层的意义在于
持久层封装了数据访问细节,为业务逻辑层提供了面向对象的API
①代码可重用性高,能够完成所有的数据库访问操作
②能够支持多种数据库平台
③具有相对独立性,底层数据发生变化时,只需修改持久层代码,只要对其上层提供的API不变,则不用修改业务逻辑层的代码。
四、ORM(Object-Relational Mapping)的解决方案
①在持久化类的对象上执行基本的CRUD(添加、查询、更新和删除)操作的一组API;
②用于指定查询的一种语言或一组API,这些查询会引用类和类属性;
③用于指定映射元数据的工具;
④实现ORM的一项技术,用来与事务对象交互以完成脏读、关联数据的延迟加载和其他优化功能。
五、ORM技术的优缺点
ORM作为对象到关系的映射,具有以下优点
①提高了开发效率。
由于ORM可以自动对实体对象与数据库中的表进行字段与属性的映射,所以实际操作中已经不再需要一个专用的,庞大的数据库访问层。
②ORM提供了对数据库的映射,能够像操作对象一样从数据库中获取数据,而不用直接进行SQL编码
ORM技术的缺点
①系统结构方面。采用ORM的系统一般都是多层系统,系统层次增加了,效率就会降低
②性能方面。主要体现在对持久层的提取和对数据的加工处理上。
采用ORM时,系统可能将全部的数据提取到内存对象中,然后再进行过滤盒加工处理,这样就容易产生性能问题
③对象持久化方面。ORM一般会持久化所有的属性,这对有些应用是不希望发生的。
六、域模型
域模型是对一个真实事物的模拟实现,是抽象的结果。它可以代表业务领域中的人、地点、事物或是概念,它能够真实地反映出模型中元素之间的关系。
构成域模型的基本元素是对象,可以分为实体域对象、过程域对象和事件域对象3种。
域对象之间的关系
①关联:指类之间的引用关系
②依赖:指类之间的访问关系
③聚集:指的是整体与部分之间的关系
④一般化:指类之间的继承关系
七、常用域对象的持久化技术
①JDBC直接访问数据库。Java DataBase Connectivity standard是一个面向对象的应用程序接口
②主动域对象模式。
③ORM模式
④CMP模式(Container-Managed Persistenc)容器管理的持久化
⑤JDO模式(Java Data Object)是java对象持久化的新规范。
八、Hibernate特点如下:
Hibernate在java对象与关系数据库之间起到了一个桥梁的作用,负责两者之间的映射。在hibernate内部还封装了JDBC技术,向上一层提供面向对象的数据访问API接口。
①它负责协调软件与数据的交互,提供了管理持久化数据的完整方案,让开发者能够专注于业务逻辑的开发;
②应用者不需要遵循太多的规则和设计模式,能够灵活地运用;
③它是一个开放源代码的映射框架,对JDBC只做了轻量级的封装,让java程序员可以随心所欲地运用面向对象的思想操纵数据库,无需考虑资源的问题。
九、Hibernate核心接口
①Configuration接口
Configuration类是hibernate的入口,负责在hibernate初始化时加载默认文件路径下的配置文件信息(hibernate.properties或hibernate.cfg.xml)到计算机内存,
并通过它的对象加载指定的映射文件到内存,最后创建一个SessionFactory对象,把读入的配置信息拷贝到SessionFactory对象的缓存中。
②SessionFactory接口
SessionFactory负责创建Session实例,每个SessionFactory类的实例对应一个数据库。
SessionFactory类的实例是重量级(下面还要提到"轻量级"的概念,区分它们是根据对象占用缓存的大小)的。
因为它占用很大的缓存,用来存放预定义的SQL语句和映射元数据等,所以每个数据可最好只创建一个SessionFactory实例,在初始化时完成。
它的线程是安全的,可以被应用的多个线程共享。
③Session接口
Session是hibernate持久化操作的基础,它负责管理所有与持久化相关的操作,例如数据库的存取、事务的管理和对象的生命周期等。
Session与SessionFactory恰恰相反,它不是线程安全的,应避免多个线程共享一个Session;它是轻量级的,创建和销毁不会浪费太多的资源,可以为每个请求分配一个Session,在每次请求过程中及时创建和销毁Session实例,减少资源的浪费。
④Transaction接口
Transaction类负责hibernate的数据库事务。其实hibernate本身并不具有管理事务的能力,只是对底层事务接口进行了封装,这样做有利于在不同的环境或容器中移植,也可以直接访问底层的事务接口,但那样不利于应用的移植。
⑤Query和Criteria接口
Query和Criteria接口负责hibernate的查询操作
Query实例封装了一个HQL(Hibernate Query Language)查询语句。HQL与SQL有些类似,只是HQL是面向对象的,它操作的是持久化类的类名和该类的属性名,而SQL操作的是表名和字段名
Criteria实例完全封装了字符串形式的查询语句,它比Query实例要面向对象,它更适合于执行动态查询。