【Hibernate】Re01.5 API
1、Session单表的CRUD操作
1、增加或者修改,使用同一个方法,或者下面的两个也行:
感觉多此一举。。。
2、删除方法,硬删除:
3、获取方法提供了两种,Get & Load
get方法
load方法
2、Get 和 Load 的区别?
使用get方法获取,如果查询的数据不存在则直接返回Null,即空指针。
如果使用Load方法获取,查询的数据不存在,则抛出异常。
3、JavaBean在Hibernate的Session中的持久化生命周期
一、瞬时状态
ORM对象和数据库不存在关联,且对象在数据库中没有关联记录,该对象的状态为瞬时状态。对象会被GC回收
二、持久状态
Bean与Session关联,被Session管理的情况下,该对象状态为持久状态。
也就是通过上述的Get,Load方法得到对象。调用save方法存入的对象也会被Session关联,变为持久状态
三、游离状态
脱离Session管理的bean对象,该对象状态即为游离状态
4、DirtyCheck 脏检查?
对象的属性发生变化的,称为脏对象,脏检查也就是对前面描述的对象进行检查
如果发现了脏变化,对象的属性发生改变,Session也要对应的将改变更新到数据库中,保证数据一致
5、FlushCache 缓存刷新
触发脏检查的方式就是刷新缓存,Session刷新的方式有两种,在commit提交的时候触发,二是手动调用flush方法触发
6、更新方法API详细
虽然说save也可以用来作更新操作,因为有OID就行,但是Hibernate还是提供了对应的更新方法
update 将游离状态的对象恢复持久状态,同时进行数据库更新操作,如果OID不存在则抛出异常
saveOrUpdate 包含save和update方法,参数是游离状态的对象就调用update执行
merge 将参数的游离状态对象复制属性到一个拥有相同OID的持久状态对象,通过对持久状态对象的脏检查进行更新操作,并返回
7、唯一结果 UniqueResult方法
查询返回的多个记录可以被List集合或者Iterator迭代器对象封装
二者皆可以被遍历处理,但是只有一个结果的情况,可以不需要集合对象处理,直接调用这个就行了
要注意的是,如果返回的结果不唯一,则Hibernate会抛出异常:NonUniqueResultException
8、分页与投影查询
一些分页需要的数据,使用Hibernate获取代码片段:
@Test
public void hibernatePaging() { Session session = HibernateUtil.getSession(); final String HQL_STATEMENT = "FROM xx.xx.xxx.DomainClass"; final Integer pageIndex = 10;
final Integer pageSize = 20; Query<Object> totalCountQuery = session.createQuery(HQL_STATEMENT, Object.class);
long count = totalCountQuery.stream().count();
Integer totalPage = new Long((count % pageSize == 0) ? (count / pageSize) : (count /pageSize + 1)).intValue(); Query<Object> pageListQuery = session.createQuery(HQL_STATEMENT, Object.class); pageListQuery.setFirstResult( (pageIndex - 1) * pageSize );
pageListQuery.setMaxResults( pageSize ); List<Object> objectList = pageListQuery.list();
}
一般来说封装的分页对象:
package cn.zeal4j.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List; /**
* @author Administrator
* @file IntelliJ IDEA Hibernate-Tutorial
* @create 2020 09 26 19:10
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageModel<Entity> {
private Integer pageIndex;
private Integer pageSize;
private Long totalCount;
private Integer totalPage;
private List<Entity> pageList; public void setTotalPage(Long totalCount) {
totalPage = new Long((totalCount % pageSize == 0) ?
(totalCount / pageSize) : (totalCount /pageSize + 1)).intValue();
}
}
使用分页模型处理:
只是写了一个大概的蓝图,实际操作再看吧
@Test
public void hibernatePaging2() {
// 参数
int index = 2;
int size = 20;
// 复杂一些还需要查询条件也封装进去才行,这里就不设置了
final String HQL_STATEMENT = "FROM xx.xx.xxx.DomainClass"; Session session = HibernateUtil.getSession(); Query<Object> query = session.createQuery(HQL_STATEMENT, Object.class); long count = query.stream().count(); PageModel<Object> pageModel = new PageModel<>(); pageModel.setPageIndex(index); pageModel.setPageSize(size); pageModel.setTotalCount(count); pageModel.setTotalPage(count); query.setFirstResult( (pageModel.getPageIndex() - 1) * pageModel.getPageSize() );
query.setMaxResults( pageModel.getPageSize() ); List<Object> objectList = query.list(); pageModel.setPageList(objectList); // 业务就可以返回这个包装的分页模型对象了
// return pageModel;
}
9、投影查询
数据的展示并不需要全部获取,只是部分的属性,或者使用表达式、函数、等获取结果
可以使用投影函数。有三种情景适用:
1、每条结果仅包含一个字段列,查询的结果泛型可以直接返回那个字段的类型
2、或者多个字段列,查询的结果泛型可以直接返回Object数组
3、结果通过构造器封装成对象,查询的结果就是映射的实体类对象
发现构造器查询是这样的。。。眼睛已经瞎掉了。。。
【Hibernate】Re01.5 API的更多相关文章
- 【Hibernate】Hibernate的多表查询
在<[Hibernate]Hibernate的聚类查询.分组查询.排序与时间之差>(点击打开链接)一文中已经讲述过怎样利用HQL语句代替SQL语句.进行聚类查询.分组查询.排序与时间之差的 ...
- 【hibernate】映射继承关系
[hibernate]映射继承关系 转载:https://www.cnblogs.com/yangchongxing/p/10405151.html ========================= ...
- 【hibernate】自定义转换器
[hibernate]自定义转换器 转载:https://www.cnblogs.com/yangchongxing/p/10398255.html 1.转换基本属性 package cn.ycx.s ...
- 【hibernate】存储图片
[hibernate]存储图片 转载: package cn.ycx.study.hibernate.entity; import javax.persistence.Entity; import j ...
- 【hibernate】映射可嵌入式组件
[hibernate]映射可嵌入式组件 转载:https://www.cnblogs.com/yangchongxing/p/10376452.html 可嵌入 Address 类,没有对应的数据表 ...
- 【hibernate】应用程序级别的视图
[hibernate]应用程序级别的视图 转载:https://www.cnblogs.com/yangchongxing/p/10361281.html 在没有数据库修改权限时,像创建视图可以使用 ...
- 【hibernate】重写物理表名和列明
[hibernate]重写物理表名和列明 转载:https://www.cnblogs.com/yangchongxing/p/10357123.html 假设你的数据库命名有这样的需求,表都以 yc ...
- 【hibernate】常用注解
[hibernate]常用注解 转载:https://www.cnblogs.com/yangchongxing/p/10357118.html 目录 ======================== ...
- 【译】Android NDK API 规范
[译]Android NDK API 规范 译者按: 修改R代码遇到Lint tool的报错,搜到了这篇文档,aosp仓库地址:Android NDK API Guidelines. 975a589 ...
- 【算法】实现字典API:有序数组和无序链表
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
随机推荐
- else if
// if(){}else if(){}...else{} // 多种条件,多种情况下的判断语句 // 必须要注意 // 1,else if 之后有 ...
- 剑指Offer-62.二叉搜索树的第k个结点(C++/Java)
题目: 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 分析: 二叉搜索树的中序遍历结果正好是按数值升序排列的结 ...
- Prometheus + Grafana (1) 监控
简介 Micrometer/Prometheus/Grafana体系是当前最成熟的低成本Java监控解决方案,而且通过其他的Prometheus exporter,还可以进行诸如我们可能需要的Wind ...
- sftp jsch文件移动备份的思路
1.jsch jar包不支持mv cp等移动复制的功能,转换思路,sftp下载文件到本地服务器,目录可以考虑使用/年/月/日层级. 2.然后sftp下载操作完毕,记录一张文件操作表,记录下载状态. 3 ...
- lovelive - μ's
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` lovelive - μ's 日期:2017-12-16 ...
- 随机二次元图片API上线
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 随机二次元图片API上线 日期:2017-12-6 阿珏 ...
- 『vulnhub系列』Deathnote-1
『vulnhub系列』Deathnote-1 下载地址: https://www.vulnhub.com/entry/deathnote-1,739/ 信息搜集: 使用nmap扫描存活主机,发现主机开 ...
- Ubuntu20.04之Nvidia驱动安装
参考:https://blog.csdn.net/xiaokedou_hust/article/details/82187860,实际操作时和该博文有些出入,故作优化. s1.连接wifi,打开终端. ...
- spring cloud 上云的情况下,Ribbon 客户端负载均衡 与 ALB 服务端负载均衡的选择
在云环境(例如AWS)中,由于云提供商通常提供强大的负载均衡服务(如AWS的ALB),一般不再需要使用Ribbon这种客户端负载均衡方案.云环境中的负载均衡器通常能够提供更高的可靠性.可扩展性和简化的 ...
- SpringBoot 启动时报错Unable to start embedded Tomcat
导读 最近公司有个gradle构建的工程,需要改造成maven方式构建(点我直达).转为maven后,启动时一直报tomcat错误,最终排查是因为servlet-api这个包导致的依赖冲突,将这个依赖 ...