前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Hibernate_day04总结

Hibernate_day04总结

作者头像
Java帮帮
发布于 2018-03-19 04:00:26
发布于 2018-03-19 04:00:26
64900
代码可运行
举报
运行总次数:0
代码可运行

更多资源分享就在【Java帮帮】微信公众号与QQ空间

Hibernate_day04总结

今日内容

l Hibernate的二级缓存

1.1 上次课内容回顾:

Hibernate的检索方式

* 对象导航的方式:customer.getOrders()

* OID检索方式:get/load

* HQL检索:

* 简单查询:from Customer

* 别名查询:from Customer as c

* 多态查询:from java.lang.Object

* 排序查询:from Customer order by age asc

* 分页查询:setFirstResult().setMaxResults();

* 条件查询:from Customer where cname like ? and age > ?

* 聚合函数:select count(*) from Customer

* 分组查询:select o.customer.cid,count(*) from Orders o group by o.customer.cid;

* 投影查询:select cname,age from Customer

* 连接查询:

* 内连接:

* from Customer c inner join c.orders;

* 外连接:

* left outer join

* right outer join

* QBC检索:

* 简单查询:session.createCriteria(Customer.class);

* 排序查询:criteria.addOrder(Order.asc(“age”));

* 分页查询:criteria.setFirstResult().setMaxResults();

* 条件查询:criteria.add();

* 离线条件查询:DetachedCriteria.

* SQL检索:

Hibernate的检索策略

* fetch和lazy:

* <set>标签上:

* fetch:

* select

* join

* subselect

* lazy:

* true

* false

* extra

* <many-to-one>

* fetch:

* select

* join

* lazy:

* proxy

* false

* no-proxy

* 批量抓取:

* batch-size=

Hibernate的事务管理

* 配置事务隔离级别:

* 解决写问题:

* 悲观锁

* 乐观锁

* 与线程绑定的session的使用.

1.2 Hibernate的二级缓存:

1.2.1 Hibernate的二级缓存:

什么是缓存:

计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存

Hibernate二级缓存:

Hibernate总共分成两个级别的缓存.一级缓存:与session生命周期相关的,称为是session的级别的缓存.二级缓存可以在多个session中共享数据.范围相当于sessionFactory的范围.二级缓存称为是sessionFactory级别的缓存.

Hibernate的一级缓存,自带的,不可卸载.Hibernate的二级缓存需要自己配置.默认没有开启的.

Hibernate的二级缓存的内部结构:

Class Cache Region :类缓存区

Collection Cache Region :集合缓存区

Query Cache Region :查询缓存区

Update timestamps :更新时间戳区

Hibernate的并发策略:

Transactional :事务型. 缓存支持事务,发生异常的时候,缓存也能够回滚

Read-write :读写型. 更新缓存的时候会锁定缓存中的数据

nonstrict-read-write:非严格读写型. 不锁定缓存中的数据

Read-only :只读型. 适用从来不会被修改的数据

Hibernate的二级缓存存放的数据:

适合放入二级缓存:

数据不经常修改.

偶尔允许出现并发问题.

不适合放入二级缓存:

经常变化数据.

财务上的数据.

与其他应该共享的数据.

Hibernate支持的二级缓存的提供商:

1.2.2 Hibernate的二级缓存的入门:

步骤一:创建一个java项目,搭建hibernate的开发环境.

步骤二:引入二级缓存需要使用的jar包.

采用EHCache作为Hibernate的二级缓存的插件:

引入EHCache的使用jar包:

步骤三:引入EHCache的配置文件:

在src下引入ehcache的配置文件.

步骤四:在Hibernate的核心配置文件中完成配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 开启Hibernate的二级缓存 -->
<propertyname="hibernate.cache.use_second_level_cache">true</property>
<!-- 配置二级缓存的提供商. -->
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

步骤五:配置哪些类需要使用二级缓存.

两种配置方式:

* 第一种配置方式:

* 在这个持久化类的映射中配置:

* 在<class>标签下使用<cache>标签:

<cache usage="read-write"/>

* 第二种配置方式:

* 在核心配置文件中进行统一配置:

<!-- 配置哪些类需要放入到二级缓存 -->

<class-cacheusage="read-write"class="cn.itcast.hibernate.demo1.Customer"/>

