HQL
1.查询所有:
Query query = session.createQuery("from two.Customer");
List<Customer> allCustomer = query.list();
2.选择查询:
//1 指定数据,cid OID名称
// Query query = session.createQuery("from Customer where cid = 1");
//2 如果使用id,也可以(了解)
// Query query = session.createQuery("from Customer where id = 1");
//3 对象别名 ,格式: 类 [as] 别名
// Query query = session.createQuery("from Customer as c where c.cid = 1");
//4 查询所有项,mysql--> select * from...
Query query = session.createQuery("select c from Customer as c where c.cid = 1");
Customer customer = (Customer) query.uniqueResult();
3.投影查询:
//1 默认
//如果单列 ,select c.cname from,需要List<Object>
//如果多列,select c.cid,c.cname from ,需要List<Object[]> ,list存放每行,Object[]多列
// Query query = session.createQuery("select c.cid,c.cname from Customer c");
//2 将查询部分数据,设置Customer对象中
// * 格式:new Customer(c.cid,c.cname)
// * 注意:Customer必须提供相应的构造方法。
// * 如果投影使用oid,结果脱管态对象。
Query query = session.createQuery("select new Customer(c.cid,c.cname) from Customer c");
List<Customer> allCustomer = query.list();
for (Customer customer : allCustomer) {
System.out.println(customer.getCid() + " : " + customer.getOrderSet().size());
}
4.排序:
//3排序 ,mysql--> select... order by 字段 [asc]|desc ,....
5.分页:
Query query = session.createQuery("from Customer");
// * 开始索引 , startIndex 算法: startIndex = (pageNum - 1) * pageSize;
// *** pageNum 当前页(之前的 pageCode)
query.setFirstResult(0);
// * 每页显示个数 , pageSize
query.setMaxResults(2);
6.绑定参数:
/* 6 绑定参数
* 方式1:占位符,使用? 在hql语句替换具体参数
* 设置参数 query.setXxx(int , object)
* 参数1:?位置,从0开始。
* 参数2:实际参数
* 例如:String --> query.setString(int,String)
* 方式2:别名 , 格式 “属性= :别名 ”
* 设置参数 query.setXxx(String,object)
* 参数1:别名
* 参数2:实际参数
* 例如:Integer --> query.setInteger(String,Integer)
* 提供公共设置方法
* setParameter(int|string , Object)
*/
//方式1
// Query query = session.createQuery("from Customer where cid = ?");
// query.setInteger(0, cid);
//方式2
Query query = session.createQuery("from Customer where cid = :xxx");
// query.setInteger("xxx", cid);
query.setParameter("xxx", cid);
事物
l 事务:一组业务操作,要么全部成功,要么全部不成功。
l 特性:ACID
原子性:整体
一致性:数据
隔离性:并发
持久性:结果
l 隔离问题:
脏读:一个事务读到另一个事务未提交的内容
不可重复读:一个事务读到另一个事务已提交的内容(insert)
虚读(幻读):一个事务读到另一个事务已提交的内容(update)
l 隔离级别--解决问题
read uncommittd,读未提交。存在3个问题。
read committed,读已提交。解决:脏读。存在2个问题。
repeatable read ,可重复读。解决:脏读、不可重复读。存在1个问题。
serializable,串行化。单事务。没有问题。
二级缓存
1.二级缓存
l hibernate 提供缓存机制:一级缓存、二级缓存
一级缓存:session级别缓存,在一次请求中共享数据。
二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
l SessionFactory的缓存两部分: 内置缓存:使用一个Map,用于存放配置信息,预定义HQL语句等,提供给Hibernate框架自己使用,对外只读的。不能操作。
外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。外置缓存有成为二级缓存。
l 二级就是由4部分构成
n 类级别缓存
n 集合级别缓存
n 时间戳缓存
n 查询缓存(二级缓存的第2大部分,三级缓存)
2.并发访问策略
3.应用场景
l 适合放入二级缓存中的数据:
很少被修改
不是很重要的数据, 允许出现偶尔的并发问题
l 不适合放入二级缓存中的数据:
经常被修改
财务数据, 绝对不允许出现并发问题
与其他应用数据共享的数据
4.配置
l hibernate.cfg.xml 配置
<!-- 9.2 提供商 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 9.3 确定缓存内容 -->
<!-- 类缓存 -->
<class-cache usage="read-write" class="com.itheima.a_init.Customer"/>
<class-cache usage="read-write" class="com.itheima.a_init.Order"/>
<!-- 集合缓存 -->
<collection-cache usage="read-write" collection="com.itheima.a_init.Customer.orderSet"/>
5.类缓存
6.集合缓存
7.时间戳
时间戳: 所有的操作都会在时间戳中进行记录,如果数据不一致,将触发select语句进行查询