hibernate部分总结Word文档下载推荐.docx
- 文档编号:16675167
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:12
- 大小:59.33KB
hibernate部分总结Word文档下载推荐.docx
《hibernate部分总结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《hibernate部分总结Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
omid"
type="
java.lang.Integer"
columnname="
OMID"
precision="
22"
scale="
0"
/>
generatorclass="
sequence"
<
paramname="
open_id<
/param>
/generator>
/id>
many-to-onename="
medicine"
class="
com.zy.entity.Medicine"
fetch="
select"
MNUMBER"
length="
40"
/many-to-one>
druginfo"
com.zy.entity.Druginfo"
DID"
unit"
com.zy.entity.Unit"
UNID"
propertyname="
omcount"
OMCOUNT"
/property>
/class>
/hibernate-mapping>
解析如下:
id元素,用来定义属性到表主键的映射
name:
标识属性的名称
type:
标识Hibernate类型的名称
generator元素,用来设置主键的生成方式
class:
用来设置主键生成器
property元素,用来设置实体类属性
name:
用来设置实体类的属性名
用来设置实体类属性的类型
column元素,用来设置与实体类属性对应的表字段
用来设置字段名
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元素,例如:
entity.classes"
classes"
true"
也可以应用于set元素,例如:
setcascade="
delete"
inverse="
name="
studentList"
stuinfo"
key>
cid"
/>
/key>
one-to-manyclass="
doubleOneMany.org.zy.entity.Stuinfo"
/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);
List<
Dept>
deptList=query.list();
for(Deptdept:
deptList){
System.out.println("
部门名称:
+dept.getDeptName());
}
}
HQL语句本身不区分大小写,但其中出现的类名和属性名区分大小写
通过占位符绑定
fromDeptasmodelwheremodel.deptName=?
query.setString(0,"
test"
);
System.out.println("
通过命名参数绑定
publicvoidtestQueryByParamsName(){
Stringhql="
fromDeptasmodelwheremodel.deptName=:
deptNameandmodel.createDate=:
createDate"
query.setString("
deptName"
"
createDate"
2000-03-11"
创建日期:
+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);
deptList=criteria.list();
deptList){
System.out.println(dept.getDeptName());
Criteria本身只是一个查询容器,具体的条件通过Criteria.add方法添加到Criteria实例中
List<
Emp>
emps=null;
Sessions=MySessionFactory.getSession();
try{
t=s.beginTransaction();
Criteriac=s.createCriteria(Emp.class);
c.add(Restrictions.ge("
sal"
b));
c.add(Restrictions.le("
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<
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"
Expression.ltProperty用于比较两个属性之间的值,对应SQL条件中的"
field<
Expression.leProperty用于比较两个属性之间的值,对应SQL条件中的"
Criteria的setFirstResult和setMaxResults方法可以限制一次查询返回的记录范围
//criteria分页查询
publicvoidtestQueryByPage(){
criteria.setFirstResult
(2);
criteria.setMaxResults
(2);
部门ID:
+dept.getDeptId());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 部分 总结