<class-cacheusage="read-write"class="cn.itcast.hibernate.demo1.Order"/>

<collection-cacheusage="read-write"collection="cn.itcast.hibernate.demo1.Customer.orders"/>

步骤六:使用二级缓存.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
/**
* 配置二级缓存
*/
publicvoid demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer1 = (Customer) session.get(Customer.class, 1); // 发送一条SQL语句
System.out.println(customer1);
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
Customer customer2 = (Customer) session.get(Customer.class, 1); // 没有发送SQL语句
System.out.println(customer2);
tx.commit();
session.close();
}

1.2.3 Hibernate的二级缓存的类缓冲区的特点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
/**
* 配置二级缓存
*/
publicvoid demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer1 = (Customer) session.get(Customer.class, 1); // 发送一条SQL语句
Customer customer2 = (Customer) session.get(Customer.class, 1); //
System.out.println(customer1 == customer2); // true. 一级缓存缓存是对象的地址.
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
Customer customer3 = (Customer) session.get(Customer.class, 1); // 没有发送SQL语句
Customer customer4 = (Customer) session.get(Customer.class, 1); //
System.out.println(customer3 == customer4); // true. 一级缓存缓存是对象的地址.
System.out.println(customer1 == customer3); // false. 二级缓存的类缓存区 缓存的不是对象的地址,缓存的是 对象的散装的数据.
tx.commit();
session.close();
}
1.2.4 Hibernate的二级缓存的集合缓冲区的特点:

集合缓冲区依赖类缓冲区,而且集合缓存区只会缓存对象的ID.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
/**
* 二级缓存的集合缓冲区的特点:
*/
publicvoid demo3(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = (Customer) session.get(Customer.class, 1);
for (Order order : customer.getOrders()) {
System.out.println(customer.getCname());
System.out.println(order);
}
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
Customer customer2 = (Customer) session.get(Customer.class, 1);
for (Order order : customer2.getOrders()) {
System.out.println(customer2.getCname());
System.out.println(order);
}
tx.commit();
session.close();
}

