hibernate(二)

1、实体类的编写规范

         遵循JavaBean的编写规范:

                   类是public

                   提供默认的无参构造函数

                   字段都是私有的

                   提供公有的get/set方法

                   一般都实现Serializable接口

         细节:

           基本类型和包装类的选择:

                   选择包装类。

2、Hibernate中的OID

(1)OID:

            对象标识符。Object Identifer

            是Hibernate用于区分两个对象是否是同一个的。

         OID的使用原则:

            让hibernate来维护OID。

211102_isrH_2892414.png

常用主键生成策略:

                   Hibernate维护OID是采用配置的方式。

                   配置的位置:

                            每个实体类的映射文件应该有独立的配置。

                   Hibernate提供的主键生成策略

                            native:***

                                     使用本地数据库自动增长的能力(会从identity,sequence,hilo中自动选择)

                            identity:[aɪ'dentətɪ]***

                                     使用本地数据库的字段自增长能力

                            sequence:[sɪːkwəns] ***

                                     使用本地数据库的序列自增长能力

                            increment ['ɪnkrɪmənt]:需要掌握和identity的区别

                                     由Hibernate先查询最大主键,再自加一。作为主键

                            uuid:

                                     使用128位UUID数作为主键。生成是由hibernate提供的算法

                            assigned [ə'saɪn]:有时候会用到

                                     指派,由程序员手动自己指定主键。

                            hilo:

                                     高低位算法。

211127_xbK5_2892414.png4

3、Hibernate一级缓存

         什么是缓存:

             就是内存中的一块区域,使我们在使用时先从此区域中查找,如果找到了就直接使用。

             找不到再去数据库中查询。从而提高效率。

         什么样的数据适用于缓存:

             非敏感数据可以使用缓存。

             敏感数据是不能使用缓存的。

             敏感数据:

                   数据必须是和数据库实时交互的,如果数据有错误(脏数据),会产生严重的后果。

                   例如:银行的汇率,股市的牌价,商品的库存。

         Hibernate的一级缓存指的是谁的缓存:

                   必须明确:

                            指的是Session对象的缓存。

                            Session对象一消失,一级缓存也跟着没有了。

         快照机制:

        211154_vNdV_2892414.png

        211205_rB23_2892414.png

4、Hibernate中对象的状态

         Hibernate把对象分为3个状态

         临时态:(瞬时态)

                   特点:

                      没有OID和Session没有关系。

         持久态:

                   特点:

                      有OID和Session有关系。

         脱管态:

                   特点:

                      有OID和Session没有关系。

         -------------------l

         删除态:(不用管)

                   特点:

                      有OID和Session有关系。同时必须已经调用的delete方法。

                      是即将从数据库中删除。

         注意:

            判断对象状态的标准,不以数据库中是否有记录作为依据。

         学它的作用:

            Hibernate中对对象的操作,都是把对象从一个状态转成了另一个状态。

            有助于我们更好掌握Hibernate中的操作方法。

        211232_gtaQ_2892414.png

5、Hibernate中常用的方法

         save和persist [pər'sɪst]方法

                   共同点:

                       都是把对象从临时态转成了持久态。

                   区别:

                      提供者不一样:

                            save的提供者是Hiberante框架

                            persist的提供者是JPA规范。(javax.persistence.API)

                      关于事务问题:

                            在手动不开启事务的前提下:

                                     save方法:会使用Hibernate内置事务来执行保存。(只涉及hibernate5版本)

                                     persist方法:根本什么都不做。

         update方法的问题:

                   a、当我们更新一个脱管态对象时,如果在一级缓存中有一个相同OID的对象,则会报错。

                      解决办法:使用merge方法。

                   b、当我们更新一个脱管态对象时,如果该对象已经被别的程序删除了,则会报错。

         saveOrUpdate方法

                   作用:

                      把对象转成持久态。

                      到底是调用save方法还是update方法,参考的是对象的状态。

                      如果是临时态对象,调用save。

                      如果是脱管态对象,调用update方法。

         merge方法:

                   作用:合并两个对象。要求类型一致,OID一样。

                         永远都是拿一级缓存之外的对象数据改变一级缓存之内的数据。

6、配置C3P0数据源

         配置步骤:

                   a、导入c3p0的jar包(3个)

                   b、在hibernate主配置文件中,告知Hibernate,使用的数据源提供商

                            <property name="hibernate.connection.provider_class">

                                     org.hibernate.connection.C3P0ConnectionProvider

                            </property>

7、解决Session使用原则

         把session绑定到当前线程上。

         在Hibernate中是通过配置的方式实现。

         配置步骤:

                   a、在主配置文件中添加如下配置

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

                   b、在获取Session时,使用如下方法

                            factory.getCurrentSession();

                            但是如果在主配置文件中没有配置的话,取不出来

8、Hiberante中常用查询对象的基本使用

         Query:

                   使用HQL语句查询

package cn.itcast.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

public class QueryTest {
	@Test
	//查询所有记录
	public void test01(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//查询所有记录
		Query query = session.createQuery("from Customer");
		List<Customer> list = query.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	
	@Test
	//单一条件查询
	public void test02(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//单一条件查询
		Query query = session.createQuery("from Customer where cust_name=?");
		query.setString(0, "传智播客");
		List<Customer> list = query.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	
	@Test
	//多条件查询
	public void test03(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//多条件查询
		Query query = session.createQuery("from Customer where cust_name=? and cust_source=?");
		query.setString(0, "传智播客");
		query.setString(1, "网络");
		List<Customer> list = query.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	@Test
	//分页查询
	public void test04(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//分页查询
		Query query = session.createQuery("from Customer");
		query.setFirstResult(1);
		query.setMaxResults(1);
		List<Customer> list = query.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	
	@Test
	public void test05(){
		Session session1 = HibernateUtils.getCurrentSession();
		Session session2 = HibernateUtils.getCurrentSession();
		System.out.println(session1==session2);
	}
}

Criteria:

                   QBC查询,它是一种更加面向对象的查询方式。HQL能实现的,它都可以实现。相反也一样。

package cn.itcast.test;

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

public class CriteriaTest {
	@Test
	//查询所有记录
	public void test01(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//操作:查询所有记录
			//获取Criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		List<Customer> list = criteria.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	@Test
	//单一条件查询
	public void test02(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//操作:单一条件查询
			//获取criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.add(Restrictions.eq("cust_name", "传智播客"));
		List<Customer> list = criteria.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	@Test
	//多条件查询
	public void test03(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//操作:单一条件查询
		//获取criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.add(Restrictions.eq("cust_name", "传智播客"));
		criteria.add(Restrictions.eq("cust_source", "网络"));
		List<Customer> list = criteria.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
	@Test
	//分页查询
	public void test04(){
		//获取session对象
		Session session = HibernateUtils.openSession();
		//开启事务
		Transaction tx = session.beginTransaction();
		//操作:单一条件查询
		//获取criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		criteria.setFirstResult(1);
		criteria.setMaxResults(2);
		List<Customer> list = criteria.list();
		System.out.println(list);
		//提交事务
		tx.commit();
		//释放资源
		session.close();
	}
}

SQLQuery:

                   使用原始SQL语句查询

转载于:https://my.oschina.net/changenow/blog/785285

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值