hibernate部分总结.docx

上传人:b****4 文档编号:3768864 上传时间:2022-11-25 格式:DOCX 页数:12 大小:59.33KB
下载 相关 举报
hibernate部分总结.docx_第1页
第1页 / 共12页
hibernate部分总结.docx_第2页
第2页 / 共12页
hibernate部分总结.docx_第3页
第3页 / 共12页
hibernate部分总结.docx_第4页
第4页 / 共12页
hibernate部分总结.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

hibernate部分总结.docx

《hibernate部分总结.docx》由会员分享,可在线阅读,更多相关《hibernate部分总结.docx(12页珍藏版)》请在冰豆网上搜索。

hibernate部分总结.docx

hibernate部分总结

Hibernate总结

第一章

1.其实体类需要实现java.io.Serializable接口并添加默认无参构造方法和getter/setter方法

2.映射文件的名字一般为"实体类名.hbm.xml",通常和实体类放在一个包中

IllHistory.hbm.xml(实体映射)

xmlversion="1.0"encoding="utf-8"?

>

DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"

--

MappingfileautogeneratedbyMyEclipsePersistenceTools

-->

open_id

解析如下:

id元素,用来定义属性到表主键的映射

name:

标识属性的名称

type:

标识Hibernate类型的名称

generator元素,用来设置主键的生成方式

class:

用来设置主键生成器

property元素,用来设置实体类属性

name:

用来设置实体类的属性名

type:

用来设置实体类属性的类型

column元素,用来设置与实体类属性对应的表字段

name:

用来设置字段名

length:

用来设置字段长度

not-null:

用来设置是否为空,true表示不能为空

precision:

用来设置小数长度

scale:

用来设置小数点后面的位数

Hibernate核心接口1

Configuration接口:

读取src中的Hibernate配置文件并以此创建SessionFactory对象。

Configurationconfig=newConfiguration().configure();

SessionFactory接口:

初始化Hibernate并创建session对象

SessionFactoryfactory=config.buildSessionFactory();

Session接口:

负责保存、更新、删除、加载及查询对象,相当于JDBC中的Connection。

Sessionsession=factory.openSession();

Transaction:

管理事务

Transactiontr=session.beginTransaction();

备注:

SessionFactory是线程安全的,可以被多个线程调用,所以一个程序一般只需一个SessionFactory;而Session不是线程安全的,所以让多个线程共享一个Session将会出现问题。

Java为解决多线程程序的并发问题提供了ThreadLocal类,通常把Session放到ThreadLocal中解决多线程并发问题

进程是应用程序在操作系统上的执行单元。

线程是某个进程中更细分的执行单元。

一个应用程序至少有一个进程,一个进程至少有一个线程。

ThreadLocal是Java中的线程类,用来管理Java应用程序的线程。

session接口的方法

save(Objecto)

将临时状态的对象数据插入到数据库中。

调用save方法时,并不会立即向数据库中插入数据,而是放到session缓存中。

当提交事务时,清理session缓存,产生insert语句。

备注:

save方法把对象的临时状态变为持久化状态,所以在调用此方法后对属性进行改变会产生update语句

update(Objecto)

将脱管状态的对象数据更新到数据库中

saveOrUpdate()

saveOrUpdate方法兼具save()和update()方法的功能,并且会判断对象是脱管状态还是临时状态,然后自动调用合适的方法。

get(Class,id)

第一个参数设置类名,第二个参数设置主键值,即通过主键值查询记录并封装成对象返回。

get方法被调用时并不一定会产生select语句,因为get方法首先会在session缓存中进行查找,找到后直接返回;如果没找到才会产生select语句从数据库中查找。

load(Class,id)

与get方法相同,区别在于:

如果最后没查询到数据并且加载方式是立即加载,get方法会返回null;load方法会出现ObjectNotFoundException异常。

delete(Objecto)

删除一个处于持久化状态或脱管状态的对象

调用delete方法时,并不会立即进行删除操作,而是当提交事务时,清理session缓存,产生delete语句。

实体对象的生命周期中包括3种状态:

临时状态(transient)

持久化状态(persistent)

游离状态(detached)

实体对象生命周期的3种状态可以相互转换

 

第二章

Hibernate映射关联关系

单向一对多、单向多对一、双向一对多/多对一、一对一