1.2.5 Hibernate的iterate方法和list方法的比较:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SuppressWarnings("unchecked")
@Test
/**
* get/load方法可以向二级缓存存放数据,而且也会使用二级缓存中的数据.
* Query中list方法.这个方法只会向二级缓存中存入数据,但是不使用二级缓存的数据.
*/
publicvoid demo4(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Customer> list = session.createQuery("from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
/*List<Customer> list2 = session.createQuery("from Customer").list();
for (Customer customer : list2) {
System.out.println(customer);
}*/
Customer customer = (Customer) session.get(Customer.class, 1);
System.out.println(customer);
tx.commit();
session.close();
}
@SuppressWarnings("unchecked")
@Test

/**

* iterate和list方法:

* * 这两个方法都可以查询多条记录:

* * iterate方法向二级缓存存放数据,也会使用二级缓存的数据.

*/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicvoid demo5(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// iterate方法发送 N+1 语句.
Iterator<Customer> it = session.createQuery("from Customer").iterate();
while(it.hasNext()){
Customer customer = it.next();
System.out.println(customer);
}
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
// iterate方法发送 N+1 语句.
Iterator<Customer> it2 = session.createQuery("from Customer").iterate();
while(it2.hasNext()){
Customer customer = it2.next();
System.out.println(customer);
}
tx.commit();
session.close();
}

1.2.6 Hibernate的一级缓冲区的更新,同步到二级缓冲区:

@Test

/**

* 更新一级缓冲区的时候,同步更新二级缓冲区.

*/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicvoid demo6(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer1 = (Customer) session.get(Customer.class, 1);
customer1.setCname("小马");
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
Customer customer2 = (Customer) session.get(Customer.class, 1);
System.out.println(customer2);
tx.commit();
session.close();
}

1.2.7 Hibernate的更新时间戳区:

@Test

/**

* 更新时间戳区域:

*/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicvoid demo8(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer1 = (Customer) session.get(Customer.class, 1);
System.out.println(customer1);
session.createQuery("update Customer set cname = '小马' where cid = 1").executeUpdate();
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
Customer customer2 = (Customer) session.get(Customer.class, 1);
System.out.println(customer2);
tx.commit();
session.close();
}

1.2.8 Hibernate的二级缓存的查询缓冲区:

查询缓存的概述

查询缓存比二级缓存更加强大.二级缓存缓存整个对象.不能缓存对象的部分属性.

select cname,age from Customer;查询缓存可以缓存对象的部分属性.

查询缓存需要在二级缓存的基础上使用.查询需要进行一个配置.(查询缓存默认不开启)

配置查询缓存

<!-- 开启查询缓存 -->

<propertyname="hibernate.cache.use_query_cache">true</property>

编写程序的时候调用一个方法:

query.setCacheable(true)

@SuppressWarnings("unchecked")

@Test

/**

* 查询缓冲区

*/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
publicvoid demo9(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Object[]> list = session.createQuery("select cname,age from Customer").setCacheable(true).list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tx.commit();
session.close();
session = HibernateUtils.openSession();
tx = session.beginTransaction();
list = session.createQuery("select cname,age from Customer").setCacheable(true).list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tx.commit();
session.close();
}

1.3 Struts2+Hibernate:完成一个一对多的CRUD的操作.

1.3.1 Struts2和Hibernate的整合

步骤一:创建一个WEB项目,引入相关的jar包.

引入struts2的jar包:

引入hibernate3的jar包:

步骤二:引入相关的配置文件:

Struts2框架:

* web.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 配置Struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

* struts.xml

Hibernate框架:

* hibernate.cfg.xml

* 映射文件:

* log4j.properties

步骤三:创建包结构:

步骤四:创建实体和映射:

客户和订单:

步骤五:显示所有客户信息.(customer_findAll.action)

编写Action Service DAO

Action的代码:

/**

* 查询所有的客户的执行的方法:

*/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public String findAll(){
// 调用业务层:
CustomerService customerService = new CustomerService();
List<Customer> list = customerService.findAll();
// 保存到值栈中.
ActionContext.getContext().getValueStack().set("list", list);
return"findAll";
}

步骤六:添加客户:

新建add.jsp

编写Action,Service,DAO

步骤六:修改客户:

在列表页面上点击修改:

提交到Action:

* 查询当前对象.

* 回显到页面.

在修改页面上输入信息:

* 点击确定.

* 提交到Action,修改到数据库.

* 页面列表页面.

步骤七:删除客户:

在列表页面上点击删除链接:

* 提交到Action:

* 先查询再删除.(级联删除)

* 页面跳转.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hibernate文件配置
映射需要通过XML的配置文件来完成,这个配置文件尽量统一(xxx.hbm.xml) Hibernate核心的配置:必须的配置、可选的配置、映射文件的引入
用户3112896
2019/09/26
4290
Hibernate文件配置
Hibernate的缓存机制如何应用?
2.一级缓存应用: save()。当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。 get()和load()。当session对象调用get()或load()方法从数据库取出一个对象后,该对象也会被放入到session的缓存中。 使用HQL和QBC等从数据库中查询数据。
小小鱼儿小小林
2020/06/24
4570
hibernate系列之二
持久化:将程序数据在持久状态和瞬时状态间转换的机制;即将内存的数据永久存在关系型数据库中;
沁溪源
2020/09/03
4650
SSH框架之Hibernate第一篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/18
5840
走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/24
1.8K0
Java面试之JDBC & Hibernate
1、数据库,比如100 用户同时来访,要采取什么技术解决?【基础】 答:可采用连接池。 111、什么是ORM?【基础】 答:对象关系映射(Object—Relational Mapping,简称ORM)是一种为了解决面向对象与面向关系数据库存在的互不匹配的现象的技术;简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将java 程序中的对象自动持久化到关系数据库中;本质上就是将数据从一种形式转换到另外一种形式。 2、Hibernate 有哪5 个核心接口?【基础】 答: Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象; SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象, sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存; Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存; Transaction 接口:管理事务;Query 和Criteria 接口:执行数据库的查询。 3、关于hibernate: 【基础】 1)在hibernate 中,在配置文件呈标题一对多,多对多的标签是什么;2)Hibernate 的二级缓存是什么;3)Hibernate 是如何处理事务的; 答:1)一对多的标签为 ;多对多的标签为; 2)sessionFactory 的缓存为hibernate 的二级缓存; 3)Hibernate 的事务实际上是底层的JDBC Transaction 的封装或者是JTA Transaction 的封装;默认情况下使用JDBCTransaction。
全栈程序员站长
2022/08/04
3360
Hibernate_day02总结
Hibernate_day02总结 今日内容 l Hibernate持久化对象的状态 l Hibernate的一级缓存 l Hibernate操作持久化对象的方法 l Hibernate 关联关系映射 1.1 上次课内容回顾: Hibernate框架的概述. * 什么是Hibernate * 持久层的ORM框架. * ORM:对象关系映射. * 常见的持久层框架 * JPA * Hibernate * Mybatis * JdbcTemplate * Hibernate流行版本: * 3.x和4.x H
Java帮帮
2018/03/19
1.5K0
Hibernate_day02总结
Hibernate二级缓存的使用「建议收藏」
SessionFactory 级别缓存 —- 二级缓存(进程范围)
全栈程序员站长
2022/08/31
1.3K0
Hibernate二级缓存的使用「建议收藏」
Hibernate第二天:Hibernate的一级缓存、其他的API
持久化,将内存中的一个对象持久化到数据库的过程。Hibernate框架就是用来进行持久化的框架。
AlbertYang
2020/09/08
7050
SSH框架之Hibernate第二篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/18
5250
[Java面试八]Hibernate总结以及在面试中的一些问题.
1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
一枝花算不算浪漫
2018/05/18
1.6K0
day32_Hibernate学习笔记_04
  缓存(Cache):是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存。   缓存:程序 <-- (内存) --> 硬盘
