Java EE实用教程笔记----(7)第七章 Hibernate基础

本章开讲Hibernate框架啦,教程比较基础,如果有能力的话大家还是读下Hibernate的源码,这样对了解Hibernate框架运行机制和原理是非常有帮助的,而且后面的文章只是讲个大体框架,有不懂的小伙伴可以在公众号留言,我会及时回复!

第一部分 Hibernate基础

7.1 ORM简介

Hibernate是一个开源的对象关系映射框架,它对JDBC进行了轻量级的封装。应用Hibernate框架,程序员可以不用面对烦琐的面向过程的数据库操作,而是用面向对象的方式操作数据库,不仅提高了开发效率,还可以避免传统的JDBC编程时容易产生的错误。总结来说Hibernate优点:面向对象操作数据库,可以不写一句SQL通过配置文件就能操作数据库。缺点:上手困难,配置复杂,数据库调优困难。

ORM--Object Relation Mapping对象关系映射,其实从字面上就可以理解其含义,就是把关系与对象映射起来,关系指的是关系数据库,而对象指的是程序中的类对象

例如,在数据库中有一个用户表userTable,该表中有id、username、password三个字段(其中id是主键),这样一个表就可以在程序中映射成类“UserTable. java”,该类中定义3个属性,对应表中3个字段,如图7.1所示:

从上图可以看出,ORM把数据库的关系映射为程序的类对象,这样就从面向过程的操作转为面向对象的操作了

7.2 Hibernate各种文件的作用

7.2.1 POJO类及其映射文件

本例(就是下面要讲的实例)的POJO类为UserTable,其源码位于org.vo包的UserTable.java中,代码为:

该类是一个典型的POJO类,定义了3个属性并自动生成了它们的get和set方法,可以发现,类中的属性与表的字段是一一对应的。那么通过什么方法把它们相互关联起来呢?正是*.hbm.xml映射文件!其中“*”一般定义为要映射的类名,该文件在项目中的位置一般与POJO类处于同一目录,故在该包下生成的映射文件就是UserTable.hbm.xml,代码所示:

可以看出,该配置文件的根元素为<hibernate-mappin>,其内部一般会配置<calss>元素,用来描述一个POJO类与之映射的表名,在<calss>标签内部还有一些子标签,用来指定类中属性与表字段的映射。如,<id>标签支出POJO的标识符和数据库表主键的映射关系,而<generator>用来指定主键生成策略,这个我们下一章会详细讲出。<property>则与数据库中表的字段一一对应。

Hibernate映射文件是实体对象与数据库关系表之间项目转换的重要依据。一般来说,一个数据库表DB表对应一个POJO类,同时对应一个hbm.xml映射文件。

7.2.3 Hibernate核心配置文件 -- hibernate.cfg.xml

应用Hibernate就要配置它,系统在添加Hibernate能力时会自动创建Hibernate核心配置文件hibernate.cfg.xml。这里的自动创建是指的创建Hibernate程序时IDE自动添加的。各个标签的意义如图所示:

这个文件注意用于配置数据库连接和Hibernate运行时所需的各种属性,文件名一般默认为hibernate.cfg.xml,Hibernate于初始化期间会自动在CLASSPATH中寻找这个文件,并读取其中的配置信息,为后期操作数据库做准备。

7.3 HibernateSessionFactory类

HibernateSessionFactory类是自定义的SessionFactory,由Hibernate框架自动生成,名字可以根据自己的喜好来决定。这个实例用的是HibernateSessionFactory。在Hibernate中,Session负责完成对象持久化操作(操纵数据库),所以这个Session工作类其作用为:

  1. 初始化Hibernate配置管理类Configuration。
  2. 通过Configuration类实例创建Session的工厂类SessionFactory。
  3. 通过SessionFactory得到Session实例。

7.3.1获取Session对象的流程

Hibernate获取Session对象的主要流程可分为以下4个步骤(相关代码语句都在下面HibernateSessionFactory类的源码中):

有关Session的一些操作及事务的处理会在后面的章节中详细讲解。纵观上例,可从总体上得出Hibernate大致的体系结构,如图7.14所示。

