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
- Hibernate 的批量处理
- Hibernate的批量处理
- Hibernate的批量处理
- Hibernate的批量处理
- hibernate的批量处理
- hibernate的批量处理
- Hibernate的批量处理
- Hibernate的批量处理-批量插入
- Hibernate的批量删除处理
- Hibernate读书笔记-----hibernate的批量处理
- Hibernate读书笔记-----hibernate的批量处理
- Hibernate学习之---Hibernate的批量处理
- 6.3 Hibernate的批量处理: (6.3.1)批量插入
- 6.3 Hibernate的批量处理: (6.3.2)批量更新
- Hibernate批量处理
- hibernate 批量处理
- Hibernate批量处理
- Hibernate批量处理
- 如何调用TUIO中的源码
- 在ubuntu中安装Samba服务器
- 【HDU 5889】Barricade(最短路+最小割)
- RadioButton单选按钮
- 【Bash百宝箱】shell内建命令之句点与source
- Hibernate的批量处理
- jquery中常用方法
- qt5.6.1+mingw492+opencv2.4.10+cmake3.4.1配置
- shell中的条件判断与控制流程
- 198. House Robber
- 透视投影的原理和实现
- 荣华小学访问
- lightoj 1145 - Dice (I)
- 1.适配器模式