黑泽君
2018/10/11
9910
day32_Hibernate学习笔记_04
Hibernate_day03总结
Hibernate_day03总结 今日内容 l Hibernate的检索方式 l Hibernate的抓取策略 l Hibernate的批量检索 l 事务的并发问题 1.1 上次课内容回顾: Hibernate的持久类三种状态: * 瞬时态:没有唯一标识OID,没有被session管理 * 持久态:有唯一标识OID,被session管理 * 脱管态:有唯一标识OID,没有被session管理. * 状态转换: 瞬时态:new 获得. * 瞬时à持久:save/saveOrUpdate * 瞬时à脱管:
Java帮帮
2018/03/19
1.1K0
Hibernate_day03总结
Hibernate的入门(Hibernate的环境搭建、Hibernate的API)
Hibernate第一天(Hibernate的环境搭建、Hibernate的API、Hibernate的CRUD)
AlbertYang
2020/09/08
1.2K0
Hibernate的入门(Hibernate的环境搭建、Hibernate的API)
Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置
* * 前提:一对多的双方都设置cascade="save-update"
AlbertYang
2020/09/08
1.9K0
Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置
Hibernate_day01总结
第1章 Hibernate_day01总结 今日内容 Hibernate框架的概述 Hibernate的快速入门 Hibernate核心API的介绍 Hibernate的持久化类 主键的生成策略 1.
Java帮帮
2018/03/19
1.3K0
Hibernate_day01总结
day30_Hibernate学习笔记_02
对象状态 瞬时态|临时态:Transient     1、没有与Hibernate产生关联(没有与Session有关联)。     2、与数据库中的记录没有产生关联,即对象没有ID(有关联:就是与数据库中的ID有对应)。 持久态:Persistent     1、与Hibernate有关联(与session有关联)。     2、对象有ID。 游离态|脱管态:Detached     1、没有与Hibernate产生关联。     2、对象有ID。 三种状态转换如下图所示:
黑泽君
2018/10/11
1.1K0
day30_Hibernate学习笔记_02
hibernate笔记(一)
原始的jdbc操作, Connection/Statement/ResultSet
HUC思梦
2020/09/03
8270
day31_Hibernate学习笔记_03
在数据库表中如何表达多对多关系:   使用中间表,分别引用两方的ID。 在对象中如何表达多对多关系:   两方都使用集合表达。 在配置文件中如何表达一对多关系:
黑泽君
2018/10/11
2.5K0
day31_Hibernate学习笔记_03
Hibernate第四天:Hibernate的查询方式、抓取策略
在Hibernate中提供了很多种的查询的方式。Hibernate共提供了五种查询方式。
AlbertYang
2020/09/08
1.7K0
Hibernate第四天:Hibernate的查询方式、抓取策略
相关推荐
Hibernate文件配置
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验