【文档说明】[计算机软件及应用]Hibernate实用技术课件.ppt,共(107)页,773.520 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-77056.html
以下为本文档部分文字说明:
程序设计实用技术-Hibernate目标:深入理解持久层框架掌握Hibernate配置方法、开发流程掌握Hiberate性能优化学习对象:具备一定Java编程能力的初级程序员。预备知识:了解数据库的基本概念熟悉常用SQL语言,具备一定的Jav
a编程能力课程内容:持久层和ORMHibernate基础Hibernate性能优化程序设计实用技术—JAVA方向第一讲持久层和ORM章节目标:理解持久层和ORM持久层概述:什么是持久化?什么是持久层?“持久化”与“持久层”之间的关系?持久层概述:什么是持久化?将数据保存到物理的储
存器(硬盘、磁带等)上的过程叫持久化。什么是持久层?专门负责处理与物理数据相关操作(持久化数据,以供日后使用)的独立层次。之间的关系?持久化是动词,表示将内存中的数据存储到数据库或其他媒介。持久层是名词,实现数据持久化的一个相对独立的领域(层)。消费者/前端
仓库/数据库系统消费者/前端仓库/数据库系统商场/业务类消费者/前端仓库/数据库系统超市/业务类物流公司/持久层现实模型与持久层??Application上层应用层TransactionLayer事务层DataAccessLogic数据访问逻辑Pe
rsistenceLayer持久层Database数据层持久层逻辑边界???????ViewControlModelJSPAction持久层Database业务逻辑持久层在MVC中:持久层解决了MVC什么问题?当发生以下三种情况:(1)表示层发生变化(2)业务逻辑层发生变化(3)底层数据
格式或持久化机制发生变化数据持久化代码不需要重新编译为什么可以达到上述目标?是什么来的?解耦合持久层概述:什么是解耦合?--采用某种方法将紧密耦合的关系转换为松散耦合的关系的过程什么是耦合度?--两个事物之间的耦合程度什么是耦合度适中?--事物之间的耦合度符合实际情况或要求紧耦合耦合适中
太松耦合持久层概述:现实中还有哪些解耦合的实例?电脑,各个组件(显示器、CPU、硬盘、内存)之间相互独立,组合在一起又能一起工作,连接它们的是共同实现的标准接口;(思考集成显卡、网卡?)电脑上的USB接口与原来的串口
之间存在耦合度区别;建筑中的砖混结构、框架结构;社会上各行各业的产生,也是一种解耦合的过程。发电厂的建立,使工厂不必为了开动机器去发电;工程化也可以说就是一个解耦合的过程。。。。。。。现实中的解耦合的实例:持久层概述:软件设计
中解耦合的自然进化实例:记录论坛用户登录次数publicbooleanaddLoginCount(Stringid,intcount){Connectionconn=null;Statementstmt=null;
try{Class.forName(“oracle.jdbc.driver.OracleDriver”);conn=DriverManager.getConnection(“jdbc:orcle:thin:@dbServer:1521:forum”,“
MyUserName”,“MyPassword”);StringsqlStr=“updateBBSUsersetloginCount=loginCount+1”+“whereid=’”+id+”’”;stmt=conn.createSta
tement();returnstmt.execute(sqlStr);}catch(ClassNotFoundExceptione){e.printStackTrace();}…}publicbooleanaddLoginCount(Stringid,i
ntcount){Connectionconn=null;Statementstmt=null;try{Class.forName(Config.getValue(“JDBC_DRIVER”));conn=Driver
Manager.getConnection(Config.getValue(“DB_URL”),Config.getValue(“DB_USER”),Config.getValue(“DB_PWD”));StringsqlStr=“updateBBSUsersetloginCo
unt=loginCount+1”+“whereid=’”+id+”’”;stmt=conn.createStatement();returnstmt.execute(sqlStr);}catch(ClassNotFoundExceptione){e.printStackTrace();}…}实例
:记录论坛用户登录次数从编写代码的角度看他们的优点:(1)第一段代码很容易掌握,容易理解,直截了当,可以很好的执行。(2)第二段代码要引入一个外部文件,用来保存数据库连接信息,不大容易实现,但也比较好理解,也可以很好的执行。从耦合度的角度看,比较其优缺点?如数据库密码泄露,管理员要修
改数据库密码:第一段代码:(1)找到所有的与数据库连接相关的代码,修改密码;(2)重新编译修改后的文件;(3)重新部署软件。第二段代码:(1)修改外部文件中配置的密码;(2)不需要重新编译;(3)不需要重新部署软件。进一步改进的方法?Connectionconn=DBHelper.getConn
ection();再进一步改进的方法????软件设计中解耦合的目标为什么要解耦合?从MVC理解软件设计中的解耦合软件系统解耦合的目标:数据访问操作系统数据库系统应用系统应用逻辑应用程序层内部解耦合?业务逻辑与
数据访问逻辑分离应用程序与资源层解耦合?应用层逻辑与底层数据库、操作系统结构分离程序设计实用技术—JAVA方向第二讲DAO模式解耦合解耦合实例:DAO模式示例:银行转帐现有{账户A}{账户B}{转帐金额amount}由{账户A}转给{账户B}。编写一个方法,实现转帐。publicbool
eanzhuanzhang(Stringuser1,Stringuser2,intamount){Connectionconn=DBHelper.getConnection();//获得数据库连接PrearedStatementstmt=conn.
prepareStatement(“select*fromuserwhereusername=?”);stmt.setString(1,user1);ResultSetuser1_Set=stmt.executeQuery();if(user1_Set.next()
){//检查{账户A}余额是否够转帐,够则减掉要转帐的金额if(user1_Set.getInt(“amount”)>=amount){PrearedStatementstmt=conn.prepareState
ment(“updateusersetamount=amount-“&amount&”+“whereusername=?”);stmt.executeUpdate();}else{returnfalse;//余额不
足}}else{returnfalse;//找不到{账户A}}//将{账户B}加上转帐金额PrearedStatementstmt=conn.prepareStatement(“updateusersetamount
=amount+”&amount&”whereusername=?”);stmt.setString(1,user2);stmt.executeUpdate();returntrue;}示例:银行转帐上例实现了三个操作:(1)检查{账户A}的余额是否够转
帐;(2)在{账户A}中减掉要转帐的金额;(3)在{账户B}中加上要转帐的金额。最后DAO模式下的代码:publicbooleanzhuanzhang(Stringuser1,Stringuser2,intamount){U
seruserA=UserProxy.getUser(user1);//分离数据访问逻辑UseruserB=UserProxy.getUser(user2);returnuserA.accord(userB,amoun
t);}Factory模式Proxy模式DAO模式:DataAccessorObject(数据访问对象DAO)Data数据DataAccessor数据访问器DomainObject领域对象(数据抽象)DA
O模式分解DAO模式解耦合的目标:Application应用逻辑DataAccessor数据访问抽象DomainObject业务对象DatabaseAccessorAbstract数据访问接口Database
AccessorImp数据访问实现DAO模式实现的层次数据存储逻辑与业务逻辑分离数据存储逻辑与数据底层实现分离(资源层解耦合)封装业务对象Database在DAO模式中引入Factory模式:如何理解Factory工厂模式?根据给
定的模具(类名称),从仓库里取出相应原料(类代码),加工成产品(类实现或对象)。Factory模式:Factory模式:UserDAOuserDAO=DAOFactory.getDAO(UserDAO.class);UseruserA=us
erDAO.getUser(User1);Factory在DAO的作用?根据需要加载相应的实现,具体点说就是:给定UserDAO.class类名,产生UserDAO类实现。之前的实现完成银行转帐:publicboolea
nzhuanzhang(Stringuser1,Stringuser2,intamount){UserDAOuserDAO=DAOFactory.getDAO(UserDAO.class);UseruserA=UserDAO.getUser(user1);UseruserB=UserDAO.get
User(user2);returnuserA.accord(userB,amount);}最终版本现实生活中的Proxy代理?软件开发中的Proxy代理?在DAO模式中引入Proxy模式在DAO模式中引入Proxy模式publicclassUserProxy{publ
icstaticUsergetUser(Stringuserid){UserDAOuserDAO=(UserDAO)DAOFactory.getDAO(UserDAO.class);returnuserDAO.getUser(userid);}publicstaticvoidsava(Userus
er){UserDAOuserDAO=(UserDAO)DAOFactory.getDAO(UserDAO.class);userDAO.save(user);}}最终版本为什么要引入Proxy?1、使得代码看起来更整
洁2、为附加其他功能留接口3、???为什么要引入Proxy?思考类比房屋建筑中的代理层?最终版本DAO模式总结:ClientDAOFactoryUserDAOUserObjectUserProxyUserDa
ta/TableDBHelper应用层数据访问层数据层对象/关系映射DAO模式总结:对象描述Client业务逻辑,相对与数据库层来说是客户UserProxy执行代理,执行业务逻辑需要的针对数据库的操作DAOFactoryDAO工厂,根据配
置文件产生DAO对象类UserDAODAO对象,使用DBHelper连接数据库,加载数据/实例化DAODBHelper连接数据库帮助类,使用配置文件连接数据库UserObject数据封装类,具有属性和get/set方法
,对表/关系数据进行封装UserDate/Table数据库表,表记录是UserObject的属性,实例化UserObjectDAO模式总结:ClientObject/业务逻辑DAOProxy/代理DAOFactory/DAO工厂Implementation/
DAO实现DAOConfiguration调用服务方法获得服务实现接口获得DAO配置获得DAO/服务实现执行方法返回结果(1)interface接口,在实现解耦合中的作用?(2)JavaClass动态加栽?(3)XML配置文件?回顾与DAO相关的知识:提升持久层性能
软件系统中有哪些性能指标?提升持久层性能:数据库容量执行某次业务的时间同时并发访问数等等…软件系统中有哪些性能指标?系统性能低下有哪些原因?提升持久层性能:硬件环境、网络环境差软件配置环境低(操作系统、数据库系统)达不到系统使用要求设计本身存在缺陷系统性能低下有哪些原因?设计本
身存在缺陷,主要表现在:1、算法不科学合理2、资源的管理和调配失当哪一个是最主要因素?提升持久层性能:从前有一个钢铁工厂,有100个车间,每个车间的生产效率都很高(工人技能高、生产管理科学、设备先进);每个车间都设立有自己的原料采购车队,以保障生产所需的原料。(存在的问题?如何解决?
)提升持久层性能:从前有一个DAO模式的系统,有100个子过程,每个子过程的执行效率都很高(代码非常简练,并经过代码优化);每个子过程都包含有自己的数据库连接,以保障有效的数据存取。(存在的问题?如何解决?)提升持久层性能:问题出现的前提:“大量”提升持久层性能:市场对钢铁的需求“大量”增
长用户同时登陆的数量“大量”增长会出现什么大问题?提升持久层性能:措施1:ConnectionPool/数据库连接池请求获得连接数据库连接池判断是否有有没有创建一个连接移除返回连接提升持久层性能:Connection
Pool/数据库连接池请求返回连接数据库连接池判断是否满满不满加入到池中关闭连接提升持久层性能:数据库连接池技术带来的优势?(1)资源重用(2)更快的响应速度(3)控制资源分配(4)避免连接泄露提升持久层性能:措施2:缓存计算机领域的缓存
有哪些?缓存什么东西?为什么要缓存?缓存到什么地方?软件系统中的缓存主要缓存什么?提升持久层性能总结回顾:1、数据库连接池引入的原因?提升系统性能。2、数据库连接池与持久层的关系?持久层负责数据访问。数据库连接池负责统一管理和调度数据库连接。有了数据库连接才能访问数据。提升持久层性
能:理解持久层、DAO、数据库连接池这些概念的目的是什么?是:对现有持久层来历和发展方向有深入的理解,为应用开发打下理论基础。不是:使用这些理论知识实现软件项目中的持久层。因为:不必为了吃面包,就要去种小麦。无论是商业领域还是开源社区
,都为我们提供了丰富的、久经考验的持久层组件,比如Hibernate。程序设计实用技术—JAVA方向第三讲Hibernate基础开发回顾现有持久层框架:HibernateApacheOJBCayenneJaxoriBatisjRelationFrameworkmirageSMYLETopL
ink(oracle,非开源产品)Hibernate是什么:持久层框架?ORM映射理论?提供强大、高性能的对象到关系型数据库持久化服务的框架产品(开源)Hibernate的起源:Hibernate的设计者:GavinKing2001年末,正式发布第一个版本2003年中,发布H
ibernate22003年末,Hibernate被开源组织JBoss收纳2005年初,发布Hibernate3为什么如此快速的成功:快速发布、即时响应全面的回归测试避免过渡设计集权文档避免
标准化5分钟内成功运行Hibernate开发人员的责任感快速起步快速起步-准备工作:下载:HibernateHibernate-ExtensionMiddlegen-HibernateJUnitMysql准备开发工具:EclipseMyEclipse4准
备数据库环境:Mysql/OracleHibernate配置:Hibernate日志:第一程序:代码解释:(1)初始化Hibernate配置管理类:Configuration。(2)通过Configuration类实例
创建Session的工厂类:SessionFactory。(3)通过SessionFactory得到:Session。图释:Hibernatehibernate.hbm.xmlSessionFactorySessionDatabase
Configuration理解:Hibernate完成了什么配置工作?如何完成的?Hibernate在数据操作中起到了什么作用?如何做的?基础语法ConfigurationSessionFactorySes
sionhibernate.hbm.xmlhibernate.properties(myHibernate.hbm.xml)Session.save(user)Session.close()User.hbm.xmlHIBERNATE基础语法:Configuration类--负责
管理Hibernate的配置信息Configurationconfig=newConfiguration().configure();Filefile=newFile(“D:\\ora\\myHibernate.hbm.xml”);Configurationconfig=newConfigura
tion().configure(file);基础语法:SessionFactory类--负责创建Session实例。--是线程安全的,可并发同时访问。Configurationconfig=newConfiguration().configure()
;SessionFactoryfactory=config.buildSessionFactory();基础语法:SessionFactory类--SessionFactory实例是Configuration实例config根据当前的配置信息构造的。--多个数据库就有多个config实例,并
构造不同的SessionFactory。--SessionFactory中保存着数据库配置的所有映射关系,也维护缓存等,消耗巨大,应重点考虑重用策略。基础语法:Session类--持久化操作的基础Configurationconfig=newConfigu
ration().configure();SessionFactoryfactory=config.buildSessionFactory();Sessionsession=factory.openSession();基础语法:HibernateSession与HttpSession
的区别?基础语法:Session数据持久化方法:SaveGet/LoadflushDeleteQuery、Criteria基础配置基础配置:Hibernate基础配置--主要针对SessionFactory展开Hibernate内部配置与应用服务器(或容器)的相关配置基础配置:Hib
ernate配置方法--主要针对SessionFactory展开使用配置文件(hibernate.hbm.xml/hibernate.properties),在Hibernate启动时加栽配置属性。使用Configuration类在程序中,指定配置属性。基础配置:Hibe
rnate配置属性分类:数据库连接数据库连接池事务属性对象/关系映射文件其他属性HibernateO/RMappingHibernateO/RMapping?HibernateO/RMapper?基本数据类型映射:Java数据类型数据库字段类型
O/R映射定义Hibernate类型转换基本实体映射:Java对象与数据库表关系之间的映射:类名――表名主键映射字段――属性基本数据类型映射:Java对象/POJO数据库表/关系O/R映射定义Hibernate数
据交换基本实体映射:Idint(pk)Namevarchar(20)sexvarchar(4)group_idint(fk)学生表Idint(pk)Codevarchar(50)createTimetime学生证表priv
ateintid;privateStringname;privateStringsex;privateintgroup;Cardcard;Studentprivateintid;privateStringcode;privatetimecreatetimeStudentstudent;Card自
定义数据类型映射:Hibernate自定义数据类型,接口:UserTypeCompositeUserType将数据库中复杂的数据格式转换成业务层易于操作的类型对象复合主键映射:注意:有驳于业务逻辑和数据逻辑分离的原则复合主键类:基于实体类属性的复合主键基于主键类的复合
主键需要实现:Serializable接口及equals、hashCode方法Blob、Clob字段映射:不同的数据库对应的大对象类型不同实体映射策略:Component组件映射继承映射Compone
nt组件映射:idintfirstNamevchar(20)lastNamevchar(20)sexintageinthomeAddvchar(100)officeAddvchar(100)telZonevchar(4)telPhonevchar(11)telPersonvchar(4)…
Name对象Tel对象通过将复杂的表字段分类,实现面向对象的领域划分,使系统逻辑更加清晰。继承映射:学生表id姓名性别年龄班级老师表id姓名性别年龄职务Person类Student类Teacher类继承映射:用户表id姓名性别年龄班级学生表idPe
rson类Student类Teacher类老师表id职务继承映射:用户表id姓名性别年龄班级用户类别Person类Student类Teacher类职务级联关系关系映射类别:一对一关联/one-to-one一对多关联/one-to-m
any多对一关联/many-to-one多对多关联/many-to-many--ORM(对象/关系映射),不但包括对单独的数据库表和对象的映射,还包括对表之间的关联的影射。一对一关联:主键关联Idint(pk)Namevarchar(20)se
xvarchar(4)group_idint(fk)学生表Idint(pk)Codevarchar(50)createTimetime学生证表privateintid;privateStringname;privateStringsex;privatein
tgroup;Cardcard;Studentprivateintid;privateStringcode;privatetimecreatetimeStudentstudent;Card一对一关联:外键关联Idint(pk)Namevarchar(20)sexvarchar(4)group_
idint(fk)学生表Idint(pk)namevarchar(50)组表privateintid;privateStringname;privateStringsex;privateGroupgroup;Studentprivatei
ntid;privateStringname;GroupStudent.hbm.xmlGroup.hbm.xml一对多关联:Idint(pk)Namevarchar(20)sexvarchar(4)gr
oup_idint(fk)学生表Idint(pk)addressvarchar(50)zipcodevarchar(6)useridint地址表privateintid;privateStringname;privateStringsex;privateGroupgrou
p;privateSetaddress;Studentprivateintid;privateStringaddress;privateStringzipcode;privateintuserid;privateStudentstudent;AddressStudent.hbm.xmlA
ddress.hbm.xml多对多关联:Idint(pk)rolevarchar(20)角色表Idint(pk)groupvarchar(20)组(岗位)表privateintid;privateStringrole;privat
eSetgroups;Roleprivateintid;privateStringgroup;privateSetroles;GroupRole.hbm.xmlGroup.hbm.xmlRole_idGroup_id角色_组表