HQL 查询

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

实体类规范

实体类规范(javaBean规范):

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

主键生成策略(7种)

  • identity:主键自增 由数据库来维护主键 录入的时候不需要指定主键
  • ncrement:主键自增 由hibernate来维护主键 每次插入前会先查询表中 id最大值 +1 作为新主键
    效率不高 每次都要查询 如何10个人同时要保存 可能会出现线程问题
  • sequence:Oracle中的主键生成策略 序列
  • hilo:高低位算法(数据库中的主键自增算法原理) 由hibernate来维护主键 hibernate自己算一下(无意义)
  • native:hilo + sequence + identity 自动三选一 检测你是什么数据库
    mysql就identity Oracle就sequence 如果没有就 用hilo
    但是世界上没有一个 不支持自增和序列的数据库 其实就是 2选1
  • uuid:产生一个随机的字符串作为主键 主键类型必须为string类型
  • assigned:自然主键生成策略 (没策略) hibernate不会管理 由开发人员自己录入

主键类型

1.自然主键
输入人的时候 人的身份证号 保证了 非空不重复 符合主键的贴点
但是身份证号 本身是业务字段 可以作为主键使用 叫做自然主键
2.代理主键(常用)
找不到主键(没有业务字段符合主键规则)
搞一个没有任何意义的主键id列 作为主键 就是为了非空不重复 叫做代理主键

指定事务的隔离级别

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

设置可以获取当前session 与当前线程绑定的 –>
thread
测试获取同一个session
注意:
1.配置配置文件
2.调用getCurrentSession获取session 当事务提交 session会自动关闭 不需要手动关闭

Dao层

Dao层 增删改查
注册
事务开始(实际上事务就是处理业务逻辑—事务要跟service层开启和提交)
session.save(user);
事务提交

你可能感兴趣的:(JDBC)