1、实体类的编写规范
遵循JavaBean的编写规范:
类是public
提供默认的无参构造函数
字段都是私有的
提供公有的get/set方法
一般都实现Serializable接口
细节:
基本类型和包装类的选择:
选择包装类。
2、Hibernate中的OID
(1)OID:
对象标识符。Object Identifer
是Hibernate用于区分两个对象是否是同一个的。
OID的使用原则:
让hibernate来维护OID。
常用主键生成策略:
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:
高低位算法。
4
3、Hibernate一级缓存
什么是缓存:
就是内存中的一块区域,使我们在使用时先从此区域中查找,如果找到了就直接使用。
找不到再去数据库中查询。从而提高效率。
什么样的数据适用于缓存:
非敏感数据可以使用缓存。
敏感数据是不能使用缓存的。
敏感数据:
数据必须是和数据库实时交互的,如果数据有错误(脏数据),会产生严重的后果。
例如:银行的汇率,股市的牌价,商品的库存。
Hibernate的一级缓存指的是谁的缓存:
必须明确:
指的是Session对象的缓存。
Session对象一消失,一级缓存也跟着没有了。
快照机制:
4、Hibernate中对象的状态
Hibernate把对象分为3个状态
临时态:(瞬时态)
特点:
没有OID和Session没有关系。
持久态:
特点:
有OID和Session有关系。
脱管态:
特点:
有OID和Session没有关系。
-------------------l
删除态:(不用管)
特点:
有OID和Session有关系。同时必须已经调用的delete方法。
是即将从数据库中删除。
注意:
判断对象状态的标准,不以数据库中是否有记录作为依据。
学它的作用:
Hibernate中对对象的操作,都是把对象从一个状态转成了另一个状态。
有助于我们更好掌握Hibernate中的操作方法。
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语句查询