还剩6页未读,继续阅读
文本内容:
多期天润4+5名字陈宣任日期作业月日128课堂授课知识点总结Hibernate一,基本知识hibernate二一对一映射.hibernate三.一对多多对一映射hibernate四.多对多映射hibernate五.检索学习hibernateHQL一.基本知识Hibernate
1.hibernate:hibernate就是一种可以自动依照xml或annotation完毕对象关系映射orm,并持久化到数据库开源框架是连接java应用程序和关系数据库中间件,这是对JDBC封装,重要负责java对象持久化
2.ORMObject RelationMapping对象关系映射是一种为理解决面向对象与关系数据库存在互不匹配现象技术
3.hibernate映射文献它作用是描述持久层对象以及让她们属性和数据库中表和表字段之间相应关系没有映射文献,Hibernate系统无法完毕Java对象和数据库表中数据互相转化只有通过映射文献,Hibernate才干懂得所操作对象与哪个表有关联
4.文献中包括了hibernate与数据库基本连接信息在Hibernate工作初始阶段,由Configuration对象启动hibernate框架,然后将信息加载到SessionFactory实例中
5.SessionFactory是Hibernate中一种类,这个类重要负责保存Hibernate配备信息,以及对Session操作
6.手动创立hibernate框架环节a拷贝所需Jar包到lib目录下,基本包括antlr.jar,cglib.jsr,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar,hibemate
3.jar,hibemate-annotations.jarb在src目录下创立一种文献,该文献包括了hibernate与数据库连接基本连接信息在Hibernate工作初始阶段,这些信息被先后加载到Configuration和SessionFactory实例c创立一种跳©匚世!
11.*1111类名
113111.*1111包括Hibernate基本映射信息,即系统中每一种类与其相应数据库表之间关联信息,在Hibernate工作初始阶段,这些信息通过Hibernate.cfg.xmlmapping节点被加载到Configuration和SessionFactory实例
7.Hibernate关联映射:一对一:由数据库中共享主键实现A表一行记录相应B表一行记录一对多油外键约束实现A表中一行记录相应B表中多行记录多对多:中间表约束实现需要产生一种中间表,两个表与中间表关联关系为一对多
8.hibernate级联关系映射叫高档映射,Hibernate是用于控制类而不是表级联关系在类中配备由映射文献进行描述要想让表关于系,必要让两个类关于系
9.高档映射第一点:启动Hibernate级联关系映射两个类之间靠互换实例来进行关系访问实例重要用来负责级联操作
10.实体对象三个生命周期所谓Hibernate实体对象生命周期就是指Hibernate实体对象在整个应用中存在状态实体对象生命周期中重要存在三种不同状态,她们分别是Transient瞬态,Persistent持久态,Detached游离态,这三种状态定义与所谓持久化上下文persistence context关于,HibernateSession对象就是这个所谓持久化上下文
11.Hibernate中load和get异同相似点功能上是同样全是通过该对象标示符来得到一种持久化对象,可以理解为依照id加载一种对象不同点区别在于返回值差别,load如果没有找到该对象时候它是抛出异常,而get如果没有找到该对象将会返回nullSession.get不支持数据缓存,永远查询数据库Sessionhad支持数据缓存,查询内存
12.完毕一次Hibernate框架启动七个环节1仓ij立Configuration对象Configuration conf=new Configuration;conf,configure;重要作用配备和启动Hibernate框架,读取Hibernate.cfg.xml核心配备文献
2.创立SessionFactory对象
3.通过SessionFactory对象创立Session对象
4.通过Session启动一种事物并得到一种Transaction对象Transaction对象重要合用于事务管理,一种事务对象也许涉及各种数据库进行操作
5.通过Session与数据库进行会话及持久化操作
6.提交操作结束事物提交事务
7.关闭Session释放资源
13.hibernate生成数据库表两种方式第一种:Configuration cfg=new Configuration.configuration;SchemaExport export=new SchemaExportcfg;Export.createtrue,true;//参数一与否发送Hibernate自定义建表脚本到数据库中,参数二与否让数据库执行发送过去脚本第二种:通过保存数据用Save对象名办法
14.持久化信息办法i.创立——种Configuration对象:Configuration conf=new Configuration;ii.通过Configuration对象configure办法加载Hibernate配备文献conf.configure;iii.仓II立一种SessionFactory实例SessionFactory factory=conf.buildSessionFactory;iv.通过SessionFactory实例仓ll立Session实例Session sion=factory.openSession;v.通过Session实例启动事务,得到事务对象Transaction tran二sion.beginTransaction;vi.使用Session实例save办法,传入实体类对象,将User对象持久化Sion.save(Object);Tran.commit();vii.在创立Session实例后,无论与否执行事务,最后都需要关闭Session实例,释放Session实力占用资源Session.close();二.一对一映射(人与身份证关系)Hibernate
1.一对一关联映射:可分为主键关联映射和唯一外键关联映射(是多对一一种特殊体现形式)两种,同步,这两种关联映射又分为单向关联和双向关联
2.单向一对一主键关联映射:在任意一方存储另一方实例对象一对一级联关系创立及配备标记用〈one-to-one/标签.
3.双向一对一主键关联映射:双方需要分别存入对方实力对象
4.one-to-one/标签中惯用属性解析
(1)name:one-to-one/级联关系需要name指定成员来实现
(2)class:为指定对象类
(3)constrained=true”:添加数据库底层约束表白A表对象必要和一种B表对象关联,也就是说A对象中B属性不能为空
(4)fetch:控制两表连接查询三.Hibernate一对多(多对一)映射(班级和学生关系)
1.一对多(save一方):在多方为一方创立外键注意:一对一靠类中对象实现,一对多需要靠容器(集合)实现,在这里我们选取Set集合,由于Set不能存入重复值并且set中有HashSet,可以用Hash算法辅助数据库查询一对多级联关系创立及配备标记用set/标签中one-to-many/标签
2.一对多级联配备文献例子set name=student”cascade=,,all,,key column=,,classes_id,,x/keyone-to-many class=,,Studenf7/set
3.注意:当一方操作多方时候(级联关系由一方维护)做添加时候有7个SQL语句(注意此时SQL语句数量依照你插入信息数来看,如果你插入两条信息则是5个SQL语句如果你插入三条信息则是7个SQL语句)可以用2n+l这个算法来计算产生SQL语句数(n表达添加信息条数)
4.当一方操作多方时有两个问题第一:当一方操作多方时候(级联关系由一方维护)做添加时候有2n+l个SQL语句(n表达添加信息条数)第二:外键不容许为空(null)时候一方无法操作多方
5.对多对(save多方):在多一方存入一方类对象
6.注意进行多对一操作时,此时多方需要给自己添加一种外键,即在many-to-one/many-to-one中力口——种column,many-to-one name=classes”class=Classes”column=,,classes_id,,x/many-to-one,这里外键(column)值最佳和在一方映射文献中kcy/标签column值相似
7.瞬时状态异常产生因素(一对多和多对多经常浮现):数据库中无存入信息即操作不级联时会产生瞬时状态异常此时应设立cascade属性值为all,注意cascade属性值应当谨慎设立
8.当多方操作一方时候昨天加时候浮现4个SQL语句,由于多方不需要额外拼写修改外键语句
9.双向级联关系:(在双向一对多时候,一方和多方都需要配备外键,并且两个外键名字相似)当双方关系都存在时候,Hibernate框架默认选取一方为级联关系主控方(一对多)因而,如果但愿让多方来维护,则要在一方映射配备文献中〈set/>标签中添加inverse属性值为true
10.inverse=true属性表达让当前一方反转出级联关系主控权由多方来维护级联关系Inverse属性设立在集合类中,而vmany・to-many>和vone・to・one>则无此属性.
11.注意:多方控制级联关系性能强于一方,并且双向级联时双方方略都需要存在
12.Cascade是Hibernate提供级联方案Cascade、“all”表达无论何时(无论什么操作)都产生级联操作Cascade属性是设立级联操作也就是在操作一端数据如果影响到多端数据时会进行级联操作默认cascade=noneL使用该属性时应当慎重(例如在进行删除操作时最佳将Cascade属性值设立为save-update)
13.延迟加载延迟加载方略:设立延迟加载方略时需要把抓取方略删除即fetch=join”删除Lazy=true”延迟加载方略(此时为懒状态)〃普通为此状态Lazy=false”(此时为不懒状态),只要类被加载则和其有级联关系类也会被加载Lazy会照成性能损耗延迟加载是Hibernate为理解决性能问题而浮现Lazy属性值为true时,该属性值不会被立即加载,只有在真正读取该属性值时,其值才会真正从数据库中读取,这在解决大型字段时非常有用例如:在顾客信息表中也许有一种很长顾客简介字段,但在诸多状况下并不需要显示和解决这个字段,因此可以将其Lazy属性值设立为true以避免每次读取这个对象时候都将顾客简介字段读出o四.多对多映射(顾客和角色)Hibernate
1.多对多(顾客和角色):两个表自身都无法描述她们多对多关系此时需要通过第三张表进行多对多描述,此时即产生一张中间表注意:需要在A表中和B表中分别存入以双方为泛型集合对象Set
2.中间表:中间表中存储是A类和B类主键,在中间表中当外键
3.多对多和一对多操作中vkey/>标签区别:<key/>标签用来为别表产生外键在多对多中,<key/>标签用来指定该持久类为中间表创立外键名在一对多中,<key/>标签用来指定一方为多方创立外键名称
4.<man-to-many/>标签和〈many・to・one/>标签中column区别:<many-to-many>中column代表在中间表中生成外键<many-to-one/>中column代表在本表中生成外键名即在多方生成外键名称
5.在配备多对多关系时应注意第一:双方set都必要指定table,并且table名字必要一致第二:双方均有key标记,单独一方key标记中column名字,应当相应此外一方<many-to-many/〉标签中column名字注意:如果table不同样,会产生两个中间表Column值不同样会在中间表中产生四个外键
6.注意:对多对和多对一操作时,只操作单一一方即可,一对多时如果是双向级联,则需要添加双方级联方略五.检索学习HibernateHQL
1.HQL查询:连接查询在项目开发中是非常惯用技术,Hibernate推出了HQL查询,它提供了更加丰富和灵活查询特性,同步也提供了更加面向对象封装HQL查询非常类似于原则SQL查询HQL查询在整个Hibernate实体操作体系中占据核心地位,我们可以通过实体查询,实体更新和删除,属性查询,分组与排序,参数绑定来体验HQL实际应用框架六种检索方式
2.Hibernate第一种:OID(Object ID)检索方式,sessionget和load办法该种检索方式普通为单条检索,id不能重复相称于Select*from whereid=第二种:HQL检索方式,(浮现复杂查询时使用),它是一种语法类似于SQL,但是,是面向对象查询语言SQL语言面向数据库第三种:面向对象检索(通过ORM,操作持久态对象进行检索)第四种:QBC(条件拼接查询)检索方式,第五种:QBE(多维查询)检索方式(BI业务上通用,BI业务重要是对于数据库,重要工作是数据抓取,数据分析,多维分析)第六种:SQL(原生SQL检索方式)语句中检索技术
3.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语句按照配备中数据库方言转义成相应SQL语句Hibernate面向对象,SQL语句面向数据库
4.Hibernate中N+1问题:一方面查询这个表中所有id,再按照每一种id进行查询.iterate成果集支持数据库缓冲技术.list成果集不支持N+1问题解决方案:一方面把数据从数据库中查找出来,存到list中,在进行iterate查询操作
5.数据库缓存技术:数据缓存指是把数据加载到缓存区中,首页从缓存区中查询数据在进行第一次查询同步,将数据从数据库加载到首页同步也将数据加载到缓存区中(即内存中),再进行刷新时就从内存中进行查询Iterate办法不找数据库,它查询数据缓存注意:办法不支持数据库缓存,查询是数据库.iterate办法支持数据缓存,查询是内存Hibernate执行list办法会默认把数据放入到缓存中Session.get()不支持数据缓存,永远查询数据库Session.load支持数据缓存,查询内存get办法如果没有查到值返回milljoad如果没有查到值浮现异常
6.实体查询实体查询技术实现,需要将实体对象中所有数据存储到List对象中,例如查询出User实体对象相应所有数据,并且将每条数据封装成User实体对象,并且放入List中返回代码如下String hql=ufrom User user”;List list=session.CreateQueryhql.list;由于HQL语句与原则SQL语句相似,因此也可以在HQL语句中使用where子句,并且可以在where子句中使用各种表达式,比较操作符以及使用“and,or连接不同查询条件组合如from User user where user.age=20;from User user where user,age between20and30;from User user where user.age in20,30;from User user whereuser.name isnull;from User user whereuser.name like%zx%;from User user whereuser.age%2=l;from Useruser whereuser.age=20and user,name like%zx%;
7.实体更新和删除实体更新和删除技术是Hibernate3新加入功能,在Hibernate2中是不具备例如在Hibernate2中,如果想将数据库中所有18岁顾客年龄改为20岁,那么要一方面将年龄为18岁顾客检索出来,然后将她们年龄修改为20岁,最后调用Session,update语句进行更新在Hibernate3中对这个问题提供了更加灵活和有效率解决办法,如下面代码Transaction trans=session.beginTransaction;String hql=uupdate Useruser setuser,age=20whereuser.age=18,,;Query queryupdate=session.createQueryhql;Int ret=queryupdate.executeUpdate;Trans,commit;通过这种方式可以在Hibernate3中一次性完毕批量数据更新,对性能提高非常可观同样也可以通过类似方式来完毕delete操作,代码如下所示Transaction trans=session.beginTransaction;String hql二udelete from Useruser whereuser.age=18v;Query queryupdate=session.createQueryhql;Int ret=queryupdate.executeUpdate;Trans,commit;
8.属性查询诸多时候我们在检索数据时,并不需要获得实体对象所相应所有数据,而只需要检索实体对象某些数据相应数据,这时候就可以运用I1QL属性查询技术,如下所示List list=session.createQueryselect user,name from Useruser,,.list;forinti=0;ilist.length;i++{System,out.printinlist,geti;也可以一次检索User对象各种属性,如下面程序List list=session.createQuery^select user.name,user.age from Useruser“.list;for inti=0;ilist.length;i++{Object[]obj=Object[]list,get i;System,out.printinobj
[0];System.out.printlnobj
[1];}从面向对象角度考虑,上面返回Object口不符合面向对象风格,这时我们可以运用HQL提供动态构造实例功能对这些平面数据进行封装,如下面程序代码List list=session.createQuery selectnew Useruser,name,user,age fromUseruser.list;forint i=0;ilist.length;i++{Useruser二Userlist,get i;System.out.printin user.getName;System.out.printinuser.getAge;}上面实现更加符合面向对象风格,但这时所返回User对象,只是一种普通java对象,除了查询成果值之外,它属性值都为null涉及主键值id,也就是说不能通过Session对像对此对象执行持久化更新操作
9.分组与排序lorder by子句与SQL语句相似,HQL查询也可以通过order by子句对查询成果集进行排序,并且可以通过asc或者desc核心字指定排序方式,代码如下fromUseruser orderby user,name asc,user.age desc;2group by子句与记录查询在H QL语句中同样支持使用group by子句分组查询,还支持group by子句结合汇集函数分组记录查询,大某些原则SQL汇集函数都可以在IIQL语句中使用,如count,sum,max,min,avg等代码如下:String hql=select countuser,user.age fromUserusergroup byuser.age havingcountuser10v;List list=session.createQueryhql.list;
10.参数绑定:在Hibernate中也提供了查询参数绑定功能,并且在Hibernate中对这个功能还提供了比老式JDBC操作丰富特性Hibernate共有3种参数绑定方式1按参数名称绑定在HQL语句中定义命名参数要用“”开头,形式如下Query query=session.createQuery fromUseruser whereuser.name=:customername anduser.age=:customeragev;query.setString customername”,name;query,setintegerucustomerage,age;⑵按参数位置绑定在HQL查询语句中用来定义参数位置,形式如下Query query=session.createQueryfromUseruserwhereuser,name二?and user,age二?;query.setString0,name;query,setinteger1,age;3setParameter办法在HibernateHQL查询中可以通过setParameter办法绑定任意类型参数,代码如下String hql=fromUseruserwhereuser.name=:customername;Query query=session.createQueryhql;query.setParameter ucustomernamev,name,Hibernate.STRING;
11.导航查询Hibernate中第一种级联查询方式,导航指在一种类中通过一种类对象查找到另一种类中Select s.username fromStudent swhere§©2§§€§.1121110此处用至!了导航like%天%、
12.连接查询join,inner join,right join,full join满连接,普通不用.连接查询必要依托导航查询来实现1内连接:Select c.name,s.username fromStudent sinner joins.classes c;内连接Xs.classes相称于得到Classes这个类2左连接:会查找出左表所有记录,和左右表中相似记录Select c.name,s.username fromClassesc leftjoin c.student s3右连接:会查找出右表所有记录,和左右表中相似记录Select c.name,s.username fromClassesc rightjoin c.student s
13.源生SQL查询:.createSQLQuery,此时可以用SQL语句进行修改和删除尚有插入.addEntity类名.class可以进行查询
14.分页查询Hibernate框架中封装好了分页算法需要拟定参数
1.每页显示信息条数
2.总记录数
3.写一种办法变化查询游标初始位置需要核心业务:两个第一:必要能控制每次查询成果集范畴第二:必要能自定义查询初始游标位置相称于Oracle中RowNum嵌套查询,可以通过上一页变量-5或下一页变量+5传记录数,也可以传页数,此时上一页变量-1下一页变量+1此时需要用1*每页显示记录数
5.传记录数和传页数区别在于出传记录数不需要解决,传页数需要解决即1*每页显示记录数操作数据库两种办法
15.Hibernate第一种:使用持久化类对象ORM;第二种:使用HQL语句
16.动态构造:查询成果返回值为自己构造一种对象此时需要在持久态类中写上该构造函数又叫属性构造器,才可以在HQL语句中使用该构造函数实体构造器:无参数构造函数属性构造器:自定义参数构造函数
17.属性查询由于按照列来查询,其返回成果集不再是对象在HQL语句中以from开头是实体查询,以select开头是列查询在单一属性查询中我们查询这个属性它在持久态类中是什么数据类型我们返回值就是什么类型(单一查询得到数据类型)在查询多类型时,其集合元素是对象数组,数组元素类型和相应属性在实体类中类型一致数组长度取决与select中属性个数(多类型查询得到是object数组)。
个人认证
优秀文档
获得点赞 0