版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多期:天润4+5名字:陈宣任日期作业:12月8日Hibernate课堂授课知识点总结:hibernate基本知识hibernate一对一映射hibernate一对多(多对一)映射hibernate多对多映射hibernateHQL检索学习Hibernate基本知识hibernate:hibernate就是一种可以自动依照xml或annotation完毕对象关系映射(orm),并持久化到数据库开源框架。是连接java应用程序和关系数据库中间件,这是对JDBC封装,重要负责java对象持久化。ORM(ObjectRelationMapping)对象关系映射是一种为理解决面向对象与关系数据库存在互不匹配现象技术。hibernate映射文献:它作用是描述持久层对象以及让她们属性和数据库中表和表字段之间相应关系。没有映射文献,Hibernate系统无法完毕Java对象和数据库表中数据互相转化。只有通过映射文献,Hibernate才干懂得所操作对象与哪个表有关联。hibernate.cfg.xml文献中包括了hibernate与数据库基本连接信息。在Hibernate工作初始阶段,由Configuration对象启动hibernate框架,然后将信息加载到SessionFactory实例中。SessionFactory是Hibernate中一种类,这个类重要负责保存Hibernate配备信息,以及对Session操作。手动创立hibernate框架环节:拷贝所需Jar包到lib目录下,基本包括(antlr.jar,cglib.jsr,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar,hibernate3.jar,hibernate-annotations.jar)在src目录下创立一种hibernate.cfg.xml文献,该文献包括了hibernate与数据库连接基本连接信息。在Hibernate工作初始阶段,这些信息被先后加载到Configuration和SessionFactory实例。创立一种User.hbm.xml(类名.hbm.xml)。包括Hibernate基本映射信息,即系统中每一种类与其相应数据库表之间关联信息,在Hibernate工作初始阶段,这些信息通过Hibernate.cfg.xmlmapping节点被加载到Configuration和SessionFactory实例。Hibernate关联映射:一对一:由数据库中共享主键实现(A表一行记录相应B表一行记录)。一对多:由外键约束实现(A表中一行记录相应B表中多行记录)。多对多:中间表约束实现(需要产生一种中间表,两个表与中间表关联关系为一对多)。hibernate级联关系映射叫高档映射,Hibernate是用于控制类而不是表。级联关系在类中配备由映射文献进行描述。要想让表关于系,必要让两个类关于系。高档映射第一点:启动Hibernate级联关系映射。两个类之间靠互换实例来进行关系访问。(实例重要用来负责级联操作)。实体对象三个生命周期:所谓Hibernate实体对象生命周期就是指Hibernate实体对象在整个应用中存在状态。实体对象生命周期中重要存在三种不同状态,她们分别是:Transient(瞬态),Persistent(持久态),Detached(游离态),这三种状态定义与所谓持久化上下文(persistencecontext)关于,HibernateSession对象就是这个所谓持久化上下文。Hibernate中load()和get()异同相似点:功能上是同样全是通过该对象标示符来得到一种持久化对象,可以理解为依照id加载一种对象。不同点::区别在于返回值差别,load()如果没有找到该对象时候它是抛出异常,而get()如果没有找到该对象将会返回null。Session.get()不支持数据缓存,永远查询数据库。Session.load()支持数据缓存,查询内存完毕一次Hibernate框架启动七个环节:1创立Configuration对象(Configurationconf=newConfiguration();conf.configure();重要作用配备和启动Hibernate框架,读取Hibernate.cfg.xml核心配备文献)2.创立SessionFactory对象3.通过SessionFactory对象创立Session对象4.通过Session启动一种事物并得到一种Transaction对象(Transaction对象重要合用于事务管理,一种事务对象也许涉及各种数据库进行操作)5.通过Session与数据库进行会话及持久化操作6.提交操作结束事物提交事务7.关闭Session释放资源hibernate生成数据库表两种方式:第一种:Configurationcfg=newConfiguration().configuration();SchemaExportexport=newSchemaExport(cfg);Export.create(true,true);//参数一与否发送Hibernate自定义建表脚本到数据库中,参数二与否让数据库执行发送过去脚本。第二种:通过保存数据用Save(对象名)办法。持久化信息办法:创立一种Configuration对象:Configurationconf=newConfiguration();通过Configuration对象configure()办法加载Hibernate配备文献。conf.configure();创立一种SessionFactory实例SessionFactoryfactory=conf.buildSessionFactory();通过SessionFactory实例创立Session实例Sessionsion=factory.openSession();通过Session实例启动事务,得到事务对象。Transactiontran=sion.beginTransaction();使用Session实例save()办法,传入实体类对象,将User对象持久化。Sion.save(Object);Tmit();在创立Session实例后,无论与否执行事务,最后都需要关闭Session实例,释放Session实力占用资源。Session.close();Hibernate一对一映射(人与身份证关系)一对一关联映射:可分为主键关联映射和唯一外键关联映射(是多对一一种特殊体现形式)两种,同步,这两种关联映射又分为单向关联和双向关联。单向一对一主键关联映射:在任意一方存储另一方实例对象。一对一级联关系创立及配备标记用<one-to-one/>标签.双向一对一主键关联映射:双方需要分别存入对方实力对象。<one-to-one/>标签中惯用属性解析name:<one-to-one/>级联关系需要name指定成员来实现。class:为指定对象类。constrained=”true”:添加数据库底层约束。表白A表对象必要和一种B表对象关联,也就是说A对象中B属性不能为空。fetch:控制两表连接查询。Hibernate一对多(多对一)映射(班级和学生关系)一对多(save一方):在多方为一方创立外键。注意:一对一靠类中对象实现,一对多需要靠容器(集合)实现,在这里我们选取Set集合,由于Set不能存入重复值。并且set中有HashSet,可以用Hash算法辅助数据库查询。一对多级联关系创立及配备标记用<set/>标签中<one-to-many/>标签一对多级联配备文献例子:<setname=”student”cascade=”all”><keycolumn=”classes_id”></key><one-to-manyclass=”Student”/></set>注意:当一方操作多方时候(级联关系由一方维护)做添加时候有7个SQL语句(注意此时SQL语句数量依照你插入信息数来看,如果你插入两条信息则是5个SQL语句。如果你插入三条信息则是7个SQL语句)可以用2n+1这个算法来计算产生SQL语句数。(n表达添加信息条数)当一方操作多方时有两个问题:第一:当一方操作多方时候(级联关系由一方维护)做添加时候有2n+1个SQL语句。(n表达添加信息条数)第二:外键不容许为空(null)时候一方无法操作多方。对多对(save多方):在多一方存入一方类对象。注意:进行多对一操作时,此时多方需要给自己添加一种外键,即在<many-to-one></many-to-one>中加一种column,<many-to-onename=”classes”class=”Classes”column=”classes_id”></many-to-one>,这里外键(column)值最佳和在一方映射文献中<key/>标签column值相似。瞬时状态异常产生因素(一对多和多对多经常浮现):数据库中无存入信息。即操作不级联时会产生瞬时状态异常。此时应设立cascade属性值为all,注意cascade属性值应当谨慎设立。当多方操作一方时候昨天加时候浮现4个SQL语句,由于多方不需要额外拼写修改外键语句。双向级联关系:(在双向一对多时候,一方和多方都需要配备外键,并且两个外键名字相似。)当双方关系都存在时候,Hibernate框架默认选取一方为级联关系主控方(一对多)。因而,如果但愿让多方来维护,则要在一方映射配备文献中<set/>标签中添加inverse属性值为true。inverse=”true”属性表达让当前一方反转出级联关系主控权。由多方来维护级联关系。Inverse属性设立在集合类中,而<many-to-many>和<one-to-one>则无此属性.注意:多方控制级联关系性能强于一方,并且双向级联时双方方略都需要存在。Cascade是Hibernate提供级联方案。Cascade=“all”表达无论何时(无论什么操作)都产生级联操作。Cascade属性是设立级联操作也就是在操作一端数据如果影响到多端数据时会进行级联操作。默认cascade=”none”。使用该属性时应当慎重(例如在进行删除操作时最佳将Cascade属性值设立为save-update)延迟加载:延迟加载方略:设立延迟加载方略时需要把抓取方略删除即fetch=”join”删除。Lazy=”true”延迟加载方略(此时为懒状态)。//普通为此状态Lazy=”false”(此时为不懒状态),只要类被加载则和其有级联关系类也会被加载。Lazy会照成性能损耗。延迟加载是Hibernate为理解决性能问题而浮现。Lazy属性值为true时,该属性值不会被立即加载,只有在真正读取该属性值时,其值才会真正从数据库中读取,这在解决大型字段时非常有用。例如:在顾客信息表中也许有一种很长顾客简介字段,但在诸多状况下并不需要显示和解决这个字段,因此可以将其Lazy属性值设立为true。以避免每次读取这个对象时候都将顾客简介字段读出。Hibernate多对多映射(顾客和角色)多对多(顾客和角色):两个表自身都无法描述她们多对多关系。此时需要通过第三张表进行多对多描述,此时即产生一张中间表。注意:需要在A表中和B表中分别存入以双方为泛型Set集合对象。中间表:中间表中存储是A类和B类主键,在中间表中当外键。多对多和一对多操作中<key/>标签区别:<key/>标签用来为别表产生外键。在多对多中,<key/>标签用来指定该持久类为中间表创立外键名。在一对多中,<key/>标签用来指定一方为多方创立外键名称。<man-to-many/>标签和<many-to-one/>标签中column区别:<many-to-many>中column代表在中间表中生成外键。<many-to-one/>中column代表在本表中生成外键名。即在多方生成外键名称。在配备多对多关系时应注意:第一:双方set都必要指定table,并且table名字必要一致。第二:双方均有key标记,单独一方key标记中column名字,应当相应此外一方<many-to-many/>标签中column名字。注意:如果table不同样,会产生两个中间表。Column值不同样会在中间表中产生四个外键。注意:对多对和多对一操作时,只操作单一一方即可,一对多时如果是双向级联,则需要添加双方级联方略。HibernateHQL检索学习HQL查询:连接查询在项目开发中是非常惯用技术,Hibernate推出了HQL查询,它提供了更加丰富和灵活查询特性,同步也提供了更加面向对象封装。HQL查询非常类似于原则SQL查询。HQL查询在整个Hibernate实体操作体系中占据核心地位,我们可以通过实体查询,实体更新和删除,属性查询,分组与排序,参数绑定来体验HQL实际应用。Hibernate框架六种检索方式:第一种:OID(ObjectID)检索方式,sessionget()和load()办法。该种检索方式普通为单条检索,id不能重复。相称于Select*fromwhereid=?第二种:HQL检索方式,(浮现复杂查询时使用),它是一种语法类似于SQL,但是,是面向对象查询语言。SQL语言面向数据库。第三种:面向对象检索(通过ORM,操作持久态对象进行检索)第四种:QBC(条件拼接查询)检索方式,第五种:QBE(多维查询)检索方式(BI业务上通用,BI业务重要是对于数据库,重要工作是数据抓取,数据分析,多维分析)第六种:SQL(原生SQL检索方式)HQL语句中检索技术:第一种:实体查询(实体等于对象,等于实例)查询出来都是实体=查询出来都是持久态对象=表中行,该种查询查出来记录都是一行一行。SQL语句中没有行查询,但是HQL语句中有。第二种:属性查询=查询出来都是持久态对象属性=表中列注意:有无select是实体查询和属性查询一种重要区别。并且在HQL中select和from中间是持久态类对象。第三种:条件查询=函数(组函数=聚合函数count(*),sum(),max(),min(),avg()),记录查询属于条件查询一种。注意:组函数一种重要特点为成果集唯一!返回值为单一值!第四种:DML风格(delete,update,insert)在HQL语句中永远没有insert插入语句,由于Hibernate有Save()办法。第五种:外置查询第六种:过滤查询第七种:导航查询(在有级联关系基本上进行查询)第八种:连接查询(在有级联关系基本上进行查询)第九种:分页查询注意:HQL语句需要转义成SQL语句进行执行,HQL可以省略动词,SQL一共九个动词。HQL语句按照hibernate.cfg.xml配备中数据库方言转义成相应SQL语句。Hibernate面向对象,SQL语句面向数据库。Hibernate中N+1问题:一方面查询这个表中所有id,再按照每一种id进行查询。.iterate()成果集支持数据库缓冲技术。.list()成果集不支持。N+1问题解决方案:一方面把数据从数据库中查找出来,存到list中,在进行iterate查询操作。数据库缓存技术:数据缓存指是把数据加载到缓存区中,首页从缓存区中查询数据。在进行第一次查询同步,将数据从数据库加载到首页同步也将数据加载到缓存区中(即内存中),再进行刷新时就从内存中进行查询。Iterate()办法不找数据库,它查询数据缓存。注意:.list()办法不支持数据库缓存,查询是数据库。.iterate()办法支持数据缓存,查询是内存。Hibernate执行list()办法会默认把数据放入到缓存中。Session.get()不支持数据缓存,永远查询数据库。Session.load()支持数据缓存,查询内存。get()办法如果没有查到值返回null,load()如果没有查到值浮现异常。实体查询:实体查询技术实现,需要将实体对象中所有数据存储到List对象中,例如查询出User实体对象相应所有数据,并且将每条数据封装成User实体对象,并且放入List中返回。代码如下:Stringhql=“fromUseruser”;Listlist=session.CreateQuery(hql).list();由于HQL语句与原则SQL语句相似,因此也可以在HQL语句中使用where子句,并且可以在where子句中使用各种表达式,比较操作符以及使用“and”,”or”连接不同查询条件组合。如:fromUseruserwhereuser.age=20;fromUseruserwhereuser.agebetween20and30;fromUseruserwhereuser.agein(20,30);fromUseruserwhereisnull;fromUseruserwherelike‘%zx%’;fromUseruserwhere(user.age%2)=1;fromUseruserwhereuser.age=20andlike‘%zx%’;实体更新和删除:实体更新和删除技术是Hibernate3新加入功能,在Hibernate2中是不具备。例如在Hibernate2中,如果想将数据库中所有18岁顾客年龄改为20岁,那么要一方面将年龄为18岁顾客检索出来,然后将她们年龄修改为20岁,最后调用Session.update()语句进行更新。在Hibernate3中对这个问题提供了更加灵活和有效率解决办法,如下面代码:Transactiontrans=session.beginTransaction();Stringhql=“updateUserusersetuser.age=20whereuser.age=18”;Queryqueryupdate=session.createQuery(hql);Intret=queryupdate.executeUpdate();Tmit();通过这种方式可以在Hibernate3中一次性完毕批量数据更新,对性能提高非常可观。同样也可以通过类似方式来完毕delete操作,代码如下所示:Transactiontrans=session.beginTransaction();Stringhql=“deletefromUseruserwhereuser.age=18”Queryqueryupdate=session.createQuery(hql);Intret=queryupdate.executeUpdate();Tmit();属性查询:诸多时候我们在检索数据时,并不需要获得实体对象所相应所有数据,而只需要检索实体对象某些数据相应数据,这时候就可以运用HQL属性查询技术,如下所示:Listlist=session.createQuery(“selectfromUseruser”).list();for(inti=0;i<list.length();i++){System.out.println(list.get(i));}也可以一次检索User对象各种属性,如下面程序:Listlist=session.createQuery(“select,user.agefromUseruser”).list();for(inti=0;i<list.length();i++){Object[]obj=(Object[])list.get(i);System.out.println(obj[0]);System.out.println(obj[1]);}从面向对象角度考虑,上面返回Object[]不符合面向对象风格,这时我们可以运用HQL提供动态构造实例功能对这些平面数据进行封装,如下面程序代码:Listlist=session.createQuery(“selectnewUser(,user.age)fromUseruser”).list();for(inti=0;i<list.length();i++){Useruser=(User)list.get(i);System.out.println(user.getName());System.out.println(user.getAge());}上面实现更加符合面向对象风格,但这时所返回User对象,只是一种普通java对象,除了查询成果值之外,它属性值都为null(涉及主键值id),也就是说不能通过Session对像对此对象执行持久化更新操作。分组与排序:(1)orderby子句与SQL语句相似,HQL查询也可以通过orderby子句对查询成果集进行排序,并且可以通过asc或者desc核心字指定排序方式,代码如下:fromUseruserorderbyasc,user.agedesc;(2)groupby子句与记录查询在HQL语句中同样支持使用groupby子句分组查询,还支持groupby子句结合汇集函数分组记录查询,大某些原则SQL汇集函数都可以在HQL语句中使用,如:count(),sum(),max(),min(),avg()等。代码如下:Stringhql=“selectcount(user),user.agefromUserusergroupbyuser.agehavingcount(user)>10”Listlist=session.createQuery(hql).list();参数绑定:在Hibernate中也提供了查询参数绑定功能,并且在Hibernate中对这个功能还提供了比老式JDBC操作丰富特性。Hibernate共有3种参数绑定方式(1)按参数名称绑定在HQL语句中定义命名参数要用“:”开头,形式如下:Queryquery=session.createQuery(“fromUseruserwhere=:customernameanduser.age=:customerage”);query.setString(“customername”,name);query.setInteger(“customerage”,age);(2)按参数位置绑定在HQL查询语句中用“?”来定义参数位置,形式如下:Queryquery=session.createQuery(“fromUseruserwhere=?anduser.age=?”);query.setString(0,name);query.setInteger(1,age);(3)setParameter()办法在HibernateHQL查询中可以通过setParameter()办法绑定任意类型参数,代码如下:Stringhql=“fromUseruserwhere=:customername”;Queryquery=session.createQuery(hql);query.setParameter(“customername”,name,Hibernate.STRING);导航查询:Hibernate中第一种级联查询方式,导航指在一种类中通过一种类对象查找到另一种类中。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年版农田水利滴灌系统承包合同
- 2024茶叶原料出口贸易合同
- 2025年度知识产权专利池运营管理合同3篇
- 2024特色文化创意产品设计与生产合同
- 2024绿化水车租赁与生态旅游项目配套合同3篇
- 2025年度彩钢棚抗腐蚀涂料喷涂服务合同3篇
- 2025年度生产线承包与智能化生产数据分析合同3篇
- 2024年度氨水集中采购(安徽)3篇
- 2025年度海洋资源开发与利用技术合作协议3篇
- 2024版汽车融资租赁协议版
- 学校2025年寒假特色实践作业综合实践暨跨学科作业设计活动方案
- 2024数据资源采购及运营管理合同3篇
- 人教版小学数学一年级上册20以内加减混合口算练习题全套
- 《业务员销售技巧》课件
- 《汽车涂装》2024-2025学年第一学期工学一体化课程教学进度计划表
- 2024年物流运输公司全年安全生产工作计划例文(4篇)
- 二零二四年度软件开发合同:净水器智能控制系统定制开发协议3篇
- 糖尿病肌少症
- 2025年全国普通话考试题库
- 本票投资合同范本
- 山东省技能大赛青岛选拔赛-世赛选拔项目20样题(数字建造)
评论
0/150
提交评论