当明白了Hibernate的原理和它在系统中的位置之后,最为重要的就是应用对数据增、删、改、查操作,一一介绍,以作记录
使用spring + hibernate框架中,一般使用HibernateTemplate来使用Hibernatet
1.保存数据
如果是继承HibernateDaoSupport来使用hibernate
(1) HibernateTemplate.save()方法可以保存一条记录
(2) HibernateTemplate.saveOrUpdate()方法可以根据ID判断记录是否存在,此时应该指定ID,否则作用同save()方法
测试发现
(3) HibernateTemplate.getSession().saveOrUpdate(user);
(4) HibernateTemplate.getSession().save(user);
这两种方法,都与HibernateDaoSupport.save()作用相同
以上几种方法在执行之后,对象会被持久化到数据库,对象的标识(identifier)属性,一般是ID,会发生变化,如果字段属性为自动增长的话,对象的标识属性值就是新纪录的id值。
2.修改数据
(1) HibernateDaoSupport.update()方法可以根据指定的id,更新纪录
(2) Session.createQuery()或Session.createSQLQuery()也可以实现,并且可以指定多个条件
createQuery()用法例如:
Query query = this.getSession().createQuery("update User set password=? where name=? and address=?");
query.setString(0, "abcdefg");
query.setString(1, "xxxx");
query.setString(2, "BeiJing");
query.executeUpdate();
createSQLQuery()用法例如:
Query query = this.getSession().createSQLQuery("update user set password=? where name=? and address=?");
query.setString(0, "4H8)&$5<.");
query.setString(1, "xxxx");
query.setString(2, "BeiJing");
query.executeUpdate();
其实createQuery()里面使用的是HQL,而createSQLQuery()里面使用的SQL, 但有一次误操作在createSQLQuery()里面粘贴了HQL也可以正确执行,并实现了更新操作。
3.删除数据
(1) HibernateTemplate..delete()方法可以按id删除一条记录,需要指定id
(2) HibernateTemplate.getSession().delete();方法没有删除指定的记录虽然指定了id,很奇怪
使用createQuery(),用HQL
String hql="delete from User where name=?";
Query query = this.getSession().createQuery(hql);
query.setString(0, "CCC");
query.executeUpdate();
使用
createSQLQuery(),用SQL
String hql="delete from user where name=?";
Query query = this.getSession().createSQLQuery(hql);
query.setString(0, "DDDDD");
query.executeUpdate();
(3) bulkUpdate()
this.getHibernateTemplate().bulkUpdate("delete from User where name='user1'");
使用BulkUpdate()批量删除数据的实例:
final String[] names={"user2","user3","user4","user5"};
final String hql = "delete from User where name in(:name)";
this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(hql);
//query.setParameterList("ids", ids);
query.setParameterList("name", names);
int rcd = query.executeUpdate();
System.out.println("删除的记录个数:"+rcd);
return rcd;
}
});
执行结果:
删除的记录个数:4
4.查询数据
其实查询是使用最多的操作,在hibernate里面有这些用法
(1) 最普通的用法HibernateTemplate.get()
使用get()需要指定id,其实是根据ID来查找数据
例如:
getHibernateTemplate().get(User.class,uid);
(2) HibernateTemplate.find()
find()方法使用HQL并且返回的是集合,例如
List<User> list = (List<User>)this.getHibernateTemplate().find(String.format("from User u where u.name='%s' ", name));
if (list.size()>0){
return list.get(0);
}
(3)HibernateTemplate.getSession().createQuery()
createQuery()里面使用HQL并且返回的是集合,例如
List<User> list = (List<User>)this.getSession().createQuery(String.format("from User u where u.name='%s'", name)).list();
if (list.size()>0){
return list.get(0);
}
(4)HibernateTemplate.getSession().createSQLQuery()
createSQLQuery()里面是用普通SQL并且返回的是集合,用法1,例如
Query query = this.getSession().createSQLQuery(String.format("select * from user u where u.name='%s'", name)).addEntity(User.class);
List<User> list1 = (List<User>)query.list();
if (list1.size()>0){
return list1.get(0);
}
createSQLQuery()里面是用普通SQL
并且返回的是集合,用法2,例如
List<User> list = (List<User>)this.getSession().createSQLQuery(String.format("select * from user u where u.name='%s'", name)).addEntity(User.class).list();
if (list.size()>0){
return list.get(0);
}