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 ...
最新文章
- ios 圆形旋转菜单_iOS实现滑动弧形菜单的思路与方法
- spring集成xmemcached
- opentesty--luasocket 安装
- VC6.0编写BHO 提示unresolved external symbol _main
- 进程内存信息 /proc/[pid]/maps /proc/[pid]/smaps /proc/[pid]/status
- Allegro 光绘文件快速导入
- html调用deeplink,如何优雅地从浏览器打开本地应用deeplink
- 面试 .NET 开发​,为什么也要考算法?​
- linux 编译3g驱动_linux重新编译内核
- Path Sum leetcode java
- 根据控制点坐标对完成坐标转换
- python打开浏览器的三种方法
- Java Web 学生选课管理系统
- Hive MetaStore java.lang.NoClassDefFoundError: com/facebook/fb303/FacebookService$Iface
- 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
- Spire.XLS的使用
- python读取加密word_python的特殊文件操作——excel、PDF、word、json、csv
- vue PC端项目打包成windows桌面程序
- 银行存款对账java代码_银行存款对账方法
- 干货 | 软件工程师必知之事 —— 如何定义自己的职业路线?
热门文章
- REST-Assured,接口自动化的 “瑞士军刀“- 初识篇
- 苹果开发者账号申请流程(公司)
- 【saltstack】配置salt-master端REDIS_RETURN
- VUE+VSCODE(新建一个项目)
- 计算机word资料,怎样快速找到电脑中的Word文档
- 艾尔米特插值的MATLAB实现,埃尔米特(Hermite)插值
- 随机产生单词java_JavaGUI实现随机单词答题游戏
- 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速【转】
- 知名APP(支付宝、微信、花瓣等)首页设计技巧及原型实例讲解
- 13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置