Hibernate第二天(Hibernate的持久化类编写,Hibernate一级缓存的内容)

1.1 持久化类的编写规则

1.1.1 什么是持久化类

持久化类: 与表建立了映射关系的实体类,就可以称之为持久化类

持久化类 = Java+ 映射文件

1.1.2 持久化类的编写规则

l 提供无参数的构造方法

l 类中的成员都是私有的private

对私有属性提供get/set方法

l 属性尽量使用包装类类型 :默认值不同的,包装类默认值null,基本数据类型默认0

持久化类不要使用final进行修饰 :使用final修饰,延迟加载失效,变为立即加载。

l 类中需要提供标识属性(OID),与表中主键建立映射关系 Hibernate根据标识属性来判断对象是否是同一个的。

 

 

扫描二维码关注公众号,回复: 1868875 查看本文章

 

 

Hibernate中实体类的标识属性:  Object Identifie  简称OID属性

  就是配置文件中对应主键的那个实体类属性.

 

作用: hibernate来区分对象是否是同一个

如果多个对象的标识属性值相同,hibernate会认为是同一个对象,存储数据会报错

 

 

1.2 Hibernate主键生成策略

1.2.1 区分自然主键和代理主键

l 自然主键:创建表的时候,使用的是实体中的自身属性作为表的主键。

例如: 创建一张人员表,可以用自生的身份证号(唯一的不可重复的)作为主键

 

l 代理主键:创建表的时候,使用的不是实体中的自身的属性作为主键,创建一个不相关一个字段作为主键。

例如: 创建一张人员表,不使用自生的身份证号(唯一的不可重复的)作为主键,用另外创建一个id作为主键

 

 

 

 

***** 尽量使用代理主键。如果自然主键,如果主键需要参与到业务逻辑中,有可能需要改变很多的设计和代码。

 

 

 

 

1.2.2 Hibernate的主键生成策略

主键不应该由用户自己维护,应该统一管理,那么Hibernate就提供了主键统一管理的方式:主键生成策略。

l increment :自动增长,是Hibernate中提供一种自动增长方式,不是数据库中的自动增长。(适用于shortintlong类型的主键)

首先使用select max(cust_id) from cst_customer;将这个最大值+1作为下一条记录的主键。

对于并发访问数据库不适用 

identity:自动增长,适用于shortintlong类型的主键,使用的是数据库自动增长机制。不是所有数据库都支持自动增长,比如Oracle没有自动增长。 

sequence:序列,适用于shortintlong类型的主键,使用序列方式完成主键的生成。必须是支持序列的方式的数据库。Oracle的自动增长

 

native:本地策略,根据底层的数据库不同,自动选择使用identity还是sequence

 

uuid:随机字符串,适用于字符串类型的主键。

 

l assigned Hibernate不维护主键,开发人员需要手动设置主键。

 

 

总结: 以后如果针对是数值型,选择用native  如果是varchar类型,可以选择用uuid

     但是也可以不用hibernate维护,自己在程序中手动设定唯一非空(assigned)

1.3 持久化类的三种状态

1.3.1 Hibernate的持久化类的三种状态

Hibernate框架为了更好管理持久化类,将持久化类分成了三种状态:

l 瞬时态 :没有持久化标识OID,没有被session操作管理。

持久态:有持久化标识OID,已经被session操作管理。

l 脱管态(离线态) :有持久化标识OID,没有被session操作管理。

1.3.2 区分三种状态持久化对象

