Java学习笔记08——持久层框架Hibernate

来源:互联网 发布:云计算吧 编辑:程序博客网 时间:2024/05/16 01:56

一、Hibernate框架

Hibernate将关系型数据库中的数据映射成Java程序中可操作的对象,可以使用Hibernate API对关系型数据库进行操作。

1.Hibernate开发环境

JDK+Eclipse(下载web,xml组件)+MySQL+Maven(http://maven.apache.org/download.cgi下载→安装→配置MAVEN_HOME环境变量,添加“;%MAVEN_HOME%\bin”到path环境变量→验证maven—v)。

2.Maven简介

(1)Maven仓库:没有Maven时,项目用到的.jar文件通常要拷贝到/lib目录,项目多了,拷贝的文件副本就多了,占用磁盘空间,且难于管理。Maven使用一个称之为仓库的目录,根据构件的坐标统一存储这些构件的唯一副本,在项目中通过依赖声明,可以方便地引用构件。分为本地仓库和远程仓库,远程仓库分为中央仓库、私服和其他公共远程仓库,中央仓库是Maven核心自带的远程仓库。寻找构件时,本地仓库→远程仓库下载→报错。
(2)坐标:maven的所有构件均通过坐标进行组织管理,由5个元素定义,包括必须元素——
groupId:定义当前maven项目所属的实际项目,与Java包名类似,通常与域名反向一一对应;
artifactId:定义当前Maven项目的一个模块,默认情况下Maven生成的构件文件名以artifactId开头,如javax.servlet-api-3.1.0.jar;
version:定义项目版本;
可选元素——packaging:定义项目打包方式,默认为jar,还有war,pom,zip...;
以及classfier不能直接定义的元素。
(3)依赖管理:使用Maven在pom.xml文件总声明依赖,可以方便依赖的管理。
type:定义依赖类型,对应构件中定义的packaging,可不声明,默认为jar;
scope:声明依赖范围,执行不同的Maven命令,会使用编译classpath、测试classpath、运行classpath的其中一种classpath,scope选项的值决定了该依赖构件会被引入到哪一个classpath中,取值有compile(默认值,对编译、测试、运行三种classpath都有效),test(只在测试的时候需要,如junit),provided(编译和测试有效,运行无效,如servlet-api)。
(4)依赖传递:a依赖b,b又依赖c,a对c就是传递依赖。此时只需要引入a构件的依赖,Maven会自动为我们引入依赖和传递依赖。

3.使用Maven的好处

Maven可以对第三方依赖库进行统一的版本管理,并统一项目的目录结构,还可以统一项目的构件,Maven还支持多种插件,使用Maven可以大大降低项目文件的大小。

4.Eclipse中Maven的使用

Eclipse Luna已经集成了Maven插件,Maven并不执行任何具体的构建任务,所有这些任务交给具体的插件完成。也可以使用本地安装的Maven插件。


二、Hibernate应用

1.JDBC缺点

Java应用必须通过JDBC驱动程序来和特定的数据库系统连接。使用JDBC会使实现业务逻辑的代码和数据库访问代码混杂在一起,程序结构不清晰;在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思维来编写程序;业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,必须手工修改程序代码中所有相关的SQL语句;如果程序代码中的SQL语句包含语法错误,在编译时不能检查这种错误,只有在运行时才能发现,增加了调试的难度。

2.Hibernate简介

是Java应用和关系型数据库之间的桥梁,能进行Java对象和关系型数据库之间的映射。Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供面向对象的数据访问API,使得Java程序员可以使用面向对象编程思想来操纵数据库;可以应用在任何使用JDBC的场合。
Hibernate的优点:既不会渗透到上层域模型中,也不会渗透到下层数据模型中;软件开发人员可以独立设计域模型,数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范;对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高软件的灵活性,维护更加方便。

3.Hibernate应用结构

实体类通过对象映射文件与关系型数据库中表进行对应,对实体类的操作都被封装在BusinessService业务类中。使用Hibernate步骤:
(1)数据库初始化;
(2)创建持久化类,符合JavaBean规范,包含属性和getter/setter方法,必须提供不带参数的默认构造方法;
(3)创建Hibernate配置文件,位于应用的classpath中,默认名时hibernate.properties,Hibernate从中读取和数据库连接有关的信息,如数据库使用的SQL方言、数据库的驱动程序、连接数据库的URL、连接数据库的用户名、连接数据库的口令、是否在控制台显示sql语句;
(4)创建对象-关系映射文件:xml格式文件,应和(实体类.class)放在同一文件下,运行时Hibernate据此来生成各种SQL语句,如果需要映射多个持久化类,既可以在同一映射文件中映射所有类,也可以为每个类创建单独的映射文件,映射文件名与类同名;
(5)通过Hibernate API编写访问数据库:
初始化Hibernate→加载Customer类的对象-关系映射文件→创建SessionFactory实例→创建一个会话Session→开始一个事务→执行数据库操作→提交事务,如果数据库执行失败则回滚数据。


三、Java应用对Hibernate初始化

1.初始化过程

(1)创建Configuration类的实例,其构造方法把默认文件路径下的hibernate.properties配置文件中的配置信息读入到内存;
(2)调用Configuration类的addClass(实体类.class)方法,把默认文件路径下的xml文件中的映射信息读入到内存中;
(3)调用Configuration类的buildSessionFactory()方法创造SessionFactory实例;
(4)获取可以对数据库进行操作的Session会话。

2.SessionFactroy接口

一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory有以下特点:线程安全;不能随意创建或销毁它的实例,应用只访问一个数据库则只需要在应用初始化时创建一个SessionFactory实例,如果应用同时访问多个数据库,需要为每个数据库创建一个单独的SessionFactory实例。

3.Session接口

Session接口是Hibernate应用最广泛的接口,也被称为持久化管理器,提供和持久化相关的操作,如添加、更新、删除、加载和查询对象。Session的特点有非线程安全,创建和销毁不需要消耗太多资源,程序中可以经常创建或销毁Session对象,如为每个客户请求分配单独的Session实例。