JavaEE框架---Hibernate第二部分

1.1 持久化类的编写规则

1.1.1 什么是持久化类:

       Hibernate 是持久层的ORM映射框架,专注于数据的持久化工作。所谓持久化,就是将内存中的数据永久的存储到关系型数据库中。那么知道了什么是持久化,那么什么是持久化类呢?其实就所谓的持久化类指的是一个Java类与数据库表建立了映射关系,那么这个类就是持久化类。其实你可以简单的理解为持久化类就是一个java类有了一个映射文件与数据库的表建立了关系。那么我们在编写持久化类的时候有哪些要求的?接下来我们看一下:

1.1.2 持久化类的编写规则:      

1.2 主键生成策略

1.2.1 主键的分类

1.2.1.1 自然主键
*自然主键:主键的本身就是 表中的一个字段(实体中的一个属性)
    *创建一个人员表,人员都会有一个身份证号(唯一的不可重复的),使用了身份证作为主键,这种主键称之为自然主键。
1.2.1.2 代理主键
*代理主键:主键的本身不是表中必须的一个字段(不是实体中的某个具体的属性)
    *创建一个人员表,没有使用人员中的身份证号,用了一个与这个表不不相关的字段ID,(PNO)。这种主键称之为代理主键。
*在实际开发中,尽量使用代理主键
    *一旦自然主键参与到业务逻辑中,后期可能需要修改源代码。
    *好的程序设计满足OCP原则:对程序的扩展是OPEN的。对修改源码是CLOSE的。

1.2.2 主键的生成策略

1.2.2.1 Hibernate的主键生成策略

    在实际开发中一般不允许用户手动设置主键,一般将主键交给数据,手动编写程序进行设置。在Hibernat为了减少程序的编写,提供了多种主键生成策略。

 

1.3持久化类的三种状态
Hibernate是持久层框架,通过持久化类完成ORM操作。Hibernate为了更好的管理持久化类,将持久化类分为3中状态。

持久化类=java类+映射。    

1.3.1 瞬时态

*这种对象没有唯一的表示OID,没有被Session管理,称为持久态对象。

1.3.2持久态

*这种对象有唯一的表示OID,被Session管理,称为持久态对象。
        *持久化类的持久态的对象,可以自动更新数据库。

1.3.3脱管态

这种对象有唯一的标识,没有被session管理,称为脱管态对象。

区分对象的三种状态,代码实例:

	@Test
	public void Demo1() {
		Session session=HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer customer=new Customer();//瞬时态对象:没有唯一表示的OID,没有被session管理
		customer.setCust_name("李四");
		Serializable id = session.save(customer);//持久态对象:有唯一的标识OID,被session管理
		session.get(Customer.class, id);
		
		transaction.commit();
		session.close();
		
		System.out.println(customer.getCust_name());//托管态对象:有持久化标识的OID,没有被session管理
	}

1.4 持久化类三种状态的相互转换

1.4.1三种状态的转换图

1.4.2瞬时态对象

    *获得
        *Customer customer=new Customer();
    *状态转换
        *瞬时->持久
            *save(Object obj) ,saveOrUpdate(Object obj)
        *瞬时->托管 
            *customer.setCust_id(1)
            
1.4.3持久态对象

    *获得
        *get(),load(),find(),iterate(),
        *Customer customer=session.get(Customer.class,1)
    *状态转换
        *持久->瞬时
            *delete()
        *持久->托管
            *close(),clear(),evict(Object obj),

1.4.4脱管态对象

    *获得
        *Customer customer=new Customer();
        *customer.setCust_id(1);
    *状态转换
        *托管->持久
            *update(),saveOrUpdate(Object obj);
        *托管->瞬时
            *customer.setCust_id(null);

1.5 持久态对象特性

1.5.1持久化类持久态对象自动更新数据库

	@Test
	public void Demo2() {
		Session session=HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer customer = session.get(Customer.class, 1l);
		customer.setCust_name("王五");
//		session.update(customer);//无需写update语句
		
		transaction.commit();
		session.close();
		
		System.out.println(customer.getCust_name());//托管态对象:有持久化标识的OID,没有被session管理
	}

1.6 Hibernate的一级缓存

1.6.1什么是缓存
缓存:是一种优化的方式,将数据存入到内存中,使用时直接从内存中获取,不用通过存储源

