Hibernate - 3

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只提供规范(接口),需要第三方实现类。外置缓存有成为二级缓存。

二级就是由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语句进行查询




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值