




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多 期: 天润4+5名 字: 陈宣任 日期作业: 12月8日Hibernate课堂授课知识点总结:hibernate基本知识hibernate一对一映射hibernate一对多(多对一)映射hibernate多对多映射hibernate的HQL检索学习Hibernate基本知识hibernate:hibernate就是一种可以自动的根据xml或annotation完毕对象关系映射(orm),并持久化到数据库的开源框架。是连接java应用程序和关系数据库的中间件,这是对JDBC的封装,重要负责java对象的持久化。ORM(Object Relation Mapping)对象关系映射是一种为理解决
2、面向对象与关系数据库存在的互不匹配的现象的技术。hibernate映射文献: 它的作用是描述持久层对象以及让她们的属性和数据库中的表和表的字段之间的相应关系。没有映射文献,Hibernate系统无法完毕Java对象和数据库表中的数据的互相转化。只有通过映射文献,Hibernate才干懂得所操作的对象与哪个表有关联。hibernate.cfg.xml文献中涉及了hibernate与数据库的基本连接信息。在Hibernate工作的初始阶段,由Configuration的对象启动hibernate框架,然后将信息加载到SessionFactory实例中。SessionFactory是Hibernat
3、e中的一种类,这个类重要负责保存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工作的初始阶段,这些信息被
4、先后加载到Configuration和SessionFactory实例。创立一种User.hbm.xml(类名.hbm.xml)。涉及Hibernate的基本映射信息,即系统中每一种类与其相应的数据库表之间的关联信息,在Hibernate工作的初始阶段,这些信息通过Hibernate.cfg.xml的mapping节点被加载到Configuration和SessionFactory实例。Hibernate关联映射:一对一:由数据库中共享主键实现(A表一行记录相应B表一行记录)。一对多:由外键约束实现(A表中一行记录相应B表中多行记录)。多对多:中间表约束实现(需要产生一种中间表,两个表与中间表
5、的关联关系为一对多)。hibernate级联关系映射叫高档映射,Hibernate是用于控制类的而不是表。级联关系在类中配备由映射文献进行描述。要想让表有关系,必须让两个类有关系。高档映射第一点:启动Hibernate的级联关系映射。两个类之间靠互换实例来进行关系访问。(实例重要用来负责级联操作)。实体对象的三个生命周期: 所谓的Hibernate实体对象的生命周期就是指Hibernate的实体对象在整个应用中的存在状态。实体对象的生命周期中重要存在三种不同的状态,她们分别是:Transient(瞬态),Persistent(持久态),Detached(游离态),这三种状态的定义与所谓的持久化
6、上下文(persistence context)有关,Hibernate的Session对象就是这个所谓的持久化上下文。Hibernate中load()和get()的异同相似点:功能上是同样的全是通过该对象的标示符来得到一种持久化对象,可以理解为根据id加载一种对象。不同点::区别在于返回值的差别,load()如果没有找到该对象的时候它是抛出异常的,而get()如果没有找到该对象将会返回null。Session.get()不支持数据缓存,永远查询数据库。Session.load()支持数据缓存,查询的内存完毕一次Hibernate框架启动的七个环节:1创立Configuration对象(Con
7、figuration conf=new Configuration();conf.configure();重要作用配备和启动Hibernate框架,读取Hibernate.cfg.xml核心配备文献)2.创立SessionFactory对象 3.通过SessionFactory对象创立Session对象 4.通过Session启动一种事物并得到一种Transaction对象(Transaction对象重要合用于事务管理,一种事务对象也许涉及多种数据库进行操作) 5.通过Session与数据库进行会话及持久化操作6.提交操作结束事物提交事务7.关闭Session释放资源hibernate生成数据
8、库表的两种方式:第一种:Configuration cfg = new Configuration().configuration(); SchemaExport export = new SchemaExport(cfg); Export.create(true,true);/参数一与否发送Hibernate自定义的建表脚本到数据库中,参数二与否让数据库执行发送过去的脚本。第二种:通过保存数据用Save(对象名)措施。持久化信息的措施:创立一种Configuration对象:Configuration conf = new Configuration();通过Configuration对象的
9、configure()措施加载Hibernate配备文献。conf.configure();创立一种SessionFactory实例SessionFactory factory = conf.buildSessionFactory();通过SessionFactory实例创立Session实例 Session sion = factory.openSession();通过Session实例启动事务,得到事务对象。Transaction tran = sion.beginTransaction();使用Session实例的save()措施,传入实体类对象,将User对象持久化。Sion.save
10、(Object);Tmit();在创立Session实例后,不管与否执行事务,最后都需要关闭Session实例,释放Session实力占用的资源。Session.close();Hibernate一对一映射(人与身份证的关系)一对一关联映射:可分为主键关联映射和唯一外键关联映射(是多对一的一种特殊体现形式)两种,同步,这两种关联映射又分为单向关联和双向关联。单向一对一主键关联映射:在任意一方存储另一方的实例对象。一对一级联关系创立及配备的标记用标签.双向一对一主键关联映射:双方需要分别存入对方的实力对象。标签中的常用属性解析name:的级联关系需要name指定的成员来实现。class:为指定的
11、对象类。constrained=”true”:添加数据库底层约束。表白A表对象必须和一种B表对象关联,也就是说A对象中的B属性不能为空。fetch:控制两表连接查询。Hibernate一对多(多对一)映射(班级和学生的关系)一对多(save一方):在多方为一方创立外键。注意:一对一靠类中的对象实现,一对多需要靠容器(集合)实现,在这里我们选择Set集合,由于Set不能存入反复值。并且set中有HashSet,可以用Hash算法辅助数据库查询。一对多级联关系创立及配备的标记用标签中的标签一对多级联配备文献的例子: 注意:当一方操作多方的时候(级联关系由一方维护)做添加的时候有7个SQL语句(注意
12、此时的SQL语句数量根据你插入的信息数来看,如果你插入两条信息则是5个SQL语句。如果你插入三条信息则是7个SQL语句)可以用2n+1这个算法来计算产生的SQL语句数。(n表达添加的信息条数)当一方操作多方时有两个问题: 第一:当一方操作多方的时候(级联关系由一方维护)做添加的时候有2n+1个SQL语句。(n表达添加的信息条数)第二:外键不容许为空(null)的时候一方无法操作多方。对多对(save多方):在多的一方存入一方的类对象。注意:进行多对一操作时,此时多方需要给自己添加一种外键,即在中加一种column,这里的外键(column)的值最佳和在一方的映射文献中的标签的column值相似
13、。瞬时状态异常产生的因素(一对多和多对多常常浮现):数据库中无存入的信息。即操作不级联时会产生瞬时状态异常。此时应设立cascade属性值为all,注意cascade的属性值应当谨慎设立。当多方操作一方的时候昨天加的时候浮现4个SQL语句,由于多方不需要额外拼写修改外键的语句。双向级联关系:(在双向一对多的时候,一方和多方都需要配备外键,并且两个外键的名字相似。)当双方的关系都存在的时候,Hibernate框架默认选择一方为级联关系的主控方(一对多)。因此,如果但愿让多方来维护,则要在一方的映射配备文献中的标签中添加inverse属性值为true。inverse=”true” 属性表达让目前一
14、方反转出级联关系的主控权。由多方来维护级联关系。Inverse属性设立在集合类中,而和则无此属性.注意:多方控制级联关系的性能强于一方,并且双向级联时双方的方略都需要存在。Cascade是Hibernate提供的级联方案。Cascade=“all”表达无论何时(无论什么操作)都产生级联操作。Cascade属性是设立级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作。默认cascade=”none”。使用该属性时应当谨慎(例如在进行删除操作时最佳将Cascade的属性值设立为save-update) 延迟加载:延迟加载方略:设立延迟加载方略时需要把抓取方略删除即fetch=”jo
15、in”删除。Lazy=”true”延迟加载方略(此时为懒的状态)。/一般为此状态Lazy=”false”(此时为不懒的状态),只要类被加载则和其有级联关系的类也会被加载。Lazy会照成性能的损耗。延迟加载是Hibernate为理解决性能问题而浮现的。Lazy属性值为true时,该属性的值不会被立即加载,只有在真正的读取该属性的值时,其值才会真正的从数据库中读取,这在解决大型字段时非常有用。例如:在顾客信息表中也许有一种很长的顾客简介字段,但在诸多状况下并不需要显示和解决这个字段,因此可以将其Lazy属性的值设立为true。以避免每次读取这个对象的时候都将顾客的简介字段读出。Hibernate多
16、对多映射(顾客和角色)多对多(顾客和角色):两个表自身都无法描述她们的多对多关系。此时需要通过第三张表进行多对多描述,此时即产生一张中间表。注意:需要在A表中和B表中分别存入以双方为泛型的Set集合对象。 中间表:中间表中存储的是A类和B类的主键,在中间表中当外键。多对多和一对多操作中标签的区别:标签用来为别的表产生外键。在多对多中,标签用来指定该持久类为中间表创立的外键名。在一对多中,标签用来指定一方为多方创立的外键名称。标签和标签中column的区别:中的column代表在中间表中生成的外键。中的column代表在本表中生成的外键名。即在多方生成的外键名称。在配备多对多关系时应注意:第一:
17、双方的set都必须指定table,并且table名字必须一致。第二:双方均有key标记,单独一方的key标记中的column的名字,应当相应此外一方的标签中column名字。注意:如果table不同样,会产生两个中间表。Column值不同样会在中间表中产生四个外键。注意:对多对和多对一操作时,只操作单一的一方即可,一对多时如果是双向级联,则需要添加双方的级联方略。Hibernate的HQL检索学习HQL查询:连接查询在项目开发中是非常常用的技术,Hibernate推出了HQL查询,它提供了更加丰富和灵活的查询特性,同步也提供了更加面向对象的封装。HQL查询非常类似于原则SQL查询。HQL查询在
18、整个Hibernate实体操作体系中占据核心地位,我们可以通过实体查询,实体的更新和删除,属性查询,分组与排序,参数绑定来体验HQL的实际应用。Hibernate框架的六种检索方式: 第一种:OID(Object ID)检索方式,session的get()和load()措施。该种检索方式一般为单条检索,id不能反复。相称于Select * from where id=?第二种:HQL检索方式,(浮现复杂查询时使用),它是一种语法类似于SQL,但是,是面向对象的查询语言。SQL语言面向的数据库。第三种:面向对象的检索(通过ORM,操作持久态对象进行检索)第四种:QBC(条件拼接查询)检索方式,第
19、五种:QBE(多维查询)检索方式(BI业务上通用,BI的业务重要是对于数据库,重要工作是数据的抓取,数据分析,多维分析)第六种:SQL(原生SQL的检索方式)HQL语句中的检索技术: 第一种:实体查询(实体等于对象,等于实例)查询出来的都是实体=查询出来的都是持久态对象=表中的行,该种查询查出来的记录都是一行一行的。SQL语句中没有行查询,但是HQL语句中有。第二种:属性查询 = 查询出来的都是持久态对象的属性 = 表中的列注意:有无select是实体查询和属性查询的一种重要区别。并且在HQL中select和from中间是持久态类的对象。第三种:条件查询 = 函数(组函数=聚合函数count(
20、*) ,sum(), max() ,min() ,avg()),记录查询属于条件查询的一种。注意:组函数的一种重要特点为成果集唯一!返回的值为单一值!第四种:DML风格(delete,update,insert)在HQL语句中永远没有insert插入语句,由于Hibernate有Save()措施。第五种:外置查询第六种:过滤查询第七种:导航查询(在有级联关系的基本上进行查询的)第八种:连接查询(在有级联关系的基本上进行查询的)第九种:分页查询注意:HQL语句需要转义成SQL语句进行执行,HQL可以省略动词,SQL一共九个动词。HQL语句按照hibernate.cfg.xml配备中的数据库的方言
21、转义成相应的SQL语句。Hibernate面向对象,SQL语句面向数据库。Hibernate中的N+1问题:一方面查询这个表中所有的id,再按照每一种id进行查询。.iterate()成果集支持数据库的缓冲技术。.list()成果集不支持。 N+1问题的解决方案:一方面把数据从数据库中查找出来,存到list中,在进行iterate查询操作。数据库的缓存技术:数据缓存指的是把数据加载到缓存区中,首页从缓存区中查询数据。在进行第一次查询的同步,将数据从数据库加载到首页的同步也将数据加载到缓存区中(即内存中),再进行刷新时就从内存中进行查询。Iterate()措施不找数据库,它查询数据缓存。 注意:
22、.list()措施不支持数据库缓存,查询的是数据库。.iterate()措施支持数据缓存,查询的是内存。Hibernate执行list()措施会默认的把数据放入到缓存中。Session.get()不支持数据缓存,永远查询数据库。Session.load()支持数据缓存,查询的内存。get()措施如果没有查到值返回null,load()如果没有查到值浮现异常。实体查询:实体查询技术的实现,需要将实体对象中的所有数据存储到List对象中,例如查询出User实体对象相应的所有数据,并且将每条数据封装成User实体对象,并且放入List中返回。代码如下:String hql = “from User
23、user”;List list = session.CreateQuery(hql).list();由于HQL语句与原则SQL语句相似,因此也可以在HQL语句中使用where子句,并且可以在where子句中使用多种体现式,比较操作符以及使用“and”,”or”连接不同的查询条件的组合。如:from User user where user.age=20;from User user where user.age between 20 and 30;from User user where user.age in(20,30);from User user where is null;from
24、User user where like %zx%;from User user where (user.age%2)=1;from User user where user.age=20 and like %zx%;实体的更新和删除:实体更新和删除技术是Hibernate 3新加入的功能,在Hibernate 2中是不具有的。例如在Hibernate 2中,如果想将数据库中所有18岁顾客的年龄改为20岁,那么要一方面将年龄为18岁的顾客检索出来,然后将她们的年龄修改为20岁,最后调用Session.update()语句进行更新。在Hibernate 3中对这个问题提供了更加灵活和有效率的解决
25、措施,如下面的代码:Transaction trans = session.beginTransaction();String hql = “update User user set user.age = 20 where user.age=18”;Query queryupdate = session.createQuery(hql);Int ret = queryupdate.executeUpdate();Tmit();通过这种方式可以在Hibernate 3中一次性完毕批量数据的更新,对性能的提高非常可观。同样也可以通过类似的方式来完毕delete操作,代码如下所示:Transacti
26、on trans = session.beginTransaction();String hql = “delete from User user where user.age=18”Query queryupdate = session.createQuery(hql);Int ret = queryupdate.executeUpdate();Tmit();属性查询:诸多时候我们在检索数据时,并不需要获得实体对象所相应的所有数据,而只需要检索实体对象的部分数据相应的数据,这时候就可以运用HQL属性查询技术,如下所示:List list= session.createQuery(“selec
27、t from User user”).list();for(int i=0;ilist.length();i+) System.out.println(list.get(i); 也可以一次检索User对象的多种属性,如下面的程序: List list=session.createQuery(“select , user.age from User user”).list(); for(int i=0;ilist.length();i+) Object obj=(Object)list.get(i); System.out.println(obj0); System.out.println(ob
28、j1); 从面向对象的角度考虑,上面返回Object不符合面向对象风格,这时我们可以运用HQL提供的动态构造实例的功能对这些平面数据进行封装,如下面的程序代码: List list = session.createQuery(“select new User( , user.age) from User user ”).list(); for(int i=0;i10”List list = session.createQuery(hql).list();参数绑定:在Hibernate中也提供了查询参数绑定功能,并且在Hibernate中对这个功能还提供了比老式JDBC操作丰富的特性。Hiber
29、nate共有3种参数绑定方式(1) 按参数名称绑定在HQL语句中定义命名参数要用“:”开头,形式如下:Query query = session.createQuery(“from User user where =:customername and user.age=:customerage”);query.setString(“customername”,name);query.setInteger(“customerage”,age);(2)按参数位置绑定在HQL查询语句中用“?”来定义参数位置,形式如下:Query query = session.createQuery(“from U
30、ser user where =? and user.age=?”);query.setString(0,name);query.setInteger(1,age);(3)setParameter()措施在Hibernate的HQL查询中可以通过setParameter()措施绑定任意类型的参数,代码如下:String hql = “from User user where =:customername”;Query query = session.createQuery(hql);query.setParameter(“customername”,name,Hibernate.STRING);导航查询: Hibernate中第一种级联查询方式,导航指在一种类中通过一种类的对象查找到另一种类中。Select s.username from Student s where (此处用到了导航) like %天%;连接查询:(left join ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广告设计师如何提升2024年考试综合素质试题及答案
- 天一试题及答案物理
- 深入研究2024年国际商业设计师的职业选择试题及答案
- 2024年助理广告师考试管理能力试题及答案
- 德语课堂考试题及答案
- 2024年助理广告师考试疑难重点试题及答案
- 弱电运行考试试题及答案
- 探索国际商业美术设计师考试试题及答案
- (二模)临沂市2025年高三高考模拟考试语文试题卷(含答案)
- 北大校规校纪试题及答案
- 气候变化适应成本-深度研究
- 第2课《风铃》课件 花城版音乐三年级下册
- R245fa螺旋管内分液冷凝特性实验研究
- 【营销方案】2025小红书平台营销通案
- 应急疏散的标识与规范
- 光伏项目服务承诺书
- 人教版三年级下册数学口算题题卡1000道带答案可打印
- 竣工结算审计服务投标方案(2024修订版)(技术方案)
- 《健康成年人身体活动能量消耗参考值》
- 热力学统计物理-第四版-汪志诚-课后答案
- 《铁路工务维修现场实战技巧》课件 任务2.9轨道检查仪作业
评论
0/150
提交评论