前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java EE实用教程笔记----(7)第七章 Hibernate基础

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

作者头像
浩Coding
发布2019-07-03 11:17:43
8200
发布2019-07-03 11:17:43
举报
文章被收录于专栏:浩Coding

本章开讲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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩Coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档