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精华总结相关推荐

  1. 手低眼高 初学者学习Hibernate的方法

    Hibernate入门容易,掌握精通我也不敢自夸.我第一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因为Hibernate文档处处都是持久层设计的经验 ...

  2. Spring精华问答 | 为何使用Spring?

    Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们来看看关于Spring的精华问答吧. 1 Q:Spring的目标是什么 ...

  3. Spring精华问答 | Spring 能帮我们做什么?

    Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们一起来看看关于Spring的精华问答吧. 1 Q:什么是Spring框 ...

  4. 基于jsp+mysql+Spring+hibernate+在线学习交流论坛平台

    本项目演示链接地址 > 主要功能模块设计: 管理员角色包含以下功能:管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能. 用户角色包含以下功能:按分类查看,用户 ...

  5. 基于jsp+mysql+Spring+hibernate+的SSH在线学习交流论坛平台

    本项目演示链接地址> 主要功能模块设计: 管理员角色包含以下功能:管理员登录,发布公告,修改资料,查看新帖,查看精华帖请求,封锁用户,创建讨论区等功能. 用户角色包含以下功能:按分类查看,用户登 ...

  6. iteye上总结的编程精华资源

    原文: http://www.iteye.com/magazines/130 博客是记录学习历程.分享经验的最佳平台,多年以来,各路技术大牛在ITeye网站上产生了大量优质的技术文章,并将系列文章集结 ...

  7. 来自CSDN的精华网址

    来自CSDN的精华网址,包括:WebForm中DataGrid及其它程序员收藏的精华 自认为以下文章比较经典,希望对初学者有用^_^ 1.DataGrid动态模板列更新数据并且分页的例子 http:/ ...

  8. 爱的乐章,Hibernate之三部曲

    爱的乐章,Hibernate之三部曲 摘要 本文介绍了笔者使用Hibernate的三个阶段.第一个阶段完全被Hibernate的优点吸引.第二个阶段发现Hibernate在性能上的一些缺陷.笔者通过实 ...

  9. Struts1、Struts2、Hibernate、Spring框架工作原理介绍

    Struts1工作原理 Struts1工作原理图 1 .初始化: struts 框架的总控制器 ActionServlet 是一个 Servlet ,它在 web.xml 中配置成自动启动的 Serv ...

最新文章

  1. python pip安装提示Consider using the `--user` option or check the permissions.
  2. Gentoo 安装日记 09 (安装stage3:下载内核)
  3. SpiderData 2019年2月22日 DApp数据排行榜
  4. Hello XTCPC
  5. Unity内实现Android APK版本更新
  6. android 怎么获取app 字体颜色,android app 修改字体
  7. 3-5Tensor的属性
  8. python运维模块_Python 运维常用模块
  9. Android 启动多个闹钟。
  10. QT 5.9.5的快捷键操作
  11. MySQL数据库中库、表名、字段的大小写问题
  12. vue3 动态获取屏幕尺寸
  13. PDF文件转换文件格式
  14. 微信小程序使用formdata传参上传图片
  15. 关于面试“有戏”和“没戏”的信号
  16. 镭速发布文件直传新功能,实现端到端快速传输
  17. 洛谷3238 HNOI2014 道路阻塞 最短路 线段树(无代码)
  18. 刷脸支付不用带手机不需要扫二维码
  19. 武邑中学2021高考成绩查询,武邑中学2019高考喜报成绩、清华北大本一上线人数情况...
  20. Java码农进阶之路~数组的深进浅出

热门文章

  1. 可配置组件库Fusion Design 了解一下
  2. 安全态势攻防赛事可视化,助力网络安全发展
  3. Zoom天使投资人Jim Scheinman:Zoom的诞生始末
  4. windows 安装labelme
  5. Cerebral Cortex:基因和环境对大脑功能连接的影响
  6. qt 绘图工具(一)
  7. 基本算法总结,力扣题目整理
  8. macbook无法打开移动硬盘 为什么mac上显示不了移动硬盘
  9. 集体名词做主语时下谓语的单复数选择
  10. 用计算机做动画效果,动画图片多种效果制作步骤