广告
返回顶部
首页 > 资讯 > 精选 >Hibernate批量更新和批量删除的方法是什么
  • 605
分享到

Hibernate批量更新和批量删除的方法是什么

2023-06-17 21:06:36 605人浏览 八月长安
摘要

这篇文章主要介绍“Hibernate批量更新和批量删除的方法是什么”,在日常操作中,相信很多人在Hibernate批量更新和批量删除的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate

这篇文章主要介绍“Hibernate批量更新和批量删除的方法是什么”,在日常操作中,相信很多人在Hibernate批量更新和批量删除的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate批量更新和批量删除的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Hibernate批量更新是指在一个事务中更新大批量数据,Hibernate批量删除是指在一个事务中删除大批量数据。以下程序直接通过Hibernate api批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段:

tx = session.beginTransaction();    ??Iterator customers=session.find("from Customer c where c.age>0").iterator();    ??while(customers.hasNext()){    ??Customer customer=(Customer)customers.next();    ??customer.setAge(customer.getAge()+1);    ??}     ??tx.commit();    ??session.close();

如果CUSTOMERS表中有1万条年龄大于零的记录,那么Session的find()方法会一下子加载1万个Customer对象到内存。当执行tx.commit()方法时,会清理缓存,Hibernate执行1万条更新CUSTOMERS表的update语句:

update CUSTOMERS set AGE=? …. where ID=i;    ??update CUSTOMERS set AGE=? …. where ID=j;    ??update CUSTOMERS set AGE=? …. where ID=k;

以上Hibernate批量更新方式有两个缺点:

(1) 占用大量内存,必须把1万个Customer对象先加载到内存,然后一一更新它们。
(2) 执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的访问数据库,会大大降低应用的性能。

为了迅速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()方法立即释放它的内存:

tx = session.beginTransaction();    Iterator customers=session.find("from Customer c where c.age>0").iterator();    while(customers.hasNext()){    Customer customer=(Customer)customers.next();    customer.setAge(customer.getAge()+1);    session.flush();    session.evict(customer);    }     tx.commit();    session.close();

在以上程序中,修改了一个Customer对象的age属性后,就立即调用Session的flush()方法和evict()方法,flush()方法使Hibernate立刻根据这个Customer对象的状态变化同步更新数据库,从而立即执行相关的update语句;evict()方法用于把这个Customer对象从缓存中清除出去,从而及时释放它占用的内存。

但evict()方法只能稍微提高批量操作的性能,因为不管有没有使用evict()方法,Hibernate都必须执行1万条update语句,才能更新1万个Customer对象,这是影响批量操作性能的重要因素。假如Hibernate能直接执行如下sql语句:

update CUSTOMERS set AGEAGE=AGE+1 where AGE>0;

那么以上一条update语句就能更新CUSTOMERS表中的1万条记录。但是Hibernate并没有直接提供执行这种update语句的接口。应用程序必须绕过Hibernate API,直接通过JDBC API来执行该SQL语句:

tx = session.beginTransaction();    Connection con=session.connection();    PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGEAGE=AGE+1 "    +"where AGE>0 ");    stmt.executeUpdate();    tx.commit();

以上程序演示了绕过Hibernate API,直接通过JDBC API访问数据库的过程。应用程序通过Session的connection()方法获得该Session使用的数据库连接,然后通过它创建PreparedStatement对象并执行SQL语句。值得注意的是,应用程序仍然通过Hibernate的Transaction接口来声明事务边界。
如果底层数据库(如oracle)支持存储过程,也可以通过存储过程来执行Hibernate批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateCustomer()的存储过程,代码如下:

create or replace procedure batchUpdateCustomer(p_age in number) as    begin    update CUSTOMERS set AGEAGE=AGE+1 where AGE>p_age;    end;

以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:

tx = session.beginTransaction();    Connection con=session.connection();    String procedure = "{call batchUpdateCustomer(?) }";    CallableStatement cstmt = con.prepareCall(procedure);    cstmt.setInt(1,0); //把年龄参数设为0    cstmt.executeUpdate();    tx.commit();

从上面程序看出,应用程序也必须绕过Hibernate API,直接通过JDBC API来调用存储过程。
Session的各种重载形式的update()方法都一次只能更新一个对象,而delete()方法的有些重载形式允许以HQL语句作为参数,例如:

session.delete("from Customer c where c.age>0");

如果CUSTOMERS表中有1万条年龄大于零的记录,那么以上代码能删除一万条记录。但是Session的delete()方法并没有执行以下delete语句

delete from CUSTOMERS where AGE>0;

Session的delete()方法先通过以下select语句把1万个Customer对象加载到内存中:

select * from CUSTOMERS where AGE>0;

接下来执行一万条delete语句,逐个删除Customer对象:

delete from CUSTOMERS where ID=i;    delete from CUSTOMERS where ID=j;    delete from CUSTOMERS where ID=k;

由此可见,直接通过Hibernate API进行Hibernate批量更新和Hibernate批量删除都不值得推荐。而直接通过JDBC API执行相关的SQL语句或调用相关的存储过程,是Hibernate批量更新和Hibernate批量删除的***方式,这两种方式都有以下优点:

