java课堂笔记总结hibernate1JDBC本质编写sql语句发送到数据库中执行在企_第1页
java课堂笔记总结hibernate1JDBC本质编写sql语句发送到数据库中执行在企_第2页
java课堂笔记总结hibernate1JDBC本质编写sql语句发送到数据库中执行在企_第3页
java课堂笔记总结hibernate1JDBC本质编写sql语句发送到数据库中执行在企_第4页
java课堂笔记总结hibernate1JDBC本质编写sql语句发送到数据库中执行在企_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

讲 web项目参照MVC图

JDBC本质,编写sql语句,发送到数据库中执行(sql语句),在企业开发需要程 》ORMO:对象(面向对象 MHibernate简介:最成功的开源的orm映射框架,底层封装的就是完全的面向对象(代码很少,一般是jdbc可以兼容世界上大部分数据库(Dao的代码开源兼容任意的数据库,hibernate会自动把我们写的hibernate代码,转化对应的数据库sql语句性能比较差,尤其是批处理方面,大数据量开发的时候,最好使用jdbc hql的功能相对薄弱(hql是hibernate中sql语句)hibernate3.2dochibernate的APIeg:hibernate的案例,开发时候可以用来参etchibernategrr:hql语libhibernate3方(3方jar:当前该框架所依赖的jarhibernate运行和扩展的jar)6)src:hibernate源代码hibernate.jar:hibernatehibernate开发的流程(导入jar,添加配置文件1)导入jar:建议去公司实际企业开发,jar和第3方jar,最好全部导入项目,当项目要上线时候,把不用的第3方jar,全部删除2)添加配置文件 下pertieshibernate po类(实体类编写orm映射文件 》 orm映射文 修改配置文 :加载orm映射文件利用hibernatehibernate中常用的1)Configuration:加载hibernate配置文a)直接创建Configuration对象(newConfiguration()):b)newConfigurationconfigure():hibernate.cfg.xml现在通用的版本)2)SessionFactory:hibernate中重量级对象,(重量级对象:企业开发中,消耗资源较多,功能强大的对象,叫做重量级对象)提供sessionSessionFactory,管理二级缓存......3)Session:hibernate中所有的增删查改操作都是依赖session对象实现其功(区别:Session:hibernate中实现增删查改操作的session。HttpSession:servlet中的会话,作用域...)hibernate对表的改变,必须依赖程序员开启事务,并提交事务操作增,改,删对比:jdbc自动提交事务参照:,简化只创建一个SessionFactory(给调用者提供session关闭使用session,实现增删查改增加:session.save(po对象);sessiondelete(po对象查询:session.get(po类名.class,id);sessionload(po类名.class,id);sessionupdate(po对象);cglibsession.load(Po.class,id)返回的对象,是目标对象的对象(暂时替代要查找的对= 就是临时代替id为1 eg:父 子类对象名字=new子类对Listlist=new该对象是由hibernate内部生成对(通过第3方jar:cglib.jar),该生成对象方式叫做cglib动load并没有立刻查询数据库,而且是在内部生成一个临时替代id=1的对只能有真正使用该对象中某些属性,hibernate才会真实的发出sql语句,查延迟加载:要查询对象的时候,不立刻发出sql语句查询数据,在hibernate内才发出sql语句,查询数据库,叫做延迟加载load方法:就是hibernate中最典型延迟加载Configurationconfiguration=newConfiguration().configure();SchemaExportschemaExport=newSchemaExport(configuration);schemaExport.create(true,true);封装Session对象目的:SessionFactoryprivatestaticSessionFactorysessionFactory;trysessionFactory=}catch(Exceptione)}}publicstaticSessiongetSessionInstance(){returnsessionFactory.openSession();}publicstaticvoidcloseSession(Sessionsession){if(session!=null){}}load使用load3)使用load查询的对象的只能在session范围内使用(cglib动态产生对象的生命周期,跟session一致先查询到要修改的对象,再调用update方法好处:稳定,不出错(不出现空直接创建新的对象,添加id根据对象idhibernate可以自动转化一些基本的类型也可以由我们自己来设置类型的转换格式:<propertytype="映射类型">type:可以指定两种类型:java类型和hibernate2)浮点类型:float,doubleboolean:yes_no:可以把yes或no转换对应Y或N默认是Ntrue_false:T或F 默认是Ftimestamp:年月日,时分秒类型hibernate<propertynot_null:非空unique:唯一update:修改insert:插入一张表中,主键最为重要,主键的生成策略是指hibernateuuid:每次插入新的数据时候,hibernate32位的不重复的字符目前mysqlsequence:主键自增,针对oracle等需要使用序列自增的数据库,依然依赖数据<idname="id"<generatornative:根据数据库的不同,使用不同生成策略,如果数据库是mysql等,生成策略identity,如果是oracle等(依赖序列),是sequence,使用非常广泛。hibernate是一个持久层框架,对象在hibernate3只用new方式创建的对象,都是处于临时态被session操作的对象,纳入session特点:持久态对象改变,直接同步到数据库中用session态托管态/当一个持久态的对象脱离sessionsave:临时态/瞬时态 这样单独使用save方法或使用update来替代save或updatesaveOrUpdatesave还是通过“外键”来关联关hibernate是面向对象,通过对象的操作来操作表使用hibernatepo对象,在底层通过orm<classname="Emp"<id<generator<property

<!--many-to-one:关联关系,利用创建外键deptIddept--<many-to-onename="dept"class="Dept"column="deptId"一对多关联映射(单向在hibernate中由一的一端来关联关系,多的不关联关系<setname="emps"<!--一对多单向关联映射,由一的一端来关联关系,外键deptId,由一的一端来创建,多的一端不关联关系--<!-- 1)该外键创建到多的一端t_emp表中<key<one-to-many多对一关联映射(双向)none:没有任何的级联操作(一般是默认allsave-update和delete企业开发时候,如果有需要级联操作的表,建议配置成all注在发送sql断是否需要对级联对象进行相应的操作态那他级联对象也会被删除但若对象是new象不会删除而是现将关联对象的外键设置为nulltrue:放弃关联关延迟加载(二目的:就是提高hibernatelazy懒加载:只有当真是使用该对象的,才发出sql<class>lazytruelazyfalselazytrue:支持延迟加载,是默认值lazy=false:延迟加载失效lazyextra集合端最常用的设置值,发出一条比较智能的sql语句,跟true很相似单端(<many-to-one):lazy的取值 :跟turefalsemyEclipse提示,是以目前用户使用最多的作为提示, 21)多对多关系的表,是由三张表构成,其中一张表,专门用来关联关hibernate当中只有两个类,用来关联关系的类,创建第三张表,用来关<!--多对多关联映射,由多(emp)的一端来关联关系,创建t_emp_role<key>当前t_emp<many-to-many中rid的值是t_role--

<setname="roles"<key<many-to-manyclass="Role"column="rId"></many-3多对多双向关联映射多对多两端的映射文件中的表名和列名必须一致<setname="emps"<key<many-to-manyclass="Emp"column="eId"></many-4一对一主键关联映射(单向<class " <idforeign:主键生成策略:是参照外键来生成自己主键foreign会取得关联对象的标--<generatorproperty:<param<property<one-to-onename="card"class="Card"5)如果是双向关联那么另一个表中的配置为<one-to-onename=" HQLhibernate中的sql语句sql直接操作数据库hibernate通过对象来操作不够准确导致性能消耗太大,可以使用一种近似sql的语句,来操作数据,这种语句就是hql1)frompoQueryhibernate中专门用来执行hqlQueryquery=query.list():hibernate可以把hqlList<Dept>list= tor<Dept> tor= Deptdept=i }}2)1frompoas别名格式2:frompo类名别名3:select别名fromeg:selectnew构造方法frompoStringhql="selectnewEmp(id,ename)from1)格式:select属性名frompo类名连接查询,建议使用别名.select别名.属性名frompoStringhql="selectd.dnamefromDept2)select123...frompo类名返回结果:list<Object[]>Stringhql="selecte.id,e.ename,e.agefromEmpe";List<Object[]>list=session.createQuery(hql).list(); tor<Object[]>i tor=list.i select属性名frompo类名where条件查询age=50的所有的emp员工的id,enameStringhql="selecte.id,e.enamefromEmpewheree.age=b)格式:select属性/frompo类名where条件+:别名查询部门id是5的所有的员工EmpEmp中Deptdept的fromEmpewheree.dept.id=Stringhql="fromEmpewheree.dept.id=:myId";List<Emp>list=session.createQuery(hql).setParameter("myId",总结:hql没办法直接查询外键,依赖于对象之间的关联关系,导向查询,比较麻是hql的缺点在hibernate中可以直接使用sqlStringsql="selectid,enamefromt_empwheredeptIdbetween1and3";List<Object[]>list=session.createSQLQuery(sql).list();

