Hibernate的批量处理

来源:互联网 发布:编程好看的字体 编辑:程序博客网 时间:2024/06/10 06:14


因为公司使用的框架是SSH,已经很久没有去碰hibernate了,所以都有点生疏不太熟练,以至于有些费力,最近也是每天下班后回到宿舍在恶补各种各样的知识,蛮累的,不过过的还算很开心,因为学习,我还是挺喜欢的,哈哈,切入主题,

hibernate完全以面向对象的方式来操作数据库的,当我们需要批量的处理的时候,hibernate给我们提供了这种处理的解决方案


批量插入:

public static void main(String[] args) {Session  session=HibernateUtil.currentSession();Transaction transaction = session.beginTransaction();for (int i = 0; i <1000; i++) {User user = new User();//TODO  user添加属性session.save(user);if (i%20==0) {session.flush();session.clear();}}transaction.commit();HibernateUtil.closeSession();}

这个例子最值得注意的是,因为每一个Session都必存在一个一级缓存,当我们批量对其操作的时候Session就会缓存很多,从而造成内存泄漏,因此需要手动将session的一级缓存清除掉,最好也将SeesionFactory级别的二级缓存,因为在项目中我们会开启二级缓存,当批量操作的时往往也会发生同样的内存泄漏问题;


批量更新:

public static void main(String[] args) {Session  session=HibernateUtil.currentSession();Transaction transaction = session.beginTransaction();//查询user表中的所有记录  ,scroll()方法是用于返回多行数据ScrollableResults results = session.createQuery("from User").setCacheMode(CacheMode.IGNORE).scroll();int count=0;while (results.next()) {User user = new User();//TODO  user添加属性session.save(user);if (++count%20==0) {session.flush();session.clear();}}transaction.commit();HibernateUtil.closeSession();

但是这种批量处理的的效果和效率非常差劲,因为他需要先执行数据查询,然后在执行数据更新,而且这种更新是逐行更新,即每更新一条语句都会执行一条update语句,性能非常低下.


为此,Hibernate提供了HQL语句支持的DML风格的批量更新/删除

批量update/delete语句的语法如下

update|delete from ?<ClassName> [ where where_conditions]
这个语法有4点需要注意

-->在from字句中,from关键字是可选的,即完全不写from关键字

-->在from字句中只能有一个类名,可以在该类名后面制定别名

-->不能批量HQL语句中使用链接,显式或者隐使的都不行,但可以在WHERE字句中使用子查询

-->整个where字句是可以的,where字句的语法和HQL语句中的where字句的语法完全相同

因此我们可以这样来处理上面的更新例子

public static void main(String[] args) {Session  session=HibernateUtil.currentSession();Transaction transaction = session.beginTransaction();//定于批量更新的hql语句String hqlUpdate = "update User u set name=:newName";//执行更新 int update = session.createQuery(hqlUpdate).setString("newName", "新名字").executeUpdate();transaction.commit();HibernateUtil.closeSession();}

使用这种更新语法,通常只需要执行一次SQL的update语句,就可以完成所有有满足条件的记录的更新,但也可能是多条update语句,这是因为有继承映射等待的特殊情况;


批量删除的例子:

public static void main(String[] args) {Session  session=HibernateUtil.currentSession();Transaction transaction = session.beginTransaction();//定于批量更新的hql语句String hqlDelete = "delete User";//执行更新 int deleteEntity = session.createQuery(hqlDelete).executeUpdate();transaction.commit();HibernateUtil.closeSession();}

返回值是受此操作的记录数量


0 0