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);
预见返回结果集
注意:返回数据的类型
原文作者:稳健de少年
原文地址: https://blog.csdn.net/Ssssssue/article/details/79873205
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/Ssssssue/article/details/79873205
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章