Hibernate笔记2

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关联

Hibernate笔记2_第1张图片

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 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 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);

你可能感兴趣的:(Hibernate)