Hibernate02

1、持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。
 持久化类 = JavaBean +xxx.hbm.xml

2、持久化类的编写规则**
  1. 提供一个无参数 public访问控制符的构造器。底层需要进行反射.

    2. 提供一个标识属性,映射数据表主键字段。唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识OID确定记录

    3. 所有属性提供public访问控制符的 set或者get方法

    4. 标识属性应尽量使用基本数据类型的包装类型

3、Hibernate的持久化类的状态。Hibernate为了管理持久化类:将持久化类分成了三个状态
 1瞬时态:TransientObject:没有持久化标识OID, 没有被纳入到Session对象的管理

       * 获得瞬时态的对象User user = new User()

       * 瞬时态对象转换持久态save()/saveOrUpdate();

       * 瞬时态对象转换成脱管态 user.setId(1)

2、持久态:Persistent Object:有持久化标识OID,已经被纳入到Session对象的管理.
3、脱管态:Detached Object:有持久化标识OID,没有被纳入到Session对象的管理.

4、持久态对象具有自动更新数据库的能力,不用session.xx操作


4Session对象的一级缓存(重点)
1. 什么是缓存?

       * 其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放到缓存中.再次获取的时候 ,直接从缓存中获取.可以提升程序的性能!

2. Hibernate框架提供了两种缓存

       * 一级缓存 -- 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.

       * 二级缓存 -- 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.

3. Session对象的缓存概述

       * Session接口中,有一系列的java的集合,这些java集合构成了Session级别的缓存(一级缓存).将对象存入到一级缓存中,session没有结束生命周期,那么对象在session中存放着

       * 内存中包含Session实例 --> Session的缓存(一些集合) --> 集合中包含的是缓存对象!

4. 证明一级缓存的存在,编写查询的代码即可证明

       * 在同一个Session对象中两次查询,可以证明使用了缓存

5. Hibernate框架是如何做到数据发生变化时进行同步操作的呢?

       * 使用get方法查询User对象

       * 然后设置User对象的一个属性,注意:没有做update操作。发现,数据库中的记录也改变了。

       * 利用快照机制来完成的(SnapShot)


5使用Hibernate框架解决丢失更新的问题
* 乐观锁

    1.在对应的JavaBean中添加一个属性,名称可以是任意的。例如:private Integer version; 提供get和set方法

    2.在映射的配置文件中,提供<version name="version"/>标签即可。


6 绑定本地的Session

   现在的Hibernate框架中,使用session对象开启事务,所以需要来传递session对象,框架提供了ThreadLocal的方式

   1、需要在hibernate.cfg.xml的配置文件中提供配置

  <propertyname="hibernate.current_session_context_class">thread</property>

2、重新HibernateUtil的工具类,使用SessionFactory的getCurrentSession()方法,获取当前的Session对象。并且该Session对象不用手动关闭,线程结束了,会自动关闭。

   public static SessiongetCurrentSession(){

           returnfactory.getCurrentSession();

        }

   3、注意:想使用getCurrentSession()方法,必须要先配置才能使用。

7、Query查询接口 

	1. 具体的查询代码如下
		// 1.查询所有记录
		/*Query query = session.createQuery("from Customer");
		List<Customer> list = query.list();
		System.out.println(list);*/
		
		// 2.条件查询:
		/*Query query = session.createQuery("from Customer where name = ?");
		query.setString(0, "李健");
		List<Customer> list = query.list();
		System.out.println(list);*/
		
		// 3.条件查询:
		/*Query query = session.createQuery("from Customer where name = :aaa and age = :bbb");
		query.setString("aaa", "李健");
		query.setInteger("bbb", 38);
		List<Customer> list = query.list();
		System.out.println(list);*/

 8、Criteria查询接口(非常适合做条件查询)

1. 具体的查询代码如下
		// 1.查询所有记录
		/*Criteria criteria = session.createCriteria(Customer.class);
		List<Customer> list = criteria.list();
		System.out.println(list);*/
		
		// 2.条件查询
		/*Criteria criteria = session.createCriteria(Customer.class);
		criteria.add(Restrictions.eq("name", "李健"));
		List<Customer> list = criteria.list();
		System.out.println(list);*/
		
		// 3.条件查询
		/*Criteria criteria = session.createCriteria(Customer.class);
		criteria.add(Restrictions.eq("name", "李健"));
		criteria.add(Restrictions.eq("age", 38));
		List<Customer> list = criteria.list();
		System.out.println(list);*/


戒骄戒躁

猜你喜欢

转载自blog.csdn.net/lxiansheng001/article/details/80343836
今日推荐