hibernate其他的api(查询)
Query对象
使用query对象,不需要写SQL语句,但是需要写HQL语句
1、hql hibernate query language,hibernate提供的查询语言,这个hql语句和一般的SQL语句很相似
2、hql和SQL语句的区别:
使用SQL操作的是表和表的字段
使用hql操作的是实体类和属性
查询所有的hql语句
from 实体类的名称
query对象的使用
1、创建一个Query对象
2、调用query对象里面的方法得到结果
Criteria对象
使用这个对象的查询操作,但是使用这个对象的时候不需要写语句,直接调用方法实现
实现的过程:
1、创建criteria对象
2、调用criteria对象里面的list()
SQLQuery对象
使用Hibernate的时候,调用底层SQL来实现,也支持写普通的SQL语句,但是用的不多
实现的过程:
1、创建对象
SQLQuery
2、调用对象的方法实现过程
list()方法默认返回的是一个Object数组结构
解决方案:
1、调用SQLQuery里面的addEntity()将查询的内容与实体类绑定
2、调用Arrays.toString方法输出
Hibernate配置一对一和多对多
hibernate的一对多操作
1、一对多映射配置
以客户和联系人为例:
1、创建两个实体类,客户和联系人的实体类
2、让两个实体类之间相互表示
在客户实体类里面表示多个联系人
一个客户里面有多个联系人
在联系人里面表示所属客户
一个联系人只能属于一个客户
hibernate要求使用集合表示多的数据,使用的是set集合
3、配置映射的关系,有几个实体类写几个映射文件
把映射最基本的配置完成
在映射文件中,配置一对多的关系
在客户映射文件中,表示所有联系人
在联系人映射文件中,表示所属客户
Set标签的使用,name属性的属性值写在客户实体类里面表示联系人的set集合名称
一对多的建表,有外键,hibernate机制,双向维护外键,在一和多的一方都要配置外键
<key></key>中column属性值:外键的名称
<one-to-many />客户所有的联系人,class里面写联系人实体类的全路径
表示联系人所属的客户
<many-to-one>name属性:因为在联系人实体类中使用customer对象表示,写customer的名称
class属性:customer的全路径
column属性:外键名称
4、创建核心的配置文件
关联两个映射文件
2、一对多级联保存
添加了一个客户,为这个客户添加了多个联系人
实现过程:
1、添加一个客户,为这个客户添加一个联系人
复杂写法:
把联系人的对象放到客户的set集合里面
把客户对象放到联系人里面,包装类
保存到数据库
简化写法:
一般根据客户添加联系人
在客户的映射文件中进行配置
在客户映射文件里面有个set标签,在这个标签上进行配置
cascade属性:
save-update//级联保存
创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了
3、一对多级联删除
删除某一个客户,那么这个客户里面的所有联系人跟着一并删除
需求:
删除某个客户,把客户里面所有的联系人都删除
具体实现:
1、在客户的set标签中,使用cascade属性,属性名叫delete,在原有的基础上多加一个删除,可以用逗号分隔
2、在代码中直接删除客户
根据id查询,查询后调用delete方法删除
4、inverse属性
性能问题,更改了两次
因为Hibernate是双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人的时候也修改一次外键
解决方案:
让其中的一方不维护外键
一对多的里面,可以让其中一的那方放弃外键的维护
例子:
一个国家有总统,国家有很多人,总统不可能认识国家所有人,国家所有的人都认识总统
具体实现:
在放弃关系维护的映射文件中,进行配置,在set标签上使用inverse属性
inverse属性的默认值是false,false表示不放弃关系维护
如果要放弃关系维护的时候将值改成true
用inverse属性可以提高部分性能
Hibernate的多对多操作:
![Hibernate多对多操作的建表关系](http://upload-images.jianshu.io/upload_images/4857791-00756db3948d13c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Hibernate的多对多操作
1、多对多映射配置
以用户和角色为例演示
1、创建实体类,用户和角色
2、让两个实体类之间相互表示
用户里面表示所有的角色,使用set集合
一个角色中有多个用户,使用set集合
3、配置映射的关系
基本配置
配置多对多的关系
在用户里面表示所有的角色,使用set标签
在角色里面表示所有的用户,使用set标签
4、在核心配置文件中引入映射的文件
2、多对多级联保存(重点)
根据用户保存角色
1、第一步在用户配置文件中set标签里进行配置,在cascade值save-update
2、创建用户和角色对象,把角色放到用户里面,最终保存用户就可以了
3、多对多级联删除
1、在set标签上进行配置,cascade的值为delete
2、删除用户
4、维护第三张表
用户和角色是一个多对多的关系,维护关系通过第三张表进行维护
让某个用户有某个角色
1、根据id查询用户和角色
2、把角色放到用户里面
把角色放到用户set集合
让某个用户没有某个角色
1、根据id查询用户和角色
2、从用户里面把角色移除
从set集合里面把角色移除
表与表之间的关系回顾
一对多
通过外键建立关系
要在多的那一方作为外键,指向一的那一方的主键
按照关系配置Hibernate会自动给创建出表来
多对多
创建第三章表,至少有两个字段作为外键,指向两个表的主键
一对一
Hibernate的查询操作
Hibernate查询的方式:
1、对象导航查询
根据id查询某个客户,再查询这个客户下的所有联系人
2、OID查询
根据id查询某一条记录,返回对象
3、HQL查询
Query对象,写hql语句实现查询
普通的SQL操作的数据库表和字段,hql操作的是实体类和属性
4、QBC查询
Criteria对象
5、本地SQL查询
SQLQuery对象,使用普通的SQL进行查询
Hibernate的检索策略分为两类:
1、立即查询
根据id查询,调用get方法,一般用get方法马上发送语句查询数据库
2、延迟查询
根据id查询,还有load方法,调用load方法不会马上发送语句查询数据库,只有得到对象里面的值时候才会发送语句查询数据库
延迟查询分为两类:
类级别延迟:
根据id查询返回实体类对象,调用load不会马上发送语句
关联级别延迟:
查询出某个客户,再查询某个客户的联系人,查询客户的所有联系人过程的延迟
在set标签上使用属性
fetch:默认值为select
lazy:默认值是true表示延迟
false表示不延迟
extra表示及其延迟 要什么值给什么值,不要就不给
关联查询遍历集合的时候首先要遍历list集合,接着遍历Set集合,造成的问题:
每次遍历Set集合的时候都要查询一次数据库,造成了效率低
优化方式:
在映射文件中set标签中,batch-size="",随便写一个整数值就行,数值越大效率越高
批量抓取:
应用场景:
查询所有客户,并且查询所有客户里的联系人
减少SQL语句的发送
有关Hibernate知识的学习(九)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 导语苹果在iPhone 5s之后添加了Touch ID指纹识别功能,用户可以通过指纹来对iPhone进行安全而高效...