hibernate汇总整理

上传人:ji****en 文档编号:107704614 上传时间:2019-10-20 格式:DOC 页数:23 大小:743.05KB
返回 下载 相关 举报
hibernate汇总整理_第1页
第1页 / 共23页
hibernate汇总整理_第2页
第2页 / 共23页
hibernate汇总整理_第3页
第3页 / 共23页
hibernate汇总整理_第4页
第4页 / 共23页
hibernate汇总整理_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《hibernate汇总整理》由会员分享,可在线阅读,更多相关《hibernate汇总整理(23页珍藏版)》请在金锄头文库上搜索。

1、Hibernate汇总整理单表(多表)的增/删/改/查(ID查询/查询所有)/一对多/多对一/多对多/级联/延迟加载/控制反转/1 Hibernate搭建一般步骤:1. 下载jar包:2. 创建实体类对象:3. 配置Hibernate配置文件:hibernate.cfg.xml文件(链接数据库,关联实体类与数据库表映射配置文件):(1) 链接数据库信息配置:方言、驱动、url、用户名、密码:(2) 是否显示执行的sql语句:(3) 关联实体类与数据库表的关系映射文件:4. 配置类与表映射的文件:类名.hbm.xml文件,与实体类一起放在model层中(配置实体类与数据库表映射关系信息):实体类

2、包名、实体类与数据库表对应的关系、实体类中属性与数据库表中字段对应关系(如果数据库字段名与实体类属性名一样,可以省略column属性)5. 调用hibernate的API,创建测试类,进行测试;2 单表的增、删、改、查写一般方法:(一般创建一个生成session对象的工具类方法,增、删、改要通过session调用beginTransaction()方法开启事务,先通过 session调用增、删、改的方法,然后在通过事务提交信息)工具类生成session对象的方法:1. 增:通过session调用save(Object object)方法,然后事务提交,最后关闭session:(注意:增加后会将

3、该主键ID返回到该对象中)2. 删:先通过session调用get()通过ID查询方法返回一个对象,然后再通过session调用delete(Object object)方法,然后通过事务提交,最后关闭session即可;3. 改:通过session调用update(Object object)方法,然后通过事务提交,最后关闭session即可;(注意:对象中为空的属性在数据库中对应字段值便修改为null了)4. 通过ID查询:通过session调用get()方法返回一个对象,然后关闭session即可;5. 查询所有:先通过session调用createQuery(“from 实体类对象名”

4、)方法返回一个Query类型对象,通过返回的对象调用list()方法即可得到查询的结果集合,最后关闭session即可;6. 增加或修改方法:saveOrUpdate(Object object)方法,如果object对象有id那就执行修改,如果没有id那就执行增加;3 通过ID查询的两种方法及其区别:(1) 通过ID查询的方法有:session.get()和session.load()两种方法;(2) 区别:如果数据库中没有该ID,那么get()方法会返回一个null对象,load()方法会在你使用该对象的时候抛出一个异常;(因此:强烈推荐使用get()方法来通过ID查询一条记录)4 Hib

5、ernate在Java中存在的3种状态:(1) Hibernate在Java中存在的状态有:瞬时状态、持久状态、游离状态;(2) 三种状态的理解:三种状态都是相对于数据库而言的:(跟数据库从来都没有关系的就是瞬时状态;跟数据库有关系的就是持久状态;跟数据库之前有关系,后来又没有关系了那现在就是游离状态)瞬时状态:就是在java中通过new创建一个新的对象,并且该对象的信息并没有写入数据库;持久状态:就是通过session调用方法将对象的信息写入了数据库中,对象中信息与数据库有关系了,那就是持久状态;游离状态:就是对象之前跟数据库有关系,事务提交,写入数据库,session关闭后,该对象跟数据库

6、就没有关系了,就变成了游离状态了;5 Hibernate的优缺点及与Mybatis的区别:(1) Hibernate的优点:对面向对象性能支持良好;可移植性好;(2) Hibernate的缺点:需要使用数据库的特定优化机制时不适合用Hibernate;需要对数据进行大规模批量处理的时候不适合用Hibernate;(3) Hibernate与Mybatis的区别:相对于Mybatis而言,Hibernate的ORM(Object Relation Mapping)实现更加完善;面向对象,开发者不必关注SQL的生成;使用自由度不如直接使用SQL的Mybatis灵活;6 Map对象转换为Set对象:

7、对于Map对象不方便进行遍历,可以先将Map对象转换为Set对象,然后通过foreach遍历Set对象即可,具体操作如下:通过Map对象调用entrySet()方法即可返回一个Entry类型的集合Set,然后通过遍历Set集合来实现对Map的遍历;7 HQL的基本常用查询语句:1. select:select 实体类别名.对象的属性名(如果只查询一张表实体类可以没有别名,如果查询多张表每个实体类最好是各有一个别名)多用于显示某几列,不查询显示所有的列2. From:from 实体类类名(要查询的表对应的实体类,如果查询多个表,那么就是多个实体类,实体类之间通过,分隔开)3. Where:whe

8、re 1=1 查询条件(多条件的查询,多个条件之间用and/or等分隔开)4. Order by:order by 实体类别名.对象的属性名(按照某个对象的某个属性对查询结果进行排序,默认是升序排列,多个属性之间通过,分隔开)5. 表达式:可以在查询语句中的where中使用一些表达式,比如:lower()/year()方法。第一个是将大写字母转为小写的函数/第二个是获取时间中的年份的函数;8 执行HQL语句的方法:首先:通过session调用createQuery(String string)方法创建一个Query对象,然后通过Query类型的对象调用list()或iterate()方法返回一

