Transaction(事务)接口
这个接口是很重要的,因为hibernate对数据库的实现都是事务的处理方式,学习笔记(三)也写明了使用的模板
1.Transaction是底层的事物实现中抽象出来的接口
2.可能是一个jdbc或者jta的事务,这样有利于hibernate在不同执行环境的移植。
3.hibernate要求显示的调用事务(如果仅仅是查询可以不调用.)
要注意提交(commit)之前如果发生异常,要注意事务的回滚(roll back),详见学习笔记(三)
Query接口
前边也可以查询操作,但是只能用主键查询,这个显然是不够的,所以需要Query接口
Query接口类型的对象可以对数据库操作,它可以使用Hql,Qbc,Qbe和原生SQL(native Sql)对数据库操作.官方推荐使用Hql语句。Query接口查询出来的结果是一个List接口类型的对象。
可以在main函数里写一个Query的测试代码:
Session session=HibernateUtil.getCurrentSession();
Transaction ts=null;
try {
ts=session.beginTransaction();
//获取query引用[这里 Employee不是表.而是domain类名]
//[where 后面的条件可以是类的属性名,也可以是表的字段,按照hibernate规定,
//我们还是应该使用类的属性名.]
Query query=session.createQuery("from Employee where namehsp='shunping'");
//通过list方法获取结果,这个list会自动的将封装成对应的domain对象
//所以我们jdbc进行二次封装的工作没有.
List<Employee> list=query.list();
for(Employee e: list){
System.out.println(e.getAaaid()+" "+e.getHiredate());
}
ts.commit();
} catch (Exception e) {
if(ts!=null){
ts.rollback();
}
throw new RuntimeException(e.getMessage());
}finally{
//关闭session
if(session!=null&&session.isOpen()){
session.close();
}
}
注意这里的查询语句不再是我们以前使用的sql语句了,后边会详细讲解说明,注意from后边的并不是像以前一样的表名,而是我们对象的名字,因为还是直接操作对象来实现对数据库的操作。
Criteria接口
除了Query接口外,hibernate还提供了另一个查询的接口,这就是Criteria接口,但是这个并不是官方推荐的。
代码示例:
<span style="font-size:18px;">Session session=HibernateUtil.getCurrentSession();
Transaction ts=null;
try {
ts=session.beginTransaction();
Criteria cri=session.createCriteria(Employee.class).
setMaxResults(2).addOrder(Order.desc("id") );
List<Employee> list=cri.list();
for(Employee e: list){
System.out.println(e.getAaaid());
}
ts.commit();
} catch (Exception e) {
if(ts!=null){
ts.rollback();
}
throw new RuntimeException(e.getMessage());
}finally{
//关闭session
if(session!=null&&session.isOpen()){
session.close();
}
}</span>
主要是使用Query,Criteria使用的还是比较少的。