一口气写了hibernate配置文件加载和查询方式的总结,累死了~~
(1)SESSION接口
<1>save
Tuser user=new Tuser();
user.setName("junmine");
session.save();
<2>get
Tuser user=(Tuser)session.get(TUser.class,new Integer(1));
<3>delete
Tuser user=(Tuser)session.get(TUser.class,new Integer(1));
session.delete(user);
或者(HQL)
session.delete("from TUser where id=1");
<4>find(H2)
session.find(hql)
注:1.在H3中取消了find()方法,必须通过Query或Criteria接口进行查询(下面会介绍)
2.get()与find()的不同在于参数,效果应该是一样的
(2)Query接口(面向HQL和Native SQL)
注:在H3之前,HQL仅用于数据查询;H3中,允许更新和删除
HQL<查询>
List list=session.createQuery("select user.name,user.age from TUser as user").list();
Iterator it=list.iterator();
while (it.hasNext()){
Object[] results=(Object[])it.next();
System.out.println(results[0]);
System.out.println(results[1]);
}
更符合面向对象风格,就用:
List list=this.session.createQuery("select
new TUser(user.name,user.age) from TUser as user").list();
Iterator it=list.iterator();
while (it.hasNext()){
TUser user=(TUser)it.next();
System.out.println(user.getName());
}
注:在查询结果中TUser对象仅仅是一个普通的JAVA对象,仅用于查询结果的封装,除了在构造时赋予的属性值外,其他属性均未赋予,如user.id为NULL.这意味着,我们无法通过Session对此对象进行更新
<更新>
Strig hql="update TUser set age=18";
Query query=session.createQuery(hql);
query.executeUpdate();
<删除>同上
Native SQL:
String sql="select {usr.*} from T_User usr";
//指定实体对象别名为usr,对象类型为TUser.class
List list=session.createSQLQuery(sql,"usr",TUser.class).list();
Iterator it=list.iterator();
......
(3)Criteria接口(面向对象查询模式,将数据查询条件封装为一个对象)
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression....);//增加指定条件(H3中,引入Restrictions类作为Expression的替代
List list=criteria.list();
for(int i=0;i<list.size();i++){
TUser user=(TUser)list.get(i);
System.out.println("User["+i+"]/t"+user.getName());
}
复合查询:
Criteria criteria=session.createCriteria(TUser.class);//查询所有用户的信息
Criteria addcritera=criteria.createCriteria("address");
//字段address为shangtai的记录
addcritera.add(Expression.like("address","%shangtai%"));
List list=criteria.list();
for(int i=0;i<list.size();i++){
System.out.println("User["+i+"]");
TUser user=(TUser)list.get(i);
System.out.println("/t"+user.getName());
Set addrSet=user.getAddresses();
Iterator it=addrSet.iterator();
while(it.hasNext())
{
TAddress addr=(TAddress)it.next();
System.out.println(addr.getAddress());
}
}
Criteria生命周期位于宿主Session生命周期之内,一旦Session销毁,Criteria实例也随之失效(若在其他地方需要同样的查询得重写份一样的代码)
DetachedCriteria可以脱离Session实例而独立存在,在需要时绑定Session,可解决上述问题
DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression...);
Criteria criteria=deCriteria.getExcutableCriteria(session);
Iterator it=criteria.list().iterator();
.......