hibernate_java_框架.doc_第1页
hibernate_java_框架.doc_第2页
hibernate_java_框架.doc_第3页
hibernate_java_框架.doc_第4页
hibernate_java_框架.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

HibernateJDBC的缺点:1。JDBC本质:编写sql语句,发送到数据库中执行(sql) 在企业开发需要程序员转换编程的思想,从面向对象到sql。2。JDBC代码太过于繁琐,容易出错。3。ORM对象关系映射框架:Object Relation Mapping O:对象(面向对象)R:关系(关系类数据库)M:映射O-M-R用面向对象的编程思想,操作关系型数据库。4。Hibernate简介:最成功的开源的ORM映射框架,底层封装的就是JDBC对于程序员,对数据库表的操作,完全面向对象内部封装是JDBC,obj-sql5。Hibernate的优点:免费开源,完全的面向对象(针对程序员对表的操作完全面向操作)代码很少,一般是jdbc的三分之一,提高开发的效率。可以兼容世界上大部分数据库(DAO的代码可以兼容任意的数据库,hibernate底层会自动把我们写的hibernate代码,转化为对应的数据库sql语句)6。Hibernate的缺点:性能比较差,尤其是批处理方面,大量开发的时候,最好使用jdbchql的功能相对薄弱(hibernate中的sql语句)7。hibernate3.2介绍:doc:hibernate的API,了解即可。eg:hibernate官方提供的案例,开发时可以用来参照etc:其中放了常用配置文件grammar:hql语法规则lib:hibernate中的所有第三方jar包,第三方jar包:当前该框架所依赖的jar包hibernate运行和扩展的jar包src:hibernate的所有源代码test:hibernate用于测试的代码官方建议:测试和开发最好分开hibernate3.jar : hibernate核心jar8。使用hibernate开发的流程:(导入jar包,添加配置文件)导入jar包:建议去公司实际企业开发,核心jar和第三方jar,最好全部导入项目,当项目要上线时候,把不用的第三方jar包全部删除。添加配置文件(在etc目录下):perties: hibernate早期的配置文件hibernate.cfg.xml:现在的核心配置文件将核心的配置文件放在src目录下编写po类(实体类)POJO : plain old java object 简单的java对象hibernate是面向对象的开发po类对应表object-ORM映射文件-Relation利用hibernate来创建表编写ORM映射文件(eg:User.hbm.xml, User.java),置于po包下。修改核心配置文件hibernate.cfg.xml.连接数据库. dialect:方言,可以用来指定任意的数据库 mapping: 加载映射文件。9。hibernate中常用的APIConfiguration : 加载hibernate的核心配置文件直接创建Configuration对象:new Configuration():会加载pertiesnew Configuration().configure():会加载hibernate.cfg.xml,现在通用的版本/使用hibernate来创建表/* * 1.加载hibernate核心配置文件 */Configuration configuration = new Configuration().configure();/* * 2.创建生成表的工具类对象 */SchemaExport export = new SchemaExport(configuration);/* * 3.调用建表的方法 */export.create(true,true);SessionFactory: hibernate中重量级对象,企业开发中,消耗资源较多,功能强大的对象。提供session对象,控制对数据库的连接,建议一个项目中只能有一个SessionFactory管理二级缓存。Session: hibernate中所有的增删查改操作都是依赖session对象实现其功能,最常用的一个工具对象HttpSession : servlet中的会话,作用域。10。hibernate事务是手动提交对表的改变,必须依赖程序员开启事务,并提交事务。操作:增,改,删对比:jdbc自动提交事务11。创建一个工具类HibernateSessionFactory,简化hibernate代码只创建一个SessionFactory(重量级对象)给调用者提供session对象关闭session12。使用session,实现增删查改增加:session.save(po对象);删除:session.delete(po对象);查询:session.get(po类名.class,id); session.load(po类名.class,id);修改:session.update(po对象);13。cglib动态代理session.load(PO.class,id):返回的对象,是目标对象的代理对象,I、代理对象:暂时替代要查找的真实对象,hibernate内部临时生成一个暂时替代要查找的对象,该对象是要查询对象的子类对象。II、Person person = (Person)session.load(Person.class,1);person就是临时代替id为1的person对象的子类对象,父类 子类对象名字 = new 子类对象;List list = new ArrayList();III、子类对象,该对象是由hibernate内部生成代理对象,通过第三方jar包cglib.jar该生成代理对象方式叫做cglib动态代理。IV、load并没有立刻查询数据库,而且是在内部生成一个临时替代id=1的代理对象只能是真正使用该代理对象中某些属性,hibernate才会真实的发出sql语句,去数据库中进行真实的查询。14。延迟加载:要查询对象的时候,不立刻sql语句查询数据,在hibernate内部,先生成一个代理对象,(暂时代替要查询的对象),只有真实查询该对象的某些属性,才发出sql语句,查询数据库,叫做延迟加载。load方法:就是hibernate中最典型的延迟加载。知识点1。load方法:支持延迟加载使用load方法查询对象的时候,如果对象不存在,会抛出异常。org.hibernate.ObjectNotFoundException使用load查询的对象只能在session范围内使用(cglib动态代理产生对象的生命周期跟session一致)关闭session后,操作时抛出org.hibernate.LazyInitializationExceptionload方法支持一级缓存的读写 2。update方法先查询到要修改的对象,再调用update方法好处:稳定,不出错(不出现空值)直接创建新的对象,添加id,修改属性坏处:容易出现空值3。delete方法根据id删除或先查询后删除4。映射类型hibernate可以自动转化一些基本的数据类型也可以由我们自己来设置类型的转换格式 : type: 可以指定两种类型,java类型和hibernate类型I.整数类型:integer,long,byte,shortII.浮点类型: float,doubleIII.布尔类型 : boolean : char(1)yes_no:可以把yes或no转换为对应的Y或Ntrue_false:T或FIV.string字符串V.date年月日VI.timestamp年月日时分秒5。设置hibernate字段中的属性not-null=true : 非空unique =true : 唯一update =false: 不允许修改insert =false: 不允许插入6。主键的生成策略一张表中,主键最为重要,主键的生成策略是指hibernate对表的主键的生成方式uuid: 每次插入新的数据时候,主键自动生成一个32位的不重复的字符串Serializable没有方法实现,用来标识地址。identity : 主键自增,每次插入新的数据的时候,数据库内部会把主键数值自动增1,目前mysql,sql server等数据库最为常见的,依赖数据库的底层机制序列名sequence: 主键自增,针对oracle等需要使用序列自增的数据库 依然依赖数据库的底层机制,每次保存新的一条数据native: 根据后台数据库的不同,使用不同的生成策略,如果数据库是mysql,则对应identity如果是oracle(依赖序列),则对应sequence使用非常广泛。assigned : 指定的,已分配的。需要程序员自己控制主键的值,开发中只有当数据量极少的时候才用。foreign:主键生成策略,是参照外键来生成自己的主键foreign会取得关联对象的标识 7。hibernate中对象的三种状态hibernate是一个持久层框架,对象在hibernate当中分成了三种状态临时态:Transient只用new方式创建的对象,都是处于临时态特点,执行完毕以后,被垃圾回收掉。持久态:Persistent被session操作的对象,纳入session管理的对象,都可以称为持久态特点:持久态对象改变,直接同步到数据库当中。托管态/游离态:Detached,分离,派遣,使超然当一个持久态的对象脱离了session的管理,就是处于托管态例如:session.close();hibernate当中的对象,是在这三个状态中来回转换save:临时态/瞬时态 - 持久态update: 游离态 - 持久态当企业开发的时候,多人开发,传递过来的对象在很多时候很难确定是临时态,游离态,这样单独作用save方法或使用update方法都可能出错真正企业开发,都是使用saveOrUpdate来替代save或update方法saveOrUpdate:自动来判断对象的状态,自行选择是save还是update8。多对一关联映射(单向)关联映射先知道几个概念表与表:双向,通过外键来维护关联关系hiberante是通过面向对象,通过对象的操作来操作表,类与类之间:单向,双向,通过引用来维护关联关系使用hibernate操作po对象,在底层通过ORM映射文件,操作对应表。 知识点:1.一对多关联映射(单向)在hibernate中由一的一端来维护关联关系,多的一端不维护关联关系维护关联:表中的外键由谁来创建一对多单向关联映射,由一的一端来维护关联关系外键deptId,由一的一端来创建,多的一端不维护关联关系key:创建的外键的名字外键的值是当前主键的值该外键创建到多的一端t_emp表中2.多对一关联映射(双向)两端都可以看到彼此切记,双向关联的多的一端和一的一端,外键的名字,必须一致3.级联操作对一张表的操作,同时对其他的表产生关联操作cascade:级联标签对应的值:none:没有任何的级联操作(一般是默认,一对一关系不是默认)save-update:对一张表的保存或修改,同时与之关联的表,也执行相同的功能delete : 级联删除,删除当前对象的时候,把与之关联的所有的对象全部删除如果不加入级联删除,则删除的是关联关系(外键)all : 所有情况下均进行级联操作,即:save-update和delete企业开发时候,如果有需要级联操作的表,建议配置成all因为添加cascade=all级联操作,当保存emp的时候也把跟emp与之关联的dept,也保存到数据库中,叫做级联操作4.inverse:相反,倒转一般多对一或多对多双向关联,是否放弃维护关联关系。 true: 放弃维护关联关系, 只有insert,没有update,不维护外键false: 维护关联关系,是默认值。先insert,后update,会维护外键5.延迟加载目的:就是为了提高hibernate的性能lazy: 懒加载:只有当真正使用该对象时,才发出sql语句,去数据库中真实查询,:默认值,支持延迟加载 lazy=false,当前class端的lazy失效,对其它标签无影响,对集合和单端无效。:支持延迟加载,默认值 lazy=flase:延迟加载失效 lazy=extra:跟true相似,会发出比较智能的sql语句。 企业开发中,针对集合端最常用的设置值。知识点:1延迟加载单端:many-to-one:lazy取值false/proxy/noproxyproxy:跟true相似,支持延迟加载hibernate默认值false: 不支持延迟加载,myEclipse提示,是以目前用户使用最多的作为提示,不是根据框架本身的默认值来提示noproxy: 不用2.多对多单向关联eg: 员工(emp) 职位(role)liu总CEOliu总Managerliu总Workerguan总Managerguan总Workerzhang总Managerzhang总Worker3.多对多关联映射,由多(emp)的一端来维护关联关系,创建t_emp_role表key当前emp的主键的值,rid为和t_role的主键值多对多关系的表是由三张表构成,其中一张表专门用来维护关联关系hibernate当中只有两个类,用来维护关联关系的类,创建第三张表用来维护关联关系多对多关联关系映射,两边的表名,必须保持一致。4.一对一主键关联映射(单向)一对一主键关联:两张表中的数据,一一对应hibernate中一对一主键单向关联:一的一端来维护这种对应关系,一张表的主键参照另一张表的主键来生成cardclass=Card,可省略,为默认值。一对一主键关联映射,默认级联操作。5.一对一双向主键关联映射一方的id自增,另一方设为外键。不能同时设为外键。6.HQL:被称为hibernate中的sql语句sql直接操作数据库hibernate通过对象来操作数据库,不够准确导致性能消耗太大,可以使用一种近似sql的语句来操作数据,这种语句就是hqlhql是针对对象的操作企业中常见的模式:双向对象查询格式:I。from po类名eg:String hql = from Dept;Query query = session.createQuery(hql);List list = query.list();Query : hibernate中专门用来执行hql的接口对象query.list():hibernate可以把hql查询出来的结果封装到一个集合中 如果查询的是对象,则把结果封装到一个添加了泛型的集合中II。使用别名查询from po类名 as 别名from po类名 别名select 别名 from 类名 别名三种格式完全等价String hql = from Dept d;String hql = from Dept as d;String hql = select d from Dept d;hql中不识别 * 号III。使用构造方法查询对象eg: select new 构造方法 from po类名一般表中字段非常多的时候,建议使用构造方法查询,可以避免出错。String hql = select new Emp(id,ename) from Emp;缺点:只能查询出构造方法中的字段属性查询格式:I。单一属性的查询格式: select 属性名 from po类名;II。连接查询,建议使用别名,属性名格式: select 别名.属性名 from po类名 别名eg:String hql = select dname from Dept;List list = session.createQuery(hql).list();III。多个属性格式: select 属性1,属性2,属性3,. from po类名返回结果: Listeg:String hql = select e.id,e.ename,e.age from Emp e;List list = session.createQuery(hql).list();for(Object obj : list)for(int i = 0; i obj.length;i+)System.out.println(obji);Iterator iter = list.iterator();while(iter.hasNext()Object obj = iter.next();System.out.println(obj0+obj1+obj2);条件查询:I。不带参数格式: select 属性名,. from po类名 where 条件String hql = select e.id,e.ename from Emp e where e.age=50;II。带参数格式:用?点位,参数从0开始。select 属性/对象 from po类名 where 条件=?String hql = select e from Emp e where e.ename like ?;List list = session.createQuery(hql).setParameter(0,%5%).list();带多个参数目标导向查询,利用Po类之间的关联关系,连接多张表String hql = from Emp e where e.ename like ? and e.dept.id = ?;session.createQuery(hql).setParameter(0,%3%).setParameter(1,3).list();III。使用别名点位格式: select 属性/对象 from po类名 where 条件 = :别名eg:String hql = from Emp e where e.dept.id = :myId;session.createQuery(hql).setParameter(myId,5).list();其中myId是自定义的变量String hql = from Emp e where e.dept.id in (:myIds);session.createQuery(hql).setParameterList(myIds,new Object2,5,8).list();IV。between . and .eg:String hql = from Emp e where e.dept.id between ? and ?;hql没有办法直接查询外键,依赖于对象之间的关联关系,导向查询,比较麻烦,是缺点在hibernate中可以直接使用sql语句String sql = select id,ename from t_emp where deptId between 1 and 3;List list = session.createSQLQuery(sql).list();连接查询:I。隐式的多表连接查询,通过关联的属性,利用导向查询,以实现多表的连接查询eg:查询部门名字中带3的所有的员工String hql = from Emp e where e.dept.dname like ?;session.createQuery(hql).setParameter(0,%3%).list();II。显示多表连接查询通过join进行多表的连接内连接:inner joinsql : select e.*,d.* from t_emp e inner join t_dept d on e.id=d.idhql : 也是利用join,可以省略连接的条件from Emp e inner join e.dept dString hql = select e.id,e.ename,d.id,d.dname from Emp e inner join e.dept d;左外连接: left outer join 以左边的表为主右外连接: right outer join 以右边的表为主其中 outer 可以省略分页:web项目,分页是最常用的,大部分数据库针对分页都有特定的函数来支持导致数据库不同,则分页代码不同hibernate对分页的处理,可以匹配我们常用所有的数据库,如果使用分页,则优先考虑hibernate自身分页 setFirstResult(1),当前页的第1条数据,数据从0开始计算。setMaxResult(3),每页显示数据的条数3使用hql语句,实现修改,删除与sql相似插入一般都是用save或saveOrUpdate实现int row = session.createQuery(hql).setParameter(0,5).executeUpdate();使用Iterator查询对象中的n+1问题Iterator iter = session.createQuery(from Dept).iterator();for(Iterator it= iter; it.hasNext();)Dept dept = it.next();System.out.println(dept.getDname();使用iterator查询对象的时候,会先发出一条查询id的sql语句根据查询出来的id,再发出n条sql查询对应的对象。 n + 1比对list方法的区别:list: 只发出一条sql语句iterator : 发出n+1条sql语句hibernate中的聚合函数String hql = select count(*) from Emp;long count2 = (Long)list.get(0);在hibernate中使用count(*)时返回的类型是Long简化形式:long count3 = (Long)session.createQuery(hql).uniqueResult();hql(重点)一级缓存:什么是缓存:缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间。为了防止频繁地访问数据库hibernate读取数据的顺序hibernate在进行数据读取时,会根据缓存管理策略,首先在缓存中查询,如果发现,则直接使用,避免数据库调用的开销,如果没有,则发出sql去数据库中查询数据缓存的策略事务级缓存: 当前事务范围内的数据缓存应用级缓存: 某个应用中的数据缓存缓存的分类缓存的实体对象hibernate缓存分为两个层次,一级缓存和二级缓存缓存属性查询缓存缓存的应用hibernate的缓存在两种情况下发挥作用;根据主键加载实体 get,load加载关联对象使用hql查询时,List,iterator保存对象:save查询属性一级缓存一级缓存,是事务级缓存,也叫session级缓存一级缓存的数据结构是Map,用于存储查询实体一级缓存属于内置的,每次使用session的时候都会自动的开启。Map的key存放实体的id,其value中放查询出来的实体对象本身Object1.发出sql,查询数据库,返回查询的结果2.get/load可以读写一级缓存,把查询出来Emp对象放入到一级缓存中3.当再次使用get/load(Emp.class,1),hibernate会先去缓存中查询,有直接使用,没有才会发出sql,查询数据库在一个session内部,第2次使用iterator迭代相同的对象:没有发出n+1条sql语句,只发出查询对象id的sql语句iterator可以读写一级缓存,第一次查询emp的时候,把查询出来的对象保存到了一级缓存当中,当第二次再查询相同对象的时候,首先发出sql语句,查询对象的id,hibernate读取策略,先去缓存查询,如果有,直接使用,根据id找到对应的value,所以,没有发出查询的sql语句。一级缓存的生命周期:在两个session中,使用load查询相同的对象.一级缓存的生命周期与session一致,session结束,清空缓存,缓存销毁,session关闭。发出sql语句,session关闭,一级缓存结束,缓存中没有对应的数据,只能发送sql语句,去表数据中查询。Get,Load,Iterator读写缓存List方法只写不读一级缓存一级缓存不能禁用,但可以通过session的clear方法和evi

温馨提示

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

评论

0/150

提交评论