9、个List类型的结果集合;9 HQL中绑定参数及其赋值的方法:1. 通过占位符绑定参数:与sql中多条件动态查询一样,在sql的查询条件中需要赋值的地方添加一个?,然后再给相应的?通过一种方式进行赋值;(此方法赋值时是通过?所在的角标进行赋值的,对于多个查询条件时,赋值不太方便,因此不推荐使用)2. 通过参数名绑定参数:在sql的查询条件中需要赋值的地方添加一个“:名字”,然后在给相应的名字进行赋值;(此方法是通过名字进行赋值,对于多个查询条件的赋值也是比较清晰的,推荐用此方法)3. 给hql中参数进行赋值:(1) 如果参数类型确定,可以用:set参数类型(int positioin,Stri

10、ng val)和set参数类型(string name,String val)两种方法进行赋值,第一种是通过角标,第二种是通过对应的name进行赋值;(2) 如果参数类型不确定,可以用:setParameter(角标,Object object);进行赋值;(3) 如果参数的值保存在一个Map集合中,然后通过调用setProperties(Map map)进行赋值(对于多条件多参数赋值时,强烈推荐用此方法进行赋值)10 HQL实现动态查询的方法:(思路:通过if判断查询条件是否存在,如果存在就给hql进行字符串的拼接,与写sql动态查询一致)11 HQL实现分页的方法:(思路:在动态查询的基础

11、之上调用相应的方法求出符合查询条件的总记录数、分页的结果集合)12 投影(只用于统计显示,显示某几个字段,不查询所有字段):1. 基础知识:(1) 如果查询显示所有字段返回的是Object对象;(2) 如果查询显示部分字段返回的是Object数组;2. 投影就是在查询显示时不显示所有字段,而是只显示自己需要的字段信息,那么返回的就是一个Object数组,非常不方便,可以通过以下方法让投影返回一个对象:(投影主要用于统计中)(1) 如果查询显示信息是在一个已经在xml文件中定义的实体类对象时:那么可以直接在select new 实体类名(各个属性名之间用逗号隔开)(2) 如果查询显示的信息是自己

12、新创建的一个实体类,未在xml中进行配置,那么在select后面通过构造方法创建对象时,需要填写该实体类所在的包名:13 一对多、多对一关联配置以及级联增/删/改:1. 一对多关联在*.hbm.xml文件中配置:(one-to-many)在配置实体类与数据库表映射关系中,增加一个标签,然后主要配置name、class、column(与此表主键id相关联的另一个表中的关联字段),如果需要级联给set增加一个cascade属性,如果需要延迟加载给set增加一个lazy=”false”默认就是false(在相应的dao层中,通过业务进行判断,如果需要获取一对多中的属性值,那么需要调用Hibernat

13、e类中的静态方法initialize(对象.一对多集合的get方法)来初始化一对多的集合对象),如果需要控制反转给set增加一个inverse属性;2. 多对一关联在*.hbm.xml文件中配置:(many-to-one)在配置实体类与数据库表映射关系中,增加一个many-to-one标签,主要加属性name、class、column(此表与另一张表主键ID相关联的某列的列名),默认就是lazy=”false”;3. 级联在*.hbm.xml文件中配置:级联只需要在一对多中的set标签中增加一个属性cascade集合,属性值一般有save-update/delete/all;(一般都写all所

14、有)4. 级联增:在一对多中增加,只需要传递一个一的对象即可,多的集合存储在一的对象中,这样可以通过级联增来实现添加一对象的同时又添加了多的对象集合;(级联增加中也需要用到通过ID查询出一个对象,千万不能new对象将ID赋值进去)5. 级联删:在一对多中删除,只需要传递一个一的ID即可,然后通过ID查询出一个一的对象(千万不能new对象将ID赋值进去),然后通过级联删除一的对象就可以同时删除一的对象下的所有子信息集合;6. 级联改:(一般用不到,只是了解有这个功能)14 一对多延迟加载:(默认lazy=”true”)(实体类中写Set集合,不要写List集合)15 在一对多中延迟加载,一般设置

15、lazy为true(因为设置成false后,所有查询都会查询所有的子信息,这样会导致性能比较差,因此一对多中一般都将lazy设置为true),需要非常注意的是,此时需要在对应的dao层中根据业务进行判断,如果业务需要一对多下的属性值,那么需要在查询到一的对象后,调用Hibernate的静态方法initialize()方法将对象中的Set集合进行初始化,如果不初始化set中对象是null,没有任何属性值的;16 多对一查询时一般不用延迟加载,都是自己写hql查询多表(这样的话只需要执行一个hql,查询的性能会很好):17 控制反转(inverse):(控制权在哪个表中是根据业务进行判断的,如:员工表-部门表,那么控制权在员工表中比较好;如:订单表-订单详情表,那么控制权在订单表中比较好)1. 控制反转在一对多中有用,在多对一中没有用(因为在多对一中默认就是有控制权,不能进行反转);2. 如果控制权在多的表中,那么在增加一条多的记录时,网页传递过来的一个一的ID然后通过session调用get()方法获取一个一的对象,然后将一的对象赋值给多的对象中的属性即可,最终保存的是多的一个对象;18 Hibernate中创建实体类model时一般技巧:在Hibern

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号