zoukankan      html  css  js  c++  java
  • Hibernate三种批量处理数据

       

        概念:批量处理数据是指在一个事务场景中处理大量数据。

    在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据:

    (1)使用HQL进行批量操作  数据库层面  executeUpdate()

    (2)使用JDBC API进行批量操作  数据库层面

    (3)使用Session进行批量操作   会进缓存

    1.使用HQL进行批量操作

          HQL可以查询数据,也可以批量插入、更新和删除数据。HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中。使用Query接口的executeUpdate()方法执行用于插入、更新和删除的HQL语句。

    01.批量插入数据

    复制代码
        @Test
    //03.HQL 批量添加 public void multiInsertTest(){ String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0"; session.createQuery(hql).executeUpdate(); }
    复制代码

    02.批量修改

    复制代码
     @Test
        //03.HQL 批量修改
        public void multiUpdateTest(){
            String hql="update Dept set deptName=:name where deptNo>2";
            session.createQuery(hql).setParameter("name","财务部").executeUpdate();
        }
    复制代码

    03.批量删除

    复制代码
     @Test
        //03.HQL 批量删除
        public void multiDeleteTest(){
            String hql="delete from Dept d where d.deptNo>:deptNo";
            session.createQuery(hql).setParameter("deptNo",20).executeUpdate();
        }
    复制代码

    2.使用JDBC API进行批量操作

    复制代码
     @Test
        //04.JDBC API 批量修改
        public void insertTest(){
            Work work=new Work() {
                public void execute(Connection connection) throws SQLException {
                    PreparedStatement ps = connection.prepareStatement("update DEPT  set deptName='业务部'where DEPTNO>?");
                    ps.setInt(1,1);
                    ps.executeUpdate();
                }
            };
            //session
            session.doWork(work);
        }
    复制代码

    操作前:                                 操作后:

    注意:该方式使用的连接依然是最初的连接对象,并且命令对象依然是根据连接创建的,注意这里是SQL语句,不是HQL语句

    3.使用Session进行批量操作

        使用Session对象也可以进行批量操作。使用Session对象处理大量持久化对象,需及时从缓存中清空已经处理完毕并且不会再访问的对象。可以在处理完成一个对象或小批量对象后,调用flush()方法强制同步缓存和数据库,然后调用clear()方法清空缓存。

    复制代码
     @Test
    public void testAdd(){ Emp emp=null; for (int i = 0; i < 10000; i++) { emp=new Emp(i, "emp"+i); session.save(emp); if (i%30==0) { session.flush(); session.clear(); } } }
  • 相关阅读:
    【PL/SQL练习】显式游标
    【PL/SQL练习】控制结构
    【PL/SQL练习】游标cursor :oracle 在执行sql语句时,为sql语句所分配的一个私有的内存区域
    【PL/SQL练习】DML语句的处理(可以处理多行数据)
    【PL/SQL练习】复合变量: 可以一次传递多个值到变量中。
    【PL/SQL练习】基本的PL/SQL语句
    【小错误】监听
    【考试】用户管理
    【考试】简单的sql语句
    织梦自定义表单地区联动类型不可用的解决办法
  • 原文地址:https://www.cnblogs.com/wei-91/p/6374912.html
Copyright © 2011-2022 走看看