hibernate精华总结
hibernate所有的精华都沉淀在面向对象这个思想上,这也是它最出彩的地方。
一、关于多表:
多表是一种关系的表达,具体的有一对多,多对多这两种。
1、一对多关系,如订单和客户,一个订单只能属于一个客户,但一个客户可以有多个
订单
“一”的那一方
1)中的主键作为“多”的一方的外键,对应的,在“一”的实体类中建立private Set<> xx
= new Set<>();其中的泛型是“一”这个对象,在“一”的这一方要用private XX xx;XX
为其主键对象。
2)在“一”的那一方配置
<Set name="Set集合名">
<key column="外键名"/>
<one-to-many class="关联类"/>
</Set>
3)在“多”的那一方配置
<many-to-one name="对象名" column="外键名" class="关联类"/>
2、多对多关系,如课程与学生之间的关系
引用两者的主键作为外键,生成第三张中间表为两者建立起关系.
在两者的实体类中要分别建立对方类的Set集合
在两者的配置文件中,添加以下配置
<Set name="Set集合名" table="第三张关联表名">
<key column="自身主键名" />
<many-to-many class="关联类" column="关联类主键名" />
</Set>
3、inverse属性
inverse本意为反转,这个属性默认值为false,他的作用的表示是否维护外键,false
则为维护,true则为不维护,即反转控制权,在一对多关系中一般由多的那一方来维护
外键,即一的那一方要配置inverse=“true”,反转外键的控制权;
如果是多对多的情况,一定要在任一方设置反转,让一方拥有外键的控制权,不然两
方都维护外键关系就会出现冲突。
4、cascade属性
cascade意为级联操作,默认值为none用值有:
update
save
save-update
delete
all
none
all-delete-orphan(孤儿删除)
若设置级联为update,那么设置级联属性的一方持久化后,无需再保存关联的另一方
需要注意的是,一般不使用delete和all-delete-orphan,这两个值很危险,一旦误删
会产生严重后果。
二、hibernate检索(查询)
1、最简单的查询:
session.get(对象class,id)-----》通过id查询出对象,此id对应的对象必须
唯一。
2、HQL查询
hibernate query language -----》hibernate的独家查询语言,需要些少量的
sql语句。
1)完全查询:
String hql ="from Xxx对象";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();//返回对象结果集
2)条件查询:
按id查询:
String hql = "from Xxx where id = ?";
Query query = session.createQuery(hql);
query.setParameter(0,“idname”);
Xxx xx = (Xxx)query.uniqueResult();
匿名方式:
Stirng hql = "from Xxx where :id = c_id";
Query query = session.createQuery(hql);
query.setParameter("c_id","idName");
Xxx xx = (Xxx)query.uniqueResult();
3)分页查询
String hql = "from Xxx";
Query query = session.createQuery(hql);
query.setFirstResult(0);//起始索引
query.setMaxResults(2);//查询条数,相当于limit 0,2
索引=(当前页数-1)*查询条数
4)查询总条数
String hql = "select count(*) from Xxx";
Query query = session.createQuery(hql);
int count = (Long)query.iterate().next().intValue();
或写成Number count = (Number)query.uniqueResult();
5)投影查询
String hql ="select xxx属性 from Xxx对象";
Query query = session.createQuery(hql);
List list = query.list();//返回对象结果集
6)投影查询并把结果集给封装成对象
String hql ="select new Xxx(1属性,2属性) from Xxx对象";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();//返回对象结果集
使用这个hql时要确保Xxx对象中提供了相应的构造方法
7)多表查询
|-内连接
|-外连接
|-左外连接
|-右外连接
内连接:
String hql = "from Xxx x inner join x.属性";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
迫切内连接:
String hql = "from Xxx x inner join fetch x.属性";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();
//直接获得与x.属性连接的Xxx对象
左外连接、右外连接
String hql = "from Xxx x inner left/right join fetch x.属性";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();
三、QBC查询(query by criteria)
无sql语句的查询,完全面向对象
1、全部查询
Criteria c = session.createCriteria(Xxx.class);
List<Xxx> list = c.list();
2、条件查询
Criteria c = session.createCriteria(Xxx.class);
c.add(Restrictions.内置的条件);
3、分页查询
Criteria c = session.createCriteria(Xxx.class);
c.setFirstResult(0);
c.setMaxResults(2);
4、排列查询
Criteria c = session.createCriteria(Xxx.class);
c.addOrder(Order.asc("排序的列名"));
List<Xxx> list = c.list();
5、离线查询
//在web层创建一个离线criteria对象方便在web层进行条件的拼接
DetachedCriteria dc = DetachedCriteria.forClass(Xxx.class);
dc.add(Restrictions.条件);//拼装好的条件
//dao层将离线查询对象关联到当前session上
Criteria c = dc.getExecutableCriteria(session);
...
四、查询优化
1、懒加载(延迟加载):get()--改为--》load
load方法是在执行时不发送任何sql语句,而是先返回一个对象,
只有在使用该对象时才查询;
而sava方法在执行时就会发送sql语句,无论这个被查询到的对象
使用还是不使用
hibernate精华总结相关推荐
- 手低眼高 初学者学习Hibernate的方法
Hibernate入门容易,掌握精通我也不敢自夸.我第一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因为Hibernate文档处处都是持久层设计的经验 ...
- Spring精华问答 | 为何使用Spring?
Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们来看看关于Spring的精华问答吧. 1 Q:Spring的目标是什么 ...
- Spring精华问答 | Spring 能帮我们做什么?
Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们一起来看看关于Spring的精华问答吧. 1 Q:什么是Spring框 ...
- 基于jsp+mysql+Spring+hibernate+在线学习交流论坛平台
本项目演示链接地址 > 主要功能模块设计: 管理员角色包含以下功能:管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能. 用户角色包含以下功能:按分类查看,用户 ...
- 基于jsp+mysql+Spring+hibernate+的SSH在线学习交流论坛平台
本项目演示链接地址> 主要功能模块设计: 管理员角色包含以下功能:管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能. 用户角色包含以下功能:按分类查看,用户登 ...
- iteye上总结的编程精华资源
原文: http://www.iteye.com/magazines/130 博客是记录学习历程.分享经验的最佳平台,多年以来,各路技术大牛在ITeye网站上产生了大量优质的技术文章,并将系列文章集结 ...
- 来自CSDN的精华网址
来自CSDN的精华网址,包括:WebForm中DataGrid及其它程序员收藏的精华 自认为以下文章比较经典,希望对初学者有用^_^ 1.DataGrid动态模板列更新数据并且分页的例子 http:/ ...
- 爱的乐章,Hibernate之三部曲
爱的乐章,Hibernate之三部曲 摘要 本文介绍了笔者使用Hibernate的三个阶段.第一个阶段完全被Hibernate的优点吸引.第二个阶段发现Hibernate在性能上的一些缺陷.笔者通过实 ...
- Struts1、Struts2、Hibernate、Spring框架工作原理介绍
Struts1工作原理 Struts1工作原理图 1 .初始化: struts 框架的总控制器 ActionServlet 是一个 Servlet ,它在 web.xml 中配置成自动启动的 Serv ...
最新文章
- python pip安装提示Consider using the `--user` option or check the permissions.
- Gentoo 安装日记 09 (安装stage3:下载内核)
- SpiderData 2019年2月22日 DApp数据排行榜
- Hello XTCPC
- Unity内实现Android APK版本更新
- android 怎么获取app 字体颜色,android app 修改字体
- 3-5Tensor的属性
- python运维模块_Python 运维常用模块
- Android 启动多个闹钟。
- QT 5.9.5的快捷键操作
- MySQL数据库中库、表名、字段的大小写问题
- vue3 动态获取屏幕尺寸
- PDF文件转换文件格式
- 微信小程序使用formdata传参上传图片
- 关于面试“有戏”和“没戏”的信号
- 镭速发布文件直传新功能,实现端到端快速传输
- 洛谷3238 HNOI2014 道路阻塞 最短路 线段树(无代码)
- 刷脸支付不用带手机不需要扫二维码
- 武邑中学2021高考成绩查询,武邑中学2019高考喜报成绩、清华北大本一上线人数情况...
- Java码农进阶之路~数组的深进浅出