(1) 无需把数据库中的大批量数据先加载到内存中,然后逐个更新或修改它们,因此不会消耗大量内存。
(2) 能在一条SQL语句中更新或删除大批量的数据。

到此,关于“Hibernate批量更新和批量删除的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Hibernate批量更新和批量删除的方法是什么

本文链接: https://www.lsjlt.com/news/293230.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Hibernate批量更新和批量删除的方法是什么
    这篇文章主要介绍“Hibernate批量更新和批量删除的方法是什么”,在日常操作中,相信很多人在Hibernate批量更新和批量删除的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate...
    99+
    2023-06-17
  • redis的批量删除方法是什么
    Redis的批量删除方法可以使用DEL命令进行操作。DEL命令用于删除一个或多个指定的键(key)。它可以一次删除一个或多个键,可以...
    99+
    2023-09-11
    redis
  • sql批量删除数据的方法是什么
    要批量删除数据,可以使用以下方法之一:1. 使用DELETE语句和WHERE子句:可以使用DELETE语句结合WHE...
    99+
    2023-09-16
    sql
  • linux批量删除文件的方法是什么
    在Linux中,有多种方法可以批量删除文件。以下是几种常用的方法:1. 使用通配符删除:可以使用通配符来指定要删除的文件的模式。例如...
    99+
    2023-08-21
    linux
  • Redis批量删除KEY的方法
    Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作。 redis-cli keys “*” | xarg...
    99+
    2022-06-04
    批量 方法 Redis
  • java批量更新数据的方法是什么
    在Java中,可以使用以下方法来批量更新数据:1. 使用JDBC批处理:通过JDBC的批处理功能,可以一次性将多条SQL语句发送到数...
    99+
    2023-09-11
    java
  • plsql批量更新数据的方法是什么
    在PL/SQL中,批量更新数据通常使用FORALL语句。FORALL语句允许一次性更新多行数据,从而提高了效率。具体方法如下:1. ...
    99+
    2023-10-12
    plsql
  • php中redis批量删除key的方法是什么
    小编给大家分享一下php中redis批量删除key的方法是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php redis删...
    99+
    2022-10-18
  • oracle按条件批量更新的方法是什么
    Oracle按条件批量更新的方法是使用UPDATE语句结合WHERE子句来指定更新的条件。以下是更新语法的一般格式:```s...
    99+
    2023-09-13
    oracle
  • mysql实现批量删除的方法
    小编给大家分享一下mysql实现批量删除的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql实现批量删除的方法:使用s...
    99+
    2022-10-18
  • mybatisplus添加真正的批量新增、批量更新的实现方法
    这篇文章主要介绍mybatisplus添加真正的批量新增、批量更新的实现方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用mybatis-plus来进行批量新增和更新时,你会发现其实是一条条sql执行,下面进行优...
    99+
    2023-06-14
  • MySQL批量更新的四种方法
    最近做一个需求,更新3w条数据,一个一个update去更新的,结果花了80分钟,这样性能上很差,也容易阻塞,所以就找了一些MySQL批量更新的方式,在此记录一下 方法一;replace into 这种更新会将其它字段更新为默认值,因为...
    99+
    2023-08-31
    mysql 数据库 mybatis
  • win10多媒体设备批量删除的方法是什么
    要在Windows 10上批量删除多媒体设备,可以按照以下步骤进行操作:1. 打开Windows设备管理器。快捷键为Win + X,...
    99+
    2023-09-18
    win10
  • mysql中批量删除数据的方法
    mysql中批量删除数据的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql中批量删除数据的方法:首先找出符合条...
    99+
    2022-11-30
    mysql
  • mysql批量删除多个表的方法
    小编给大家分享一下mysql批量删除多个表的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql批量删除多个表的方法:使...
    99+
    2022-10-18
  • redis模糊批量删除key的方法
    目录一、命令行删除二、golang代码删除一、命令行删除 Redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 KEYS "websocket127.0.0.1:5*" | ...
    99+
    2022-12-16
    redis模糊删除key redis模糊批量清除key redis批量清除
  • mybatis批量新增、删除、查询和修改方式
    目录前期说明:主要有一下3种情况:(1)mybatis批量新增(2)mybatis批量删除(3)mybatis批量查询(4)mybatis批量修改mySql Case函数动态批量修改...
    99+
    2022-11-12
  • MySQL怎么进行批量更新和删除数据shell脚本
    MySQL怎么进行批量更新和删除数据shell脚本,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。#!/bin/bash. ~/.bash_...
    99+
    2022-10-18
  • Android使用ListView批量删除item的方法
    本文实例讲述了Android使用ListView批量删除item的方法。分享给大家供大家参考,具体如下: 利用CheckBox选中一个或多个item,最后批量删除它们。 程序运...
    99+
    2022-06-06
    方法 listview Android
  • php 批量删除代码思想是什么
    本教程操作环境:Windows7系统、PHP8.1版、Dell G3电脑。php 批量删除代码思想是什么?php批量删除可以实现多条或者全部数据一起删除新建php文件 显示数据库中内容:<table width="100%&...
    99+
    2022-11-29
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作