Java中hibernate 主键类型 主键生成策略 三种状态 缓存与快照以及查询

2021-01-29 00:00:00 主键 快照 三种

实体类规范

    1.提供无参构造方法
    2.成员变量私有化 提供set/get方法 3.基本数据类型尽量使用包装类型(例如double 的 用Double) 4.实体中必须要提供一个与表中的主键对应的属性 id hibernate是通过主键来区别对象是否相同 5.不要使用final修饰实体类(代理对象是要继承该类的)

主键类型

    自然主键
    输入人的时候 人的身份证号码 保证了 非空不重复
    符合主键的特点
    但是身份证号 本身是业务字段 可以作为主键使用
    叫做自然主键

    代理主键(常用)
    找不到主键(没有业务字段符合主键规则)
    设置一个没有任何意义的主键id列 作为主键
    就是为了非空不重复 叫做代理主键

主键生成策略

    identity:主键自增 由数据库来维护主键
             录入的时候不需要指定主键
    increment: 主键自增 由hibernate来维护主键
               每次插入钱会先查询表中id最大值+1作为新主键
              效率不高 每次都要查询 如果多人同时保存 可能会出现线程问题

    sequence: Oracle中的主键生成策略 序列

    hilo: 高低位算法(数据库中的主键自增算法原理)
          由hibernate来维护主键

    native: hilo + sequence + identity 自动三选一
            MySQL就是identity Oracle就是sequence
    uuid: 产生一个随机的字符串作为主键 主键类型必须为String类型
    assigned: 自然主键生成策略 hibernate不会管理 由开发人员自己录入

三种状态

    三种状态
    1.瞬时态 没有id 没有和session关联
    2.持久态 有id 有关联
    3.游离态 有id 没有关联
    结论:就是将我们想要同步到数据库的数据 所对应的对象转换成持久态

《Java中hibernate 主键类型 主键生成策略 三种状态 缓存与快照以及查询》

一级缓存与快照

缓存原理

《Java中hibernate 主键类型 主键生成策略 三种状态 缓存与快照以及查询》

快照原理

《Java中hibernate 主键类型 主键生成策略 三种状态 缓存与快照以及查询》

指定事务的隔离级别

    specify a JDBC isolation level
    hibernate.connection.isolation 1|2|4|8 表示隔离级别(用一个级别表示)
    1.脏读
    2.可重复读
    3.幻读
    READ UNCOMMITTED
    READ COMMITTED
    REPEATABLE READ
    SERIALIZABLE
    <property name="hibernate.connection.isolation">4</property>

    设置可以获取当前session 与当前线程绑定的 -->
    <property name="hibernate.current_session_context_class">thread</property>
    测试获取同一个session

    注意:
    1.配置配置文件
    2.调用getCurrentSession获取session 当事务提交 session会自动关闭 不需要手动关闭

hibernate查询

HQL查询

    查询所有对象
    String HQL = "from User";  跟着的是类名 项目里 只有
    按条件查询 HQL不会出现表中字段  id 代表的是属性名
    String HQL = "from User where id = 1";
    查询方法
    Query query = session.createQuery(HQL);
    返回结果(预见结果)
    集合 list()
    单个 uniqueResult()

问号?占位符


    因为面向对象的查询 这里的id 指的是 实体类中的属性名 
    String HQL = "from User where id = ? and username = ?";
    Query query = session.createQuery(HQL); 
    赋值参数的时候 参数1 占位符的索引  注意:HQL索引从0开始的
    query.setParameter(0, 2);
    query.setParameter(1, "www1");

冒号占位符

    // 冒号后面 相当于给再过冒号占位符 起了一个别名
    // 注意: 冒号后面不要加空格
    String hql = "from User where id = :ww";

    Query query = session.createQuery(hql);
    // 直接使用别名 给占位符 赋值
    query.setParameter("ww", 1);
    System.out.println(query.uniqueResult());

    User user = (User) query.uniqueResult();
    System.out.println(user);

分页查询


    String HQL = "from User"; 
    Query query = session.createQuery(HQL); 
    limit ?,? 相同 起始 和 最大显示
    query.setFirstResult(2);
    query.setMaxResults(2);

Criteria无语句查询(单表查询)


    Criteria criteria = session.createCriteria(User.class);
    List<User> list = criteria.list();
    需要预见结果 使用单对象返回
    User user = (User) criteria.uniqueResult(); 
    System.out.println(user);

    添加查询条件
    criteria.add(Restrictions.eq("id", 2));
    User user = (User) criteria.uniqueResult();
    System.out.println(user);


   HQL运算符                   QBC运算符                         含义
      =                    Restrictions.eq()                  等于
      >                    Restrictions.gt()                  大于
      >=                   Restrictions.ge()                  大于等于
      <                    Restrictions.lt()                  小于
      <=                   Restrictions.le()                  小于等于
      is null              Restrictions.isnull()              等于空值
      is not null          Restrictions.isNotNull()           非空值
      like                 Restrictions.like()                字符串模式匹配
      and                  Restrictions.and()                 逻辑与
      or                   Restrictions.or()                  逻辑或
      not                  Restrictions.not()                 逻辑非
      in(列表)              Restrictions.in()                  等于列表中的某一个值
      between x and y      Restrictions.between()             闭区间xy中的任意值


    查询总行数
    criteria.setProjection(Projections.rowCount());
 ```
#### 原生sql查询(复杂的多表查询)
 ```

    String sql = "select * from user where id=?";
    SQLQuery query = session.createSQLQuery(sql);
    query.setParameter(0, 3);
    预见返回结果集
    注意:返回数据的类型

    原文作者:稳健de少年
    原文地址: https://blog.csdn.net/Ssssssue/article/details/79873205
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章