7.4 Hibernate核心接口的介绍

1. Configuration接口:Hibernate的配置信息

使用Hibernate必须首先提供这些基础信息以完成初始化工作,为后续操作做好准备。这些属性在Hibernate配置文件hibernate.cfg.xml中加以设定,当调用:

时,Hibernate会自动在根目录(即classes)下搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置。

2. SessionFactory接口:创建Session实例,维护数据库缓冲池

SessionFactory负责创建Session实例用于操纵数据库对象,自Hibernate 4.0起,构建SessionFactory需要先构造一个ServiceRegistry对象:

ServiceRegistry是Service的注册表,它为Service提供了一个统一的加载/初始化/存放/获取机制,会根据当前的数据库配置信息,应用代理来构造SessionFacory实例并返回。SessionFactory一旦构造完毕,即被赋予特定的配置信息,也就是说,ServiceRegistry的任何变更将不会影响到已经创建的SessionFactory实例。如果需要使用基于变更后的ServiceRegistry实例的SessionFactory,需要以新的ServiceRegistry作为参数来重新构建SessionFactory实例:

3. Session接口:CRUD提供持久化方法操纵DB

同时,值得注意的是,Hibernate框架中Session的设计是非线程安全的,即一个Session实例只可由一个线程使用,对同一个Session实例的多线程并发调用将导致难以预知的错误。Session实例由SessionFactory构建,代码如下:

4. Transaction接口:数据库事务操作

Transaction是Hibernate中进行事务操作的接口,Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction,甚至可以是CORBA事务。之所以这样设计是为了让开发者能够使用一个统一的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。事务对象通过Session创建,用如下语句:

5. Query接口:查询接口

Query接口是Hibernate的查询接口,用于向数据库中查询对象,在它里面包装了一种HQL(Hibernate Query Language)查询语言,采用了新的面向对象的查询方式,是Hibernate官方推荐使用的标准数据库查询语言。Query和HQL是分不开的,写出的查询语句形如:

上面的语句中查询条件id的值“1”是直接给出的,如果没有给出,而是设为参数就要用Query接口中的方法来完成。例如以下语句:

就要在后面设置其值:

上面的方法是通过“?”来设置参数的,还可以用“:”后跟变量的方法来设置参数,如上例可以改为:

由于上例中的id为int类型,所以设置的时候用setInt(…),如果是String类型就要用setString(…)。还有一种通用的设置方法,就是setParameter()方法,不管是什么类型的参数都可以应用。其使用方法是相同的,例如:

Query还有一个list()方法,用于取得一个List集合的示例,此示例中包含的集合可能是一个Object集合,也可能是Object数组集合。例如:

当查询了多条纪录后,就可以用list遍历得到数据啦。

第二部分 Hibernate实例

本章实例:HibernateDemo

这里我们用的IDE(集成开发环境)MyEclipse,大家也可以用Eclipse或者IDEA,只要有Hibernate插件就行。

准备步骤:设置数据源

1 :在MyEclipse 2017开发环境中,选择主菜单【Window】→【Perspective】→【Open Perspective】→【Database Explorer】,即可切换至MyEclipse 2017的DB Browser(数据库浏览器)模式,在左侧的子窗口中右击鼠标,选择菜单【New…】,打开对话框配置数据库驱动,如图所示:

2 :在打开【Database Driver】对话框的“New Database Connection Driver”页中,配置SQL Server 2014驱动,编辑连接驱动的各项参数,具体操作步骤见图中的①~⑨标注:

然后开始填各项连接数据,记得勾上下面保存密码的选项:

3 : 点击测试按钮,如果连接的URL和账号密码都正确,则会弹出连接成功的窗口:

4 :最后点击下一步,选择“Display all Schemas”,点击finish即可:

在DB browser面板就可以直接连接数据库了:

1.创建数据库及表

开发之前要做好相关的准备工作,首先要建立数据库及表,在MySQL中建立数据库“SSH”,在该库中建立表“userTable”,表的结构如表所示:

注意: MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写。

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

1、数据库名与表名是严格区分大小写的