关联是指:

表与表之间数据彼此联系的方式,表现为主外键关联

映射关联关系是指:

把表之间的关联关系映射到实体类和xxx.hbm.xml文件中,通过Hibernate以面向对象的方式间接操纵表之间的关联关系

延迟加载——lazy属性

lazy属性设为true,表示使用延迟检索策略;设为false,表示使用立即检索策略。

默认值为true。

它可以应用于class元素,例如:

也可以应用于set元素,例如:

当执行Session的load方法(get方法不支持延迟检索)时,Hibernate不会立即执行查询classes表的select语句,仅仅返回Classes类的代理类的实例,这个代理类具由以下特征:

1.由Hibernate在运行时动态生成,它扩展了Classes类,因此它继承了Classes类的所有属性和方法。

2.当Hibernate创建Classes代理类实例时,属性都为null,因此这个代理类实例占用的内存很少。

3.当应用程序第一次访问Classes代理类实例时(例如调用c.getXXX()或c.setXXX()方法),Hibernate才会初始化代理类实例,在初始化过程中执行select语句,真正从数据库中加载Classes对象的所有数据。

备注:

如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。

如果在游离状态时才初始化它,就会产生延迟初始化错误。

inverse属性

inverse属性用来设置双向关联关系的维护方,即由谁来管理、维护主外键关系,默认值是false,常用于一对多关联关系中。

false表示一的一方是关系的维护方,true表示多的一方是关系的维护方。

在上一个示例中,当inverse为默认值false时,表示维护方是一的一方(班级),那么在生成的sql语句中会额外多出来update语句,这表示一的一方(班级)在主动维护主外键关系,防止出错。

当把inverse的值改为true时,表示维护方是多的一方(学生),那么在生成的sql语句中不会额外多出来update语句。

所以建议在一对多关联关系中,把维护方交给多的一方

多对一关联关系总是设成“inverse=false”的,而且这个属性在Mapping中是不存在的,即保证维护方是多的一方

比喻:

董事长和员工之间是一对多/多对一关联关系

董事长要认识每一个员工很不容易,但是每个员工都认识董事长。

当更换董事长时,如果把维护方交给一的一方(董事长),那就需要挨个通知每一个员工;如果把维护方交给多的一方(员工),那就不需要挨个通知员工了。

cascade属性用来设置级联操作,例如:

删除某个班级时是否级联删除该班的学生

取值有:

all、none、save-update、delete,默认值是none

第三章

第四章

Hibernate检索方式:

1.HQL(HibernateQueryLanguage)是面向对象的查询语言,具有丰富灵活的特性。

是使用最为广泛的一中检索方式,也是官方推荐的查询模式

2.QBC

3.本地查询

Hibernate检索方式的功能:

可以在查询语句中设定查询条件,可以动态绑定参数

支持分页查询

支持多表连接查询

支持分组查询,可以使用having和groupby关键字

支持聚合函数,如sum()、min()、max()等

可调用用户自定义函数、存储过程

支持子查询

HQL检索步骤:

Query接口

方法名功能说明

Listlist()适合结果集是多行,返回一个集合

ObjectuniqueResult()适合查询返回单个对象

intexecuteUpdate()适合增、删、改语句,返回受影响的行数

HQL—简单实体查询(查询所有部门)

