第4章Hibernate应用.ppt
《第4章Hibernate应用.ppt》由会员分享,可在线阅读,更多相关《第4章Hibernate应用.ppt(94页珍藏版)》请在三一文库上搜索。
1、第4章 Hibernate应用,4.1 Hibernate概述,4.2 Hibernate应用基础,4.3 Hibernate关系映射,4.4 Hibernate高级功能,4.5 Hibernate与Struts 2整合应用,4.1 Hibernate概述,1. ORM简介 对象/关系映射ORM(Object-Relation Mapping)是用于将对象与对象之间的关系对应到数据库表与表之间的关系的一种模式。简单地说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。对象和关系数据是业务实现的两种表现形式,业务实体在内存中表现为对象,在数据库中
2、表现为关系数据。内存中的对象之间存在着关联和继承关系。而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。一般的ORM包括四个部分:对持久类对象进行CRUD操作的API、用来规定类和类属性相关查询的语言或API、规定mapping metadata的工具,以及可以让ORM实现同事务对象一起进行dirty checking、lazy association fetching和其他优化操作的技术。,4.1 Hibernate概述,2. Hibernate体系结构 Hibernate作为模型层/数据访问层。它通过配置
3、文件(hibernate.cfg.xml或hibernate.properties)和映射文件(*.hbm.xml)把Java对象或持久化对象(Persistent Object,PO)映射到数据库中的数据表,然后通过操作PO,对数据库中的表进行各种操作,其中PO就是POJO(普通Java对象)加映射文件。Hibernate的体系结构如图4.1所示。,图4.1 Hibernate体系结构,4.2 Hibernate应用基础,4.2.1 Hibernate应用实例开发 开发Hibernate项目的步骤如下。 1建立数据库及表 本书使用SQL Server 2005数据库。在XSCJ数据库中建立K
4、CB表,其表结构如附录A.2所示。 2在MyEclipse中创建对SQL Server 的连接 启动MyEclipse,选择【Window】【Open Perspective】【MyEclipse Database Explorer】菜单项,打开MyEclipse Database浏览器,右击菜单,如图4.2所示,选择【New】菜单项,出现如图4.3所示的对话框,编辑数据库连接驱动。,4.2.1 Hibernate应用实例开发,图4.2 MyEclipse Database浏览器, 创建一个新的连接,图4.3 编辑数据库连接驱动,4.2.1 Hibernate应用实例开发,编辑完成以后,在My
5、Eclipse Database浏览器中,右击刚才创建的MyConn数据库连接,选择“Open connection”菜单项,打开名为“MyConn”的数据连接,如图4.4所示。,图4.4 打开数据库连接,4.2.1 Hibernate应用实例开发,3创建Web项目,命名为“HibernateTest” 4添加Hibernate开发能力 右击项目名HibernateTest,选择【MyEclipse】【Add Hibernate Capabilites】菜单项,出现如图4.5所示的对话框,选择Hibernate框架应用版本及所需要的类库。,图4.5 选择Hibernate版本及所需Jar包,4
6、.2.1 Hibernate应用实例开发,单击【Next】按钮,进入如图4.6所示界面。创建Hibernate配置文件hibernate.cfg.xml,将该文件放在src文件夹下,后面会详细介绍该文件内容。这里先说明添加Hibernate开发功能的步骤。,图4.6 创建配置文件hibernate.cfg.xml,4.2.1 Hibernate应用实例开发,单击【Next】按钮,进入如图4.7所示界面,指定Hibernate数据库连接细节。由于在前面已经配置一个名为MyConn的数据库连接,所以这里只需要选择DB Driver为“MyConn”即可。,图4.7 指定hibernate数据库连接
7、,4.2.1 Hibernate应用实例开发,单击【Next】按钮,出现如图4.8所示界面。Hibernate中有一个与数据库打交道重要的类Session。而这个类是由工厂SessionFactory创建的。这个界面询问是否需要创建SessionFactory类。如果需要创建,还需要指定创建的位置和类名。这些接口都会在后面详细介绍。单击【Finish】按钮,完成Hibernate的配置。,图4.8 创建SessionFactory类来简化Hibernate会话处理,4.2.1 Hibernate应用实例开发,5. 生成数据库表对应的Java类对象和映射文件 首先在MyEclispse下创建一个
8、名为“org.model”的包,这个包将用来存放与数据库表对应的Java类POJO。 从主菜单栏,选择【Windows】【Open Perspective】【Other】【MyEclipse Database Explorer】菜单项,打开MyEclipse Database Explorer视图。打开前面创建的MyConn数据连接,选择【XSCJ】【dbo】【TABLE】菜单项,右击KCB表,选择【Hibernate Reverse Engineering】菜单项,如图4.9所示,将启动Hibernate Reverse Engineering向导,该向导用于完成从已有的数据库表生成对应的J
9、ava类和相关映像文件的配置工作。,图4.9 Hibernate反向工程菜单,4.2.1 Hibernate应用实例开发,首先,选择生成的Java类和映像文件所在的位置,如图4.10所示。POJO(Plain Old Java Object,简单的Java对象),通常也称为VO(Value Object,值对象)。,图4.10 生成Hibernate映射文件和Java类,4.2.1 Hibernate应用实例开发,使用POJO名称是为了避免和EJB混淆起来,其中有一些属性及getter、setter方法。当然,如果有一个简单的运算属性也是可以的,但不允许有业务方法。单击【Next】按钮,进入如
10、图4.11所示的界面,选择主键生成策略。,图4.11 配置反向工程细节,4.2.1 Hibernate应用实例开发,6. 创建测试类 在src文件夹下创建包test,在该包下建立测试类,命名为Test.java,其代码。 7. 运行 因为该程序为Java Application,所以可以直接运行。运行程序,控制台就会打印出“机电”。在完全没有操作数据库的情况下,就完成了对数据的插入。下面将详细讲解各文件的作用。,4.2.2 Hibernate各种文件的作用,1. POJO类和其映射配置文件 POJO类如下: package org.model; public class Kcb impleme
11、nts java.io.Serializable private String kch; / 对应表中KCH字段 private String kcm; / 对应表中KCM字段 private Short kxxq; / 对应表中KXXQ字段 private Integer xs; / 对应表中XS字段 private Integer xf; / 对应表中XF字段 public Kcb() / 上述属性的getter和setter方法 可以发现,该类中的属性和表中的字段是一一对应的。那么通过什么方法把它们一一映射起来呢?就是前面提到的*.hbm.xml映射文件。这里当然就是Kcb.hbm.xm
12、l,其代码。,4.2.2 Hibernate各种文件的作用,该配置文件大致分为3个部分: (1)类、表映射配置 name属性指定POJO类为org.model.Kcb,table属性指定当前类对应数据库表KCB。 (2)id映射配置 Hibernate的主键生成策略分为三大类:Hibernate对主键id赋值、应用程序自身对id赋值、由数据库对id赋值。 assigned:应用程序自身对id赋值。当设置时,应用程序自身需要负责主键id的赋值。例如下述代码: Kcb kc=new Kcb(); / 创建POJO类对象 kc.setKch(“198“); / 设置课程号 kc.setKcm(“机电
13、“); / 设置课程名 kc.setKxxq(new Integer(5).shortValue(); / 设置开学学期 kc.setXf(new Integer(4).shortValue(); / 设置学分 kc.setXs(new Integer(59).shortValue(); / 设置学时,4.2.2 Hibernate各种文件的作用,native:由数据库对id赋值。当设置时,数据库负责主键id的赋值,最常见的是int型的自增型主键。 hilo:通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。 seqhilo:与hi/lo类似,通过hi/lo算法实现
14、的主键生成机制,只是主键历史状态保存在sequence中,适用于支持sequence的数据库,如Oracle。 increment:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。 identity:采用数据库提供的主键生成机制,如SQL Server、MySQL中的自增主键生成机制。 sequence:采用数据库提供的sequence机制生成主键,如Oracle sequence。 uuid.hex:由Hibernate基于128位唯一值产生算法,根据当前设备IP、时间、JVM启动时间、内部自增量等4个参数
15、生成十六进制数值(编码后长度为32位的字符串表示)作为主键。即使是在多实例并发运行的情况下,这种算法在最大程度上保证了产生id的唯一性。当然,重复的概率在理论上依然存在,只是概率比较小。 uuid.string:与uuid.hex类似,只是对生成的主键进行编码(长度16位)。 foreign:使用外部表的字段作为主键。 select:Hibernate 3新引入的主键生成机制,主要针对遗留系统的改造工程。,4.2.2 Hibernate各种文件的作用,(3)属性、字段映射配置 属性、字段映射将映射类属性与库表字段相关联。 name=“kcm“ 指定映像类中的属性名为“kcm”,此属性将被映像到
16、指定的库表字段KCM。type=“java.lang.String“指定映像字段的数据类型。column name=“KCM“指定类的kcm属性映射KCB表中的KCM字段。,4.2.2 Hibernate各种文件的作用,2. hibernate.cfg.xml文件 该文件是Hibernate重要的配置文件,配置该文件主要是配置SessionFractory类。其主要代码及解释。 3. HibernateSessionFactory HibernateSessionFactory类是自定义的SessionFactory,名字可以根据自己的喜好来决定。这里用的是HibernateSessionFa
17、ctory,其内容及解释。 在Hibernate中,Session负责完成对象持久化操作。该文件负责创建Session对象,以及关闭Session对象。从该文件可以看出,Session对象的创建大致需要以下3个步骤: 初始化Hibernate配置管理类Configuration。 通过Configuration类实例创建Session的工厂类SessionFactory。 通过SessionFactory得到Session实例。,4.2.3 Hibernate核心接口,1. Configuration接口 Configuration负责管理Hibernate的配置信息。Hibernate运行时
18、需要一些底层实现的基本信息。这些信息包括:数据库URL、数据库用户名、数据库用户密码、数据库JDBC驱动类、数据库dialect。用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据库类型到特定数据库数据类型的映射等。 使用Hibernate必须首先提供这些基础信息以完成初始化工作,为后续操作做好准备。这些属性在Hibernate配置文件hibernate.cfg.xml中加以设定,当调用: Configuration config=new Configuration().configure(); 时,Hibernate会自动在目录下搜索hibernate.c
19、fg.xml文件,并将其读取到内存中作为后续操作的基础配置。,4.2.3 Hibernate核心接口,2. SessionFactory接口 SessionFactory负责创建Session实例,可以通过Configuration实例构建SessionFactory。 Configuration config=new Configuration().configure(); SessionFactory sessionFactory=config.buildSessionFactory(); Configuration实例config会根据当前的数据库配置信息,构造SessionFacory
20、实例并返回。SessionFactory一旦构造完毕,即被赋予特定的配置信息。也就是说,之后config的任何变更将不会影响到已经创建的SessionFactory实例sessionFactory。如果需要使用基于变更后的config实例的SessionFactory,需要从config重新构建一个SessionFactory实例。 SessionFactory保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和Statement Pool。由此可见,SessionFactory的创建过程非常复杂、代价高昂。这也意味着,在系统设计中充分考虑到SessionFactory的
21、重用策略。由于SessionFactory采用了线程安全的设计,可由多个线程并发调用。,4.2.3 Hibernate核心接口,3. Session接口 Session是Hibernate持久化操作的基础,提供了众多持久化方法,如save、update、delete等。通过这些方法,透明地完成对象的增加、删除、修改、查找等操作。 同时,值得注意的是,Hibernate Session的设计是非线程安全的,即一个Session实例同时只可由一个线程使用。同一个Session实例的多线程并发调用将导致难以预知的错误。 Session实例由SessionFactory构建: Configuratio
22、n config=new Configuration().configure(); SessionFactory sessionFactory=config.buldSessionFactory(); Session session=sessionFactory.openSession(); 4. Transaction接口 Transaction是Hibernate中进行事务操作的接口,Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction,甚至可以是CORBA 事务。之所以这样设计是可以让开发者能够使用一个统一的操作界
23、面,使得自己的项目可以在不同的环境和容器之间方便地移值。事务对象通过Session创建。例如以下语句: Transaction ts=session.beginTransaction();,4.2.3 Hibernate核心接口,5. Query接口 在Hibernate 2.x中,find()方法用于执行HQL语句。Hibernate 3.x废除了find()方法,取而代之的是Query接口,它们都用于执行HQL语句。Query和HQL是分不开的。 Query query=session.createQuery(“from Kcb where kch=198”); 例如以下语句: Query
24、 query=session.createQuery(“from Kcb where kch=?“); 就要在后面设置其值: Query.setString(0, “要设置的值“); 上面的方法是通过“?”来设置参数,还可以用“:”后跟变量的方法来设置参数,如上例可以改为: Query query=session.createQuery(“from Kcb where kch=:kchValue“); Query.setString(“kchValue“,“要设置的课程号值“); 其使用方法是相同的,例如: Query.setParameter(0, “要设置的值“); Query还有一个li
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 应用
链接地址:https://www.31doc.com/p-2604698.html