1.3.3 三种状态的转换(了解--面试题

l 瞬时态

n 获得

Customer customer = new Customer();

n 状态转换

u 瞬时à持久:savesaveOrUpdate

u 瞬时à托管:customer.setCust_id(1l);

 

 

l 持久态:

n 获得

Customer customer = session.get(Customer.class,1l);

只要是涉及到查询方法直接获得持久态对象。

n 状态转换

u 持久à脱管: close 

u 持久à瞬时:delete

 

 

l 脱管态

n 获得

Customer customer = new Customer();

customer.setCust_id(1l);

n 状态转换

u 脱管à持久:save,updatesaveOrUpdate

u 脱管à瞬时:customer.setCust_id(null);

1.3.4 持久态可以自动更新数据库

1.4 Hibernate的一级缓存

1.4.1 缓存的概述

1.4.2 Hibernate的一级概述

Hibernate框架本身的性能不是很好,但是Hibernate提供了很多的性能优化的手段,比如,缓存。

Hibernate框架共提供了两个级别的缓存:

一级缓存:称为Session级别的缓存。因为一级缓存的生命周期与session一致的。自带的,不可卸载的。(Session中一系列的Java集合构成的)

二级缓存:称为SessionFactory级别的缓存。需要进行配置的缓存的插件。默认不开启的。 ehche==redis

Ps: 除了删除,增改查和数据库打完交道,都会往一级缓存中留一份

但是session只要关闭,一级缓存的数据全部清空

1.4.3 证明一级缓存的存在

1.4.4 一级缓存的内部结构(快照区)

1.4.5 一级缓存的管理的方法:清空一级缓存的数据

clearevictclose管理一级缓存的相关的方法:

clear可以清空一级缓存的所有数据

evict可以清空一级缓存的某一个对象的数据

1.5 Session的绑定 (ThreadLocal)

1.5.1 Hibernate中设置与当前线程绑定的session的使用

hibernate.current_session_context_class

1.6 Hibernate的其他的API

hibernate,查询批量数据的方式:

Query方式  : 如果是使用这种方式做查询,又被称作为HQL查询

Criteria方式 :  如果是使用这种方式做查询,又被称作为QBC查询

1.6.1 Query HQL查询

接收一个HQL进行查询:HQL-Hibernate Query Language Hibernate查询语言,与SQL语言语法很相似的一个语言。面向对象。

@Test

/**

 * Query接口

 * HQL面向对象的查询.查询都是对象

 */

public void demo1(){

Session session = HibernateUtils.getCurrentSession();

Transaction transaction = session.beginTransaction();

// 查询全部客户信息:

/*Query query = session.createQuery("from Customer");

List<Customer> list = query.list();

for (Customer customer : list) {

System.out.println(customer);

}*/

// 条件查询

/*Query query = session.createQuery("from Customer where cust_name like ?");

// 设置参数

query.setParameter(0, "%");

List<Customer> list = query.list();

for (Customer customer : list) {

System.out.println(customer);

}*/

// 分页查询:

Query query = session.createQuery("from Customer");

// 从哪开始的

query.setFirstResult(3);

// 每页显示记录数

query.setMaxResults(3);

List<Customer> list = query.list();

for (Customer customer : list) {

System.out.println(customer);

}

transaction.commit();

}

/**
* 投影查询  无论单列还是多列  都返回对象
* 条件    1.需要查询几列就要在持久化类里面写几列的构造器
* 2.查询方式必须得是 select new 持久化类(列1,列2)
*/





1.6.2 Criteria QBC查询

QBC-Query By Criteria 条件查询。更加面向对象化查询语言。

@Test

/**

 * QBC查询:Query By Criteria

 */

public void demo2(){

Session session = HibernateUtils.getCurrentSession();

Transaction transaction = session.beginTransaction();

// 查询全部:

/*Criteria criteria = session.createCriteria(Customer.class);

List<Customer> list = criteria.list();

for (Customer customer : list) {

System.out.println(customer);

}*/

// 条件查询

    /**

 * == eq

 * >    gt 

* >=ge

 * <    lt

 * <=le

 * <>ne

 * in   in

 * like like

 *

 */

 

 

/*Criteria criteria = session.createCriteria(Customer.class);

// criteria.add(Restrictions.eq("cust_name", "郝天一"));

criteria.add(Restrictions.like("cust_name", "%"));

List<Customer> list = criteria.list();

for (Customer customer : list) {

System.out.println(customer);

}*/

// 分页查询

Criteria criteria = session.createCriteria(Customer.class);

criteria.setFirstResult(3);

criteria.setMaxResults(3);

List<Customer> list = criteria.list();

for (Customer customer : list) {

System.out.println(customer);

}

transaction.commit();

}

猜你喜欢

转载自blog.csdn.net/wuqianjing/article/details/80885949