publicvoidtestQueryAllDept(){

Stringhql="fromDept";

Queryquery=session.createQuery(hql);

ListdeptList=query.list();

for(Deptdept:

deptList){

System.out.println("部门名称:

"+dept.getDeptName());

}

}

HQL语句本身不区分大小写,但其中出现的类名和属性名区分大小写

通过占位符绑定

publicvoidtestQueryAllDept(){

Stringhql="fromDeptasmodelwheremodel.deptName=?

";

Queryquery=session.createQuery(hql);

query.setString(0,"test");

ListdeptList=query.list();

for(Deptdept:

deptList){

System.out.println("部门名称:

"+dept.getDeptName());

}

}

通过命名参数绑定

publicvoidtestQueryByParamsName(){

Stringhql="fromDeptasmodelwheremodel.deptName=:

deptNameandmodel.createDate=:

createDate";

Queryquery=session.createQuery(hql);

query.setString("deptName","test");

query.setString("createDate","2000-03-11");

ListdeptList=query.list();

for(Deptdept:

deptList){

System.out.println("部门名称:

"+dept.getDeptName());

System.out.println("创建日期:

"+dept.getCreateDate());

}

}

HQL—多表连接查询

SQL语句通过join子句实现了多表之间的联合查询,HQL也提供了相应的联合查询机制

1.innerjoin(内连接):

innerjoin只返回两个表中连接字段相等的行

2.leftouterjoin(左外连接):

leftjoin返回包括左表中的所有记录和右表中联结字段相等的记录.

3.rightouterjoin(右外连接):

rightjoin返回包括右表中的所有记录和左表中联结字段相等的记录.

备注:

使用HQL进行多表连接查询时,Query接口的list方法返回的集合中存储的并不是实体对象,而是数组对象。

预先抓取

预先抓取是指Hibernate如何使用外连接来获得对象的关联实例或集合。

预先抓取对应的配置属性是fetch="join".

备注:

1.不采用预先抓取时,每查询一个学生就会产生2条SQL语句,如果将来查询的学生很多或者关联的层次很深,那么产生的SQL语句的数量将不敢想象。

2.采用预先抓取后,不管查询多少个学生,不管关联的层次有多深,只会产生1条多表连接SQL语句。

3.在实际应用中,一对多和多对多推荐使用延迟加载,一对一和多对一推荐使用预先抓取。

4.另外需要注意的是:

如果使用HQL,那么即使配置了预先抓取也会被忽略。

 

在关联关系操作中,从使用的角度看,预先抓取和立即加载的效果是一样的,但是预先抓取可以减少SQL语句的数量。

和外连接相比,预先抓取将初始化代理对象的引用,把对象的数据填充完毕。

但是外连接默认仅把对象组装好,而不会初始化对象之间的引用关系。

第五章

Criteria[krai'tiəriə]检索

Criteria查询即QBC(QueryByCriteria)

Criteria查询通过面向对象的设计,将数据查询条件封装为一个对象

publicvoidtestQueryDept(){

Criteriacriteria=session.createCriteria(Dept.class);

ListdeptList=criteria.list();

for(Deptdept:

deptList){

System.out.println(dept.getDeptName());

}

}

Criteria本身只是一个查询容器,具体的条件通过Criteria.add方法添加到Criteria实例中

Listemps=null;

Sessions=MySessionFactory.getSession();

try{

t=s.beginTransaction();

Criteriac=s.createCriteria(Emp.class);

c.add(Restrictions.ge("sal",b));

c.add(Restrictions.le("sal",e));

emps=c.list();

mit();

}catch(Exceptionee){

t.rollback();

ee.printStackTrace();

}

finally

{

MySessionFactory.closeSession();

}

returnemps;

Criteria查询语法的查询限定机制:

方法描述

Expression.eq对应SQL条件中的“field=value”

Expression.gt对应SQL条件中的“field>value”

Expression.ge对应SQL条件中的“field>=value”

Expression.lt对应SQL条件中的“field

Expression.le对应SQL条件中的“field<=value”

Expression.between对应SQL条件中的between

Expression.like对应SQL条件中的“fieldlikevalue”

Expression.in对应SQL条件中的“fieldin…”

Expression.eqProperty用于比较两个属性之间的值,对应SQL条件中的"field=field"

Expression.gtProperty用于比较两个属性之间的值,对应SQL条件中的"field>field"

Expression.geProperty用于比较两个属性之间的值,对应SQL条件中的"field>=field"

Expression.ltProperty用于比较两个属性之间的值,对应SQL条件中的"field

Expression.leProperty用于比较两个属性之间的值,对应SQL条件中的"field<=field"

Criteria的setFirstResult和setMaxResults方法可以限制一次查询返回的记录范围

//criteria分页查询

publicvoidtestQueryByPage(){

Criteriacriteria=session.createCriteria(Dept.class);

criteria.setFirstResult

(2);

criteria.setMaxResults

(2);

ListdeptList=criteria.list();

for(Deptdept:

deptList){

System.out.println("部门ID:

"+dept.getDeptId());

System.out.println("部门名称:

"+dept.getDeptName());

System.out.println("创建日期:

"+dept.getCreateDate());

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 教育学心理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1