Stringhql="fromEmpewheree.dept.dnamelike?2)显示多表连接查询(通过join进行多表的连接a)(innersql:selecte.*,d.*fromt_empaseinnerjoint_deptasdone.deptId=d.id;hql也是利用join,可以省略连接的条件sql:fromEmpeinnerjoine.deptdStringhql="selecte.id,e.ename,d.id,d.dnamefromEmpeinnerjoine.deptd";List<Object[]>list=session.createQuery(hql).list();左外连接:(leftouterjoin)以左边的表为主sql:selectd.*,e.*fromt_deptdleftouterjoint_empeond.id=e.deptIdhql:fromEmpeleftouterjoine.deptd(rightouterjoin)sql:selectd.*,e.*fromt_deptdrightouterjoint_empeond.id=e.deptIdhql:fromEmperightouterjoine.deptStringhql="selecte.id,e.ename,d.id,d.dname""fromEmpeleftjoine.deptd";Stringhql="selecte.id,e.ename,d.id,d.dname"+"fromEmperightjoine.dept数据库,如果使用分页,则优先考虑hibernate自身List<Emp>list=session.createQuery("from使用hql插入一般都是用saveStringhql="deletefromDeptewheree.id=?";introw=session.createQuery(hql).setParameter(0,Stringhql="updateDeptssets.dname=?"+"wheres.id=?";introw=session.createQuery(hql).setParameter(0,.setParameter(1,使用 te查询对象中的n+1问使用 te查询对象的时候,先发出一条插叙id的sql语 根据查询出来的id,再发出n条sqln对比list方法跟 List1条sql te:发出n+1条sql语句Stringhql="fromDept"; tor<Dept>i tor=session.createQuery("fromDept").i Stringhql="selectcount(*)fromEmp";Listlist=在hibernate中使用count(*),返回值是longlongcount=longcount=2月28 星期

1hql(重点2Hibernate在进行数据时,会根据缓存管理策略,首先在缓存中查询,如果发现,则直接使用,避免数据库调用的开销,如果没有,则发出sql,去数据库中查询发出sqlHibernate缓存分为两个层次:Hibernate的缓存在两种情况下发挥作用:根据主键加载实体get,load使用HQL查询时 3一级缓存,是事务级缓存,也叫session一级缓存的数据结构是Map,用于查询实体。Map的key存放实体的Id,Map一级缓存的生命周期与Session有关,Session产生一级缓存创建,Session关闭一级 tor).在一个session内部,2次使用使用i te相同的对象没有发出n+1条sql语句,只发出查询对象id的sql语句ite1次查询emp2次再查询相同对象的时候,首先发出sql语句,查询对象的id,hibernate策略,先去缓存查询,有,直接使用。根据id找到value,所以没有发出查询对象的sql语句一级缓存不能禁用,但可以通过Session的clear方法和evict(较弱)方法清理一级缓存,evict:智能清理一个对象,或一类对象,一级缓存可以保存任意的对象,evict清理一flush:作用就是将session缓存中的数据跟数据库保持同步Session的save方写缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()或得Jdbc连接后使用Jdbc的相关API做批处理操作1二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二Hibernate默认情况下是打开的,提供一个Hashtable二级缓存,但只适用于研发,4)a)配置二级缓存的提供商c)添加缓存的配置文件encache.xml(src)d)设置缓存对象(一级缓存保存跟session有关所有的对象,二级缓存保存的 (laod):在两个session中,分别调用loadsession关闭该session发现第二次查询的是后仍然没有发出任何的sql1方法查询的时候查询回来Dept对象,保存到一级缓存和二级缓存中,当,一级缓存销毁,二级缓存的生命周期跟session无关,依然保存Dept2再次使用load方法查询同一个Dept对象的时候,hibernate的Dept对象,所以没有数据库,未发sql语 tor):在两个session中,使用 只发出查询id的sql语句,第1次查询使用

,当第2次再一个新的session中查询的时候,使用i te先发出查询id的语句,根据查询出来的id,去二级缓存中查询对应的对象也可以通过SessionFacotry的evict方法清理evict可以清除二级缓存中某一个对象或管理二级缓存,主要依赖SessionFactory中SessionFactoryfactory//从二级缓存中删除id1的deptfactory.evict(Dept.class,//2)去掉一类对象从二级缓存中删除所有的dept21)id在hibernate.cfg.xml<property (具体使用方法1).在两个session中,使用list方法,查询dname//第一个ses

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论