Hibernate详解

主键

使用hibrenate操作数据库必须有主键
1.主键类型
(1.自然主键
  例如: 人的身份证号 保证了 非空不重复 符合主键的贴点
  并且身份证号  本身是业务字段 可以作为主键使用 叫做自然主键
(2.代理主键(常用)
  找不到主键(没有业务字段符合主键规则)
  写一个没有任何意义的主键id列 作为主键 就是为了非空不重复 叫做代理主键
2.主键生成策略(7个)
 identity: 主键自增 由数据库维护 插入数据无id
 increment: 主键自增 但是由hibernate维护 会先查询最大的id 
 然后在这个最大的id的基础上+1 并且插入数据时有id
 sequence: 序列
 hilo: 高低位算法(hibernate会自己通过该算法 算出主键自增)
 native:(常用) identity + hilo + sequence 三选一 
 系统会检测你的数据库类型 mysql就是自增策略
 uuid: 全球范围内 不重复的值 是字符串
 注意: 主键必须是字符串类型 是由hibernate生成uuid 插入数据库中
 assigned:是由程序员自己管理主键

指定事物的隔离级别和获取当前session

3.事物的隔离级别
通过hibernate 来设置事物的隔离级别
    1.脏读
    2.可重复读
    3.幻读
    READ UNCOMMITTED 读未提交  123               1
    READ COMMITTED   读已提交   23               2  
    REPEATABLE READ  可重复读    3               4
    SERIALIZABLE     串行化(只能一个一个访问)     8

    指定事物的隔离级别(去hibernate中etc里面找)
    specify a JDBC isolation level
    hibernate.connection.isolation 1|2|4|8
    隔离级别是用一个字节存储的
    0001
    0010
    0100
    1000
    <!--设置事物的隔离级别-->
    <property name="hibernate.connection.isolation">4</property>

    设置可以获取当前session 与当前线程绑定的
    <!-- 使用getCurrentSession 必须配置一下 
         注意:当你使用getCurrentSession时
         不需要你手动关闭session 系统会帮你关闭
    -->
<property name="hibernate.current_session_context_class">
thread</property>

hibernate三种状态

(1.瞬时态 没有id 没有和session关联
(2.持久态 有id 有关联
(3.游离态 有id 没有关联

这里写图片描述

hibernate的缓存与快照

hibernate的缓存
hibernate的快照

hibernate的查询

5.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 = :ww1 and username = :ww2";

分页查询
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);
预见返回结果集
注意:返回数据的类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值