1.6.2 Hibernate 的缓存

1.6.2.1 Hibernate的一级缓存

Hibernate框架中提供了优化的手段,缓存,抓取策略。Hibernate中提供了两种缓存机制,一级缓存、二级缓存。
Hibernate的一级缓存:称为是Session级别的缓存,一级缓存的生命周期与Session一致(一级缓存是由session中一系列的java集合构成)。一级缓存是自带不可卸载的。(Hibernate的二级缓存是SessionFactory级别的缓存,需要配置的缓存)。

1.6.2.2 证明一级缓存的存在

	public void Demo3() {
		Session session=HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		
		Customer customer1 = session.get(Customer.class, 1l);//发送sql语句
		System.out.println(customer1);
		Customer customer2 = session.get(Customer.class, 1l);//不发送sql语句
		System.out.println(customer2);

		Customer customer=new Customer();
		customer.setCust_name("凤姐");
		session.save(customer);
		
		Customer customer3 = session.get(Customer.class, 1l);//不发送sql语句
		System.out.println(customer3);
		
		transaction.commit();
		session.close();
	}

1.6.3 HIbernate一级缓存的结构

1.6.3.1 一级缓存中特殊区域:快照区

session.clear()是清空所有一级缓存

session.evict()是清空一个缓存

1.7 Hibernate的事务控制

1.7.1什么是事务

1.7.2 事务特性

事务有严格的定义,需要同时满足四个特性,既原子性、一致性、隔离性、持久性。这四个特性通常称之为ACID特性,具体如下:

1.7.3 如果不考虑隔离理性,会引发安全问题(事务的并发问题)

1.7.4事务的隔离级别

1.7.5 Hiberate中的事务管理

1.7.6事务的应用场景

事务的控制应该是在service层实现的,而不是在DAO层实现的,并且在Service中调用一个DAO实现一个业务逻辑的操作。.

在hibernate.cfg,xml中进行如下操作:

		 <!-- 指定session与当前线程绑定 -->
		 <property name="hibernate.current_session_context_class">thread</property>

Hibernate提供sessionFactory.getCurrentSession()创建一个session和ThreadLocal绑定的方法。

在HibernateUtil工具类更改getCurrentSession方法:

public class HibernateUtils {

	public static final Configuration cfg;
	public static final SessionFactory sf;
	
	static{
		cfg = new Configuration().configure();
		sf = cfg.buildSessionFactory();
	}
	
	public static Session openSession(){
		return sf.openSession();
	}
	public static Session getCurrentSession(){
		return sf.getCurrentSession();
	}
}

1.8 HIbernate 的其他API

1.8.1 Query

//Query
	@Test
	public void demo01() {
		
		Session session=HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		//查询全部
//		String hql="from Customer";
		//模糊查询、条件查询     cust_name是属性名
//		String hql="from Customer where cust_name like ?";
		//分页查询
		String hql="from Customer";
		Query query=session.createQuery(hql);//通过session获得query接口
		//设置条件
//		query.setParameter(0, "王%");
		//设置分页
		query.setFirstResult(3);
		query.setMaxResults(3);
		
		List<Customer> list = query.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		transaction.commit();
	}

1.8.2 Criteria

//Criteria
	@Test
	public void demo2() {
		
		Session session=HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		//查询所有
//		Criteria criteria = session.createCriteria(Customer.class);
//		List<Customer> list = criteria.list();
		
		//条件查询
//		Criteria criteria = session.createCriteria(Customer.class);
//		criteria.add(Restrictions.like("cust_name", "李%"));
//		List<Customer> list = criteria.list();
		
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.setFirstResult(0);
		criteria.setMaxResults(3); 
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		transaction.commit();
	}

1.8.3 SQLQuery

SQLQuery用于接受SQL语句,特背复杂的情况下使用。

	//SQlQuery
	@Test
	public void demo4() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		/*String sql="select * from cst_customer";
		SQLQuery createSQLQuery = session.createSQLQuery(sql);
		List<Object[]> list = createSQLQuery.list();
		
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}*/
		
		String sql="select * from cst_customer";
		SQLQuery createSQLQuery = session.createSQLQuery(sql);
		//封装到对象中
		createSQLQuery.addEntity(Customer.class);
		List<Customer> list = createSQLQuery.list();
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值