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