指的是一个java类与数据库表建立了映射关系,那么这个类被称为持久化类.
编写规则:
- 需要提供无参构造
- 属性需要私有,对私有属性提供公有的get和set方法
- 属性要尽量使用包装类型
- 要有一个唯一标识OID与表的主键对应
不要使用final修饰
- 瞬时状态:没有id值,没有与session关联
- 持久状态:有id值,与session关联
- 脱管|游离状态:有id值,没有session关联
缓存:暂时存放一些数据,目的是为了提高效率
hibernate一级缓存:就是在session对象中放置了一个Map集合作为缓存.提高查询和修改效率.
* 查询流程
* 先从缓存中查询是否存在当前要查的对象
* 1.缓存中存在 => 直接返回缓存中的对象
* 2.缓存中不存在 => 查询数据库 => 将查询结果放入缓存中. => 返回缓存中的对象
*/
快照:
*查询时缓存中不存在查询对象 => 查询数据库,将返回结果一式两份封装为两个对象.
* 一个对象放入缓存集合.一个对象放入快照集合.返回缓存集合的.=> 提交事务时,
* hibernate会将缓存与快照中的两个对象进行比对.
* 1.比对属性值一致 => 什么也不做
* 2.比对属性值不一致 => 将缓存的同步到数据库
*/
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
//查询语句
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 criteria = session.createCriteria(Customer.class);
//查询
List list = criteria.list();
System.out.println(list);
//创建查询对象
Criteria c = session.createCriteria(Customer.class);
//查询条件
c.add(Restrictions.like("cust_name", "%孟文杰%"));
//查询
List list = c.list();
System.out.println(list);
//创建查询对象
Criteria c = session.createCriteria(Customer.class);
//查询条件
c.setFirstResult(0);
c.setMaxResults(2);
//查询
List 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 list = c.list();
System.out.println(list);