2、表的别名是严格区分大小写的;

3、列名与列的别名在所有的情况下均是忽略大小写的;

4、变量名也是严格区分大小写的;

2.创建Java项目

1 :在Eclipse中,选择主菜单【File】→【New】→【Java Project】,出现如图所示的【New Java Project】窗口,填写“Project Name”栏(项目名)为HibernateDemo:

2 :添加Hibernate开发能力

(1)右击项目HibernateDemo,选择菜单【Configure Facets...】→【Install Hibernate Facet】,启动【Install Hibernate Facet】向导对话框,在“Project Configuration”页的“Hibernate specification version”栏右侧的下拉列表中选择要添加到项目中的Hibernate版本,为了最大限度地使用MyEclipse 2017集成的Hibernate工具,这里选择版本号为最新的Hibernate 5.1,如图7.3所示,单击【Next】按钮。

(2)在第一个“Hibernate Support for MyEclipse”页,创建Hibernate配置文件和SessionFactory类,如图7.4所示。

(3)单击【Next】按钮,进入第二个“Hibernate Support for MyEclipse”页,如图7.5所示,图中红色框中显示的是我们之前保存的数据库连接:

(4)单击【Next】按钮,在“Configure Project Libraries”页选择要添加到项目中的Hibernate框架类库,对于一般的应用来说,并不需要使用Hibernate的全部类库,故只需选择必要的库添加即可,这里仅勾选最基本的核心库“Hibernate 5.1 Libraries”→“Core”,如图7.6所示。

(5)单击【Finish】按钮打开透视图,在开发环境主界面的中央出现Hibernate配置文件“hibernate.cfg.xml”的编辑器,在其“Configuration”选项标签页可看到本例Hibernate的各项配置信息,如图7.7所示。

另外,数据库的驱动包也被自动载入进来,此时项目的目录树呈现如图7.8所示的状态,表明该项目已成功添加了Hibernate能力。

3 :Hibernate反向工程

反向工程的操作步骤如下:

(1)选择主菜单【Window】→【Perspective】→【Open Perspective】→【Database Explorer】,进入MyEclipse的DB Browser模式。打开sqlsrv连接,选中数据库表userTable右击,选择菜单【Hibernate Reverse Engineering…】,如图7.9所示,将启动【Hibernate Reverse Engineering】向导对话框,用于完成从已有的数据库表生成对应的POJO类和相关映射文件的配置工作。

(2)在向导的第一个“Hibernate Mapping and Application Generation”页中,选择生成的类及映射文件所在的位置,如图7.10所示:

(3)单击【Next】按钮,进入第二个“Hibernate Mapping and Application Generation”页,配置映射文件的细节,主键生成类型选择Native,如图7.11所示:

(4)单击【Next】按钮,进入第三个“Hibernate Mapping and Application Generation”页,该页主要用于配置反向工程的细节,这里保持默认配置即可,点击Finish即可。最后的项目如图7.12所示:

3.编写测试类

在src下创建包org.test,在该包下建立测试类,命名为HibernateTest.java,其代码为(详见文末GitEE代码下载地址):

注意:项目一定要导入数据库连接包!

可以发现,该测试类是包含主函数的类,故可以直接按“Java Application”程序运行,运行后,控制台输出结果如图7.13所示:

为什么程序能创建一个对象(一条数据库纪录),而且后来又能修改和删除这条纪录呢,当然是通过ID找到的啦,哈哈,session.get()/load(),参数有两个get / load(Class clazz,Serialize id),第一个是需要查找的对象类型,第二个是对应的主键id。

大家可以做实验看看哦,修改session.get()里面第二个参数的主键,就可以找到相应的表纪录啦。

下章开始讲Hibernate的映射机制哦。

参考文章:

https://www.cnblogs.com/sky230/p/5876589.html

https://blog.csdn.net/litianxiang_kaola/article/details/53700034

本章实例源代码GitEE地址:

https://gitee.com/jahero/bookManage.git

原文发布于微信公众号 - 浩Coding(gh_c4a2e63d2ca7)

原文发表时间:2018-12-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券