1.持久化类
指的是一个java类与数据库表建立了映射关系,那么这个类被称为持久化类.
编写规则:
- 需要提供无参构造
- 属性需要私有,对私有属性提供公有的get和set方法
- 属性要尽量使用包装类型
- 要有一个唯一标识OID与表的主键对应
不要使用final修饰
2主键生成策略
- 代理主键生成策略
increment:(测试环境)主键自增,hibernate负责,每次保存前查询表中id最大值,加1作为新的主键值.
identity:主键自增.依赖于数据库主键自增.(MYSQL)
sequence:使用数据库中的序列来生成主键值.
hilo: high+low.高低位算法.hibernate负责主键自增.
native:自动三选一.自动从 identity|sequence|hilo 选一个.
uuid:使用uuid生成随机字符串作为id值.
- 自然主键生成策略
assigned : 手动设置主键值.
3.对象的三种状态
- 瞬时状态:没有id值,没有与session关联
- 持久状态:有id值,与session关联
- 脱管|游离状态:有id值,没有session关联
4.hibernate一级缓存
缓存:暂时存放一些数据,目的是为了提高效率
hibernate一级缓存:就是在session对象中放置了一个Map集合作为缓存.提高查询和修改效率.
* 查询流程
* 先从缓存中查询是否存在当前要查的对象
* 1.缓存中存在 => 直接返回缓存中的对象
* 2.缓存中不存在 => 查询数据库 => 将查询结果放入缓存中. => 返回缓存中的对象
*/
快照:
*查询时缓存中不存在查询对象 => 查询数据库,将返回结果一式两份封装为两个对象.
* 一个对象放入缓存集合.一个对象放入快照集合.返回缓存集合的.=> 提交事务时,
* hibernate会将缓存与快照中的两个对象进行比对.
* 1.比对属性值一致 => 什么也不做
* 2.比对属性值不一致 => 将缓存的同步到数据库
*/
5.hibernate批量查询
HQL (Hibernate Query Language)
hibernate查询语言:hibernate独创的面向对象的查询语言.语法上很大程度参照了SQL语法.学习成本比较低.
- 基本查询:
//String hql="select c from Customer c";
String hql="from Customer";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//执行查询并接收结果
List<Customer> list = query.list();
- 条件查询
String hql="from Customer where cust_name like ?";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//传入查询参数
query.setParameter(0,"%李峰涛%");
//执行查询并接收结果
List<Customer> list = query.list();
----------------------------------------------
String hql="from Customer where cust_name like :abc";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//传入查询参数
query.setParameter("abc","%李%");
//执行查询并接收结果
List<Customer> list = query.list();
- 分页查询
String hql="from Customer";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//传入查询参数
query.setFirstResult(4);
query.setMaxResults(4);
//执行查询并接收结果
List<Customer> list = query.list();
- 排序
//查询语句
String hql="from Customer order by cust_id desc";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//执行查询并接收结果
List<Customer> list = query.list();
- 聚合函数
//查询语句
//String hql="select max(cust_id) from Customer";
//String hql="select min(cust_id) from Customer";
//String hql=String hql="select max(cust_id) from Customer";
String hql="select avg(cust_id) from Customer";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//执行查询并接收结果
Number num = (Number)query.uniqueResult();
- 投影查询
- 某一列查询
//查询语句
String hql="select cust_name from Customer";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//执行查询并接收结果
List<String> list = query.list();
- 组合
//查询语句
String hql="select cust_id,cust_name from Customer";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//执行查询并接收结果
List<Object[]> list = query.list();
for (Object[] objects: list) {
System.out.print(Arrays.toString(objects));
}
- 查询结果存入对象
//查询语句
String hql="select new Customer(cust_id,cust_name) from Customer";
//创建查询对象
Session session = HibernateUtils.openSession();
Query query = session.createQuery(hql);
//执行查询并接收结果
List<Customer> list = query.list();
Criteria(Query By Criteria QBC)
- 基本查询
//创建查询对象
Criteria criteria = session.createCriteria(Customer.class);
//查询
List<Customer> list = criteria.list();
System.out.println(list);
- 条件查询
//创建查询对象
Criteria c = session.createCriteria(Customer.class);
//查询条件
c.add(Restrictions.like("cust_name", "%孟文杰%"));
//查询
List<Customer> list = c.list();
System.out.println(list);
- 分页查询
//创建查询对象
Criteria c = session.createCriteria(Customer.class);
//查询条件
c.setFirstResult(0);
c.setMaxResults(2);
//查询
List<Customer> list = c.list();
- 排序查询
//创建查询对象
Criteria c = session.createCriteria(Customer.class);
//排序查询
c.addOrder(Order.desc("cust_id"));
//查询
List<Customer> list = c.list();
- 聚合函数
//创建查询对象
Criteria c = session.createCriteria(Customer.class);
//聚合查询
//c.setProjection(Projections.max("cust_id"));
//c.setProjection(Projections.count("cust_id"));
c.setProjection(Projections.rowCount());
//查询
Number num = (Number)c.uniqueResult();
System.out.println(num);
- 离线查询
// web层创建离线查询对象
DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
// 设置查询条件
//dc.add(Restrictions.like("cust_name", "%孟%"));
dc.add(Restrictions.gt("cust_id", 9L));
//dao层获取session
Session session = HibernateUtil.openSession();
Transaction ts = session.getTransaction();
ts.begin();
//执行时转化为criteria
Criteria c = dc.getExecutableCriteria(session);
//查询
List<Customer> list = c.list();
System.out.println(list);