1、Hibernate-对象/关系映射,第三讲 Hibernate框架,要求:熟悉Java、SQL、JDBC,掌握面向对象的开发方法。课程目标:理解O/R Mapping原理,掌握Hibernate开发的相关知识,并能使用Hibernate进行实际项目开发。,一、要求与目标,模型不匹配(阻抗不匹配)Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等。解决办法1、使用JDBC手工转换。2、使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate、TopLink、OJB。,二
2、、引入,三、 O/R Mapping介绍,ORM的全称是Object/Relation Mapping,即对象/关系映射。ORM也可理解是一种规范,具体的ORM框架可作为应用程序和数据库的桥梁。面向对象程序设计语言与关系数据库发展不同步时,需要一种中间解决方案,ORM框架就是这样的解决方案。ORM并不是一种具体的产品,而是一类框架的总称,它概述了这类框架的基本特征:完成面向对象的程序设计语言到关系数据库的映射。基于ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。目前ORM的产品非常多,比如Apache组织下的OJB,Oracle的TopLink,J
3、DO,JPA等等。,对象-关系映射是一门非常实用的工程技术,它实现了Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。,O/R Mapping的优点提高生产效率可维护性更好性能厂商独立性,四、O/R Mapping的优点,五、目前流行的ORM持久层可选方案,六、为什么要选择Hibernate,Hibernate能在众多的ORM框架中脱颖而出,因为Hibernate与其他ORM框架对比具有如下优势:1、开源和免费的License,方便需要时研究源代码、改写源代码、进行功能定制。2、轻量级封装,避免引入过多复杂的问题,调试容
4、易,可减轻程序员负担。3、具有可扩展性,API开放。功能不够用时,可自己编码进行扩展。4、开发者活跃,产品有稳定的发展保障。Hibernate的工作方式 灵巧的设计,出色的性能表现,七、 Hibernate概述,Hibernate是一个免费的开源Java包,是目前最流行的ORM框架,它是一个面向Java环境的对象/关系数据库映射工具。也是一个轻量级的O/R Mapping框架,它问世的时间并不长,但已经成为目前最流行的持久层解决方案。 它使得程序与数据库的交互变得十分容易,更加符合面向对象的设计思想,像数据库中包含普通Java对象一样,而不必考虑如何把它们从数据库表中取出。使开发者可以专注于应
5、用程序的对象和功能,而不必关心如何保存它们或查找这些对象。甚至在对SQL语句完全不了解的情况下,使用hibernate仍然可以开发出优秀的包含数据库访问的应用程序。,八、 持久化层含义,基于B/S的典型三层架构,访问数据库代码(Dao)与业务逻辑(Service)混杂在一起带来了很多问题,这样的程序设计严重限制了程序的可扩展性和适应性,所以有必要要把涉及数据库操作的代码分离出来与业务逻辑分离。就形成了所谓“持久化层”的概念。 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储
6、在磁盘文件中、XML数据文件中等等。,八、 持久化层含义,九、ORM工具实现持久化示意图,如何进行对象关系数据库的匹配,public class User private String name; private String password;private String address;create table t_user ( name varchar(255) not null , password varchar(255),.primary key (name),如何进行对象关系数据库的匹配?,十、Hibernate入门,Hibernate概述 Hibernate是非常优秀、成熟的O
7、/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。Hibernate优势开源(LGPL)成熟流行自定义API提高开发者工作效率,十一、下载Hibernate,下载地址http:/www.hibernate.org,本教程使用3.2.5。将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar,十二、Hibernate工作原理,1. 读取并解
8、析配置文件2.读取并解析映射信息,创建SessionFactory3.打开Sesssion4.创建事务Transation5.持久化操作6.提交事务7.关闭Session8.关闭SesstionFactory,启动Hibernate 构建Configuration实例,初始化该实例中的所有变量 Configuration cfg = new Configuration().configure(); 加载hibernate.cfg.xml文件至该实例内存 通过hibernate.xfg.xml文件中的mapping节点配置,加载hbm.xml文件至该实例内存利用上面创建的Configuratio
9、n实例构建一个SessionFactory实例 SessionFactory sf = cfg.buildSessionFactory(); 由上面得到的SessionFactory实例创建连接 Session s = sf.openSession(); 由上面得到的Session实例创建事务操作接口Transaction的一个实例tx Transaction tx = s.beginTransaction(); 通过Session接口提供的各种方法操作数据库的访问 提交数据库的操作结果 mit(); 关闭Session链接 s.close();,十二、Hibernate工作原理,开始,启动h
10、ibernate,构建configuration实例,初始化该实例中的所有变量,加载hibernate.cfg.xml文件至该实例(内存),通过hibernate.cfg.xml文件中的mapping节点配置加载*.hbm.xml至该实例(内存),利用configuration实例创建一个工厂类SessionFactory实例,SessionFactory类创建连接,SessionFactory实例创建事务接口,通过session接口提供的各种方法操纵数据库,提交数据库事务,关闭session,十二、Hibernate工作原理,十三、Hibernate开发步骤,一、持久化类的设计二、持久化类和
11、关系数据库的映射三、应用的开发,十四、持久化Java类必须遵循的原则,1、为类的持久化类字段申明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。2、实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。3、如果是集合类型的属性,它的类型必须定义为集合的接口。例如:List、Set。4、提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updates)Session.saveOrUpd
12、ate()。,一、建立数据库和表数据库名main表名和结构如下:表名:stuInt id;varchar xm;varchar sex; Date sr;,十五、Hibernate简单实例,二、导入hibernate包 导入数据库包,十五、Hibernate简单实例,十五、Hibernate简单实例,三、建立持久化类,package ;import java.util.Date;public class Stu private Integer id;private String xm;private String sex;private Date sr;public Integer getId
13、() return id;public void setId(Integer id) this.id = id;public String getXm() return xm;,public void setXm(String xm) this.xm = xm;public String getSex() return sex;public void setSex(String sex) this.sex = sex;public Date getSr() return sr;public void setSr(Date sr) this.sr = sr;,十五、Hibernate简单实例,四
14、、建立持久化类映射文件*.hbm.xml如 Stu.hbm.xml ,五、在SRC目录下配置 hibernate.cfg.xml文件,十五、Hibernate简单实例,org.hibernate.dialect.MySQLDialectjdbc:mysql:/localhost:3306/testrootrootcom.mysql.jdbc.Driversunli ,jdbc:mysql:/localhost:3306/main?useUnicode=truecharacterEncoding=gbk,乱码的解决,六、建立操作类 StuDao.java,package ;import java
15、.util.List;import org.hibernate.Hibernate;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class StuDAO public void add(Stu u) Configuration cfg=new Configuration(); cfg.configur
16、e(); SessionFactory sf=cfg.buildSessionFactory(); Session s=sf.openSession(); Transaction tx=s.beginTransaction(); s.save(u); mit(); ,十五、Hibernate简单实例,七、调用实例化类操作数据库, ,二十一、综合举例,9、页面中调用实现类 findbyid.htm, 请输入你要查找学生的学号 ,二十一、综合举例,9、页面中调用实现类 findbyid.jsp,二十一、综合举例,9、页面中修改记录update1.jsp(步骤一),修改);out.print();
17、%,二十一、综合举例,9、页面中修改记录update2.jsp(步骤二),二十一、综合举例, 学号: readonly/ 姓名:/ 性别:/ 学号:/ ,9、页面中修改记录update3.jsp(步骤三),二十一、综合举例,二十二、缓存,缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。 一级缓存,Session级共享save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能
18、造成内存溢出;可以用evict,clear方法清除缓存中的内容。,二级缓存,SessionFactory级共享 实现为可插拔,可以通过实现CacheProvider和Cache接口来加入Hibernate不支持的缓存实现。,二十二、缓存,使用EhCache配置二级缓存 1、加入ehcache-1.2.3.jar(已在hibernate包中)到当前项目的lib下。 2、在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。 3、拷贝Hibernate安装目录的etc下ehcache.xml文件到src目录中。,true*指定二级缓存产品的提供商;org.hibernate
19、.cache.ehcacheprovider,二十三、Hibernate中对象的状态,瞬时对象(Transient Objects)(临时状态):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。 持久对象(Persist Objects):持久实例是任何具有数据库标识的实例。它由持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时会和数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。离线对象(Detached Objects) (脱管状态):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。,