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

实体类规范

    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 没有关联
    结论:就是将我们想要同步到数据库的数据 所对应的对象转换成持久态

这里写图片描述

一级缓存与快照

缓存原理

这里写图片描述

快照原理

这里写图片描述

指定事务的隔离级别

    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);
    预见返回结果集
    注意:返回数据的类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值