zoukankan      html  css  js  c++  java
  • 【Hibernate】Re01.5 API

    1、Session单表的CRUD操作

    1、增加或者修改,使用同一个方法,或者下面的两个也行:

    感觉多此一举。。。

    2、删除方法,硬删除:

    3、获取方法提供了两种,Get & Load

    get方法

    load方法

    2、Get 和 Load 的区别?

    使用get方法获取,如果查询的数据不存在则直接返回Null,即空指针。

    如果使用Load方法获取,查询的数据不存在,则抛出异常。

    3、JavaBean在Hibernate的Session中的持久化生命周期

    一、瞬时状态

    ORM对象和数据库不存在关联,且对象在数据库中没有关联记录,该对象的状态为瞬时状态。对象会被GC回收

    二、持久状态

    Bean与Session关联,被Session管理的情况下,该对象状态为持久状态。

    也就是通过上述的Get,Load方法得到对象。调用save方法存入的对象也会被Session关联,变为持久状态

    三、游离状态

    脱离Session管理的bean对象,该对象状态即为游离状态

    4、DirtyCheck 脏检查?

    对象的属性发生变化的,称为脏对象,脏检查也就是对前面描述的对象进行检查

    如果发现了脏变化,对象的属性发生改变,Session也要对应的将改变更新到数据库中,保证数据一致

    5、FlushCache 缓存刷新

    触发脏检查的方式就是刷新缓存,Session刷新的方式有两种,在commit提交的时候触发,二是手动调用flush方法触发

    6、更新方法API详细

    虽然说save也可以用来作更新操作,因为有OID就行,但是Hibernate还是提供了对应的更新方法

    update 将游离状态的对象恢复持久状态,同时进行数据库更新操作,如果OID不存在则抛出异常

    saveOrUpdate 包含save和update方法,参数是游离状态的对象就调用update执行

    merge 将参数的游离状态对象复制属性到一个拥有相同OID的持久状态对象,通过对持久状态对象的脏检查进行更新操作,并返回

    7、唯一结果 UniqueResult方法

     查询返回的多个记录可以被List集合或者Iterator迭代器对象封装

    二者皆可以被遍历处理,但是只有一个结果的情况,可以不需要集合对象处理,直接调用这个就行了

    要注意的是,如果返回的结果不唯一,则Hibernate会抛出异常:NonUniqueResultException

    8、分页与投影查询

    一些分页需要的数据,使用Hibernate获取代码片段:

    @Test
    public void hibernatePaging() {
    
        Session session = HibernateUtil.getSession();
    
        final String HQL_STATEMENT = "FROM xx.xx.xxx.DomainClass";
    
        final Integer pageIndex = 10;
        final Integer pageSize = 20;
    
        Query<Object> totalCountQuery = session.createQuery(HQL_STATEMENT, Object.class);
        long count = totalCountQuery.stream().count();
        Integer totalPage = new Long((count % pageSize == 0) ? (count / pageSize) : (count /pageSize + 1)).intValue();
    
        Query<Object> pageListQuery = session.createQuery(HQL_STATEMENT, Object.class);
    
        pageListQuery.setFirstResult( (pageIndex - 1) * pageSize );
        pageListQuery.setMaxResults( pageSize );
    
        List<Object> objectList = pageListQuery.list();
    }

    一般来说封装的分页对象:

    package cn.zeal4j.model;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import java.util.List;
    
    /**
     * @author Administrator
     * @file IntelliJ IDEA Hibernate-Tutorial
     * @create 2020 09 26 19:10
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class PageModel<Entity> {
        private Integer pageIndex;
        private Integer pageSize;
        private Long totalCount;
        private Integer totalPage;
        private List<Entity> pageList;
        
        public void setTotalPage(Long totalCount) {
            totalPage = new Long((totalCount % pageSize == 0) ? 
                    (totalCount / pageSize) : (totalCount /pageSize + 1)).intValue();
        }
    }

    使用分页模型处理:

    只是写了一个大概的蓝图,实际操作再看吧

    @Test
    public void hibernatePaging2() {
        // 参数
        int index = 2;
        int size = 20;
        // 复杂一些还需要查询条件也封装进去才行,这里就不设置了
        final String HQL_STATEMENT = "FROM xx.xx.xxx.DomainClass";
    
        Session session = HibernateUtil.getSession();
    
        Query<Object> query = session.createQuery(HQL_STATEMENT, Object.class);
        
        long count = query.stream().count();
    
        PageModel<Object> pageModel = new PageModel<>();
        
        pageModel.setPageIndex(index);
        
        pageModel.setPageSize(size);
        
        pageModel.setTotalCount(count);
        
        pageModel.setTotalPage(count);
        
        query.setFirstResult( (pageModel.getPageIndex() - 1) * pageModel.getPageSize() );
        query.setMaxResults( pageModel.getPageSize() );
    
        List<Object> objectList = query.list();
        
        pageModel.setPageList(objectList);
        
        // 业务就可以返回这个包装的分页模型对象了
        // return pageModel;
    }
    

    9、投影查询

    数据的展示并不需要全部获取,只是部分的属性,或者使用表达式、函数、等获取结果

    可以使用投影函数。有三种情景适用:

    1、每条结果仅包含一个字段列,查询的结果泛型可以直接返回那个字段的类型

    2、或者多个字段列,查询的结果泛型可以直接返回Object数组

    3、结果通过构造器封装成对象,查询的结果就是映射的实体类对象

    发现构造器查询是这样的。。。眼睛已经瞎掉了。。。

  • 相关阅读:
    H.264编码之DCT变换原理
    颜色空间转换
    jdbc 大数据存储 图片读取
    spring 事务配置
    Cglib代理
    jdk代理
    spring装配bean
    map 常用方法
    list map set常用方法之list
    calendar 类 用法
  • 原文地址:https://www.cnblogs.com/mindzone/p/13735678.html
Copyright © 2011-2022 走看看