1、第一章,使用Hibernate完成对象持久化,回顾,在Struts中,循环显示List中的数据使用什么标签?如何使用MVC模式组织Java Web应用?程序的DAO层(数据访问层)完成什么任务?,回顾,Struts1中使用DispatchAction有哪些好处?Struts1中使用DispatchAction的步骤是什么?Struts1中使用实体对象做Form属性有什么好处?,预习检查,为什么需要Hibernate?Hibernate是什么?使用Hibernate的步骤是?,本章任务,使用Hibernate实现: 用户的增、删、改操作 升级“房屋出租系统” 使用Hibernate实现用户注册
2、使用hibernate实现房屋信息的增、删、改,了解Hibernate基本原理学会编写Hibernate配置文件、实体映射文件学会使用Hibernate完成数据增、删、改操作学会在项目中使用Hibernate,本章目标,为什么使用Hibernate?,在编写DAO层代码时,容易出现哪些问题?,思考:这部分代码规律性很强,是否可以采用“通用”的方法“集中”解决?,代码繁琐 容易出错,纯“体力”劳动 工作量大 占用大量开发时间,为什么使用Hibernate?,使用Hibernate后的DAO层代码:,代码精简易读,封装了JDBC操作,以面向对象的方式操作数据,开发工作量小,可以将精力集中在业务逻辑
3、的处理上,public class FwxxDAOHibImpl extends BaseHibernateDAO implements FwxxDAO public FWXX get(int fwid) super.get(FWXX.class,fwid);public void add(FWXX fwxx) super.add(fwxx);public void del (int fwid) super.del(FWXX.class,fwid);public void update(FWXX fwxx) super.update(fwxx); ,Hibernate就是用来解决这些问题的,什
4、么是Hibernate?,Hibernate之父:Gavin KingJBoss核心成员之一 EJB3.0专家委员会成员 Hibernate In Action作者2001年开始开发Hibernate 2003年Hibernate发展为Java 世界主流持久层框架充满激情 脾气倔强 永不言败,Hibernate是一个优秀的持久化框架,什么是持久化?,内存,姓名:小颖 性别:女 特长:英语、程序设计,瞬时状态,磁盘,持久状态,用JDBC完成数据在持久和瞬时状 态间的转换: stmt.execute (“ “) .,瞬时状态: 保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态,持久状态
5、: 保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态,持久化: 将程序数据在瞬时状态和持久状态之间转换的机制,持久化,Hibernate是一个主流的ORM框架,什么是ORM?,持久化层,业务逻辑层,表现层,数据库,TBL_User表,关系型数据(R),映射信息,ORM(对象-关系映射): 完成对象数据到关系型数据映射的机制称为对象-关系映射,简称ORM。,小结,是一个主流的持久化框架 在JDBC基础上进行封装 只需要少量代码就可以完成持久化工作是一个优秀的ORM(对象-关系映射)机制 通过映射文件保存映射信息 在业务层以面向对象的方式编程,不用考虑数据保存形式,使用Hiber
6、nate实现用户添加,如何使用Hibernate实现“用户添加”功能?使用Hibernate的“3个准备,7个步骤” 准备1:导入Hibernate库(jar包),演示示例:添加Hibernate库到项目,使用Hibernate的基本步骤,准备2:添加配置文件 - hibernate.cfg.xml, jdbc:microsoft:sqlserver:/localhost:1433;Database=zfsapwdcom.microsoft.jdbc.sqlserver.SQLServerDriverorg.hibernate.dialect.SQLServerDialecttrue,配置数据
7、库 链接,数据库“方言”,运行时在控制台显示SQL语句,映射文件,可以有多个,使用Hibernate的基本步骤,准备3:添加实体类和映射文件(User.hbm.xml),package com.aptech.jb.entity; public class User implements java.io.Serializable private Integer uid;private String uname;private String upass;public User() / 默认构造方法 / Getter and setter ,实现Serializable接口,添加默认构造方法,实体类
8、到表的映射,主键,属性到字段的映射,主键生成器: native 由数据库生成 assigned 在程序中指定,小结,使用Hibernate的三项准备工作是? 添加Hibernate类库 添加Hibernate配置文件 添加对应表的实体类和映射文件 Hibernate配置文件中配置了哪些信息? Hibernate使用的实体类和之前定义的实体类有什么区别? 使用Hibernate,系统中添加一个表的时候,都有哪些准备工作要做? 添加实体类 添加映射文件 在hibernate.cfg.xml中增加 ,使用Hibernate实现用户添加,使用Hibernate的7个步骤:,七个步骤对应的程序代码,pu
9、blic static void main(String args) Configuration conf = new Configuration().configure();/1、读取配置文件SessionFactory sf = conf.buildSessionFactory();/ 2、创建SessionFactorySession session = sf.openSession();/ 3、打开SessionTransaction tx = null;trytx = session.beginTransaction();/ 4、开始一个事务/ 5、持久化操作User user =
10、new User();user.setUname(“Hibernate user“);user.setUpass(“password“);session.save(user);mit();/ 6、 提交事务 catch(Exception e)if (null!=tx)tx.rollback();e.printStackTrace(); finallysession.close();/ 7、关闭Session ,执行结果,使用Hibernate实现用户添加,Hibernate执行过程,Configuration,SessionFactory,Session,Transaction,创建,创建,
11、开始,save delete update mit()session.close(),执行,Hibernate.cfg.xml,结束,创建和销毁都相当耗费资源,通常一个系统内一个数据库只创建一个,类似于JDBC中的 Connection,复杂的查询操作稍后介绍,使用Hibernate实现数据的加载/删除/修改,程序代码,tx = session.beginTransaction(); User user = this.testLoad(id); user.setUname(“new Name“); session.update(user); mit();,修改,tx = session.beg
12、inTransaction(); User user = this.testLoad(id); session.delete(user); mit();,删除,没有更新数据,不进行事务控制,先加载,再更新 不再需要繁琐的逐字段编码,先加载, 再删除,演示示例:HibTest2.java,小结,简述:使用Hibernate的“3个准备,7个步骤”。,使用工具简化Hibernate开发,使用Hibernate开发虽然简化了开发工作,但还要编写额外的配置文件和映射文件,还是很繁琐! 有解决的办法吗?,MyEclipse对Hibernate的支持可以进一步简化我们的工作,使用工具简化Hibernate
13、开发,总结一下,刚才演示过程中,MyEclipse工具帮我们做了哪些事情?1、给项目添加Hibernate支持(自动添加jar包) 2、自动生成hibernate.cfg.xml配置文件 3、自动生成实体类、映射文件,演示示例:使用MyEclipse简化Hibernate开发,注意:关键是正确配置了数据库连接信息,在项目中使用Hibernate,如何在项目中使用Hibernate?重新实现租房系统FwxxDAO接口 1、在原项目基础上添加Hibernate支持 2、生成TBL_FWXX表对应的实体类和映射文件 3、添加com.aptech.jb.dao.hibimpl.FwxxDAOHibIm
14、pl类,实现FwxxDAO接口,演示示例:使用Hibernate重新实现FwxxDAO接口,在项目中使用Hibernate,FwxxDAOHibImpl中add方法代码如下。 下面蓝色的代码和del、update方法的代码存在重复,可以采取什么方法精简呢?,public void add(FWXX item) Session session = HibernateSessionFactory.getSession();Transaction tx = null;trytx = session.beginTransaction();session.save(item);mit();catch(E
15、xception e)if(null!=tx) tx.rollback(); e.printStackTrace();finallysession.close(); ,在项目中使用Hibernate,使用BaseHibernateDAO简化编码,public abstract class BaseHibernateDAO protected void add(Object item)Transaction tx = null;Session session = HibernateSessionFactory.getSession(); try tx = session.beginTransac
16、tion();session.save(item);mit(); catch (Exception e) if(null!=tx) tx.rollback(); e.printStackTrace();finallysession.close(); / update,delete,get 方法与之类似,BaseHibernateDAO,public class FwxxDAOHibImpl extends BaseHibernateDAO implements FwxxDAO public FWXX get (int fwid) super.get(FWXX.class,fwid);publi
17、c void add(FWXX fwxx) super.add(fwxx);public void del (int fwid) super.del(FWXX.class, fwid);public void update(FWXX fwxx) super.update(fwxx); ,最终的FWXXDaoHibImpl,DAO层的代码大大精简 这就是我们使用Hibernate的目的,演示示例:使用BaseHibernateDAO简化开发,预习作业,1、举一个一对多关联的例子 2、举一个多对一关联的例子 3、举一个多对多关联的例子 4、使用Hibernate配置关联有什么好处?,总结,为什么要使用Hibernate? Hibernate是什么? 使用Hibernate的“3个准备,7个步骤”指的是? 使用什么方法可以简化“3个准备” ? 使用什么方法可以简化“7个步骤” ? 使用Hibernate实现DAO层,比单纯使用JDBC实现优越在哪儿?,