设为首页 收藏本站
查看: 227|回复: 0

[经验分享] Hibernate批量操作

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-16 12:35:29 | 显示全部楼层 |阅读模式
批量处理数据:指的是在一个事务场景中需要处理大量数据。
Hibernate进行批量处理数据的方式:
1.使用HQL进行批量操作:HQL是跨数据库的,面向对象,但具有局限性,只能用于单个持久化类,不支持连接,不能使用子查询
2.使用JDBC API进行批量操作:操作方式简单,可以在sql中使用不同数据库的特性
3.使用Session进行批量操作:把关系数据加载到内存中操作,需要通过代码处理复杂的业务逻辑
使用HQL进行批量操作:
  1.HQL可以查询数据,批量插入和更新以及删除数据,实际在数据库中完成,处理的数据不用加载到Session缓存中。
    使用Query接口的executeUpdate()方法用于插入,更新 和删除操作的hql语句
    首先需要SessionUtil.java:
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import db.HibernateSessionFactory;
   public class SessionUtil {
    protected Session session=null;
    protected Query query = null;
    protected Transaction tx= null;
    public Session getSession(){
        return HibernateSessionFactory.getSession();
    }
    public void closeSession(){
        HibernateSessionFactory.closeSession();
    }
}
ps:SessionUtil需要包含HibernateSessionFactory.java,其在Hibernate导入jar包自动生成。
  a.批量添加操作:addManyEntity(List<Entity> list)
主要代码:
    /**
     * [addManyEntity :批量添加,Entity属于实体类]
       getSession():获取session
       beginTransaction():事务开始
       commit():事务提交
       rollback():失误回滚
     * @param {[利用List集合进行遍历]} List<Entity> list
     */
public void addManyEntity(List<Entity> list) {
        try {
            session=getSession();
            tx=session.beginTransaction();
            for (Entity entity: list) {
                session.save(entity);
            }
            tx.commit();
            System.out.println("操作成功!");
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            System.out.println("操作失败!");
        }
        finally{
            closeSession();
        }
    }
b.批量修改:updateManyEntity(数据类型 属性1,数据类型 属性2)
  主要代码:
   /**
    * [updateManyEntity 批量修改]
    * @param  {[实体类的属性的数据类型决定]} 数据类型 属性1   [实体类的属性]
    * @param  {[实体类的属性的数据类型决定]} 数据类型 属性2   [实体类的属性]
    */
  public void updateManyEntity(数据类型 属性1,数据类型 属性2) {
            String hql="update 实体类名 set 属性名=:属性名 where 属性名=:属性名";
            try {
                session=getSession();
                tx=session.beginTransaction();
                query=session.createQuery(hql);
                query.setParameter("属性1", 属性1);
                query.setParameter("属性2", 属性2);
                int num=query.executeUpdate();
                System.out.print("修改的数据为:"+num);
                tx.commit();
                System.out.println("操作成功!");
            } catch (Exception e) {
                e.printStackTrace();
                tx.rollback();
                System.out.println("操作失败!");
            }
            finally{
                closeSession();
            }
        }
c.批量删除:deleteManyEntity(数据类型 属性1)
主要代码:
/**
* [deleteManyEntity 批量删除]
* @param  {[有实体类的属性的数据类型决定]} 数据类型 属性 [一般都是根据主键来删除]
*/
public void deleteManyEntity(数据类型 属性) {
    String hql="delete  from 实体类名 where 属性名=:属性名";
    try {
        session=getSession();
        tx=session.beginTransaction();
        query=session.createQuery(hql);
        query.setParameter("属性", 属性);
        int num=query.executeUpdate();
        System.out.print("删除的数据为:"+num);
        tx.commit();
        System.out.println("操作成功!");
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            System.out.println("操作失败!");
        }
        finally{
        closeSession();
        }
    }
使用JDBC API进行批量操作:
1.批量更新:
  /**
   * [updateEntity 批量更新]
   * 1.需要使用session的doWork(Work work)方法执行Work对象指定的操作,就是调用execute()的方法
   * 2.Session把当前的数据库连接传给execute()方法
   *
   */
   public void updateEntity(数据类型 属性1,数据类型 属性2) {
      final String sql="update 表名 set 属性=? where 属性=?";
      try {
            session=getSession();
            tx=session.beginTransaction();
            Work work=new Work() {
                @Override
                public void execute(Connection connection) throws SQLException {
                    PreparedStatement preparedStatement=connection.prepareStatement(sql);
                    preparedStatement.setString(1, 属性);
                    preparedStatement.setInt(2, 属性);
                    preparedStatement.executeUpdate();   
                }
            };
            session.doWork(work);
            tx.commit();
            System.out.println("操作成功!");
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            System.out.println("操作失败!");
        }
        finally{
            closeSession();
        }
    }
2. 批量删除
   /**
   * [deleteEntity 批量删除]
   * 1.需要使用session的doWork(Work work)方法执行Work对象指定的操作,就是调用execute()的方法
   * 2.Session把当前的数据库连接传给execute()方法
   *
   */
   public void deleteEntity(数据类型 属性1,数据类型 属性2) {
      final String sql="delete 表名 where 属性=?";
      try {
            session=getSession();
            tx=session.beginTransaction();
            Work work=new Work() {
                @Override
                public void execute(Connection connection) throws SQLException {
                    PreparedStatement preparedStatement=connection.prepareStatement(sql);
                    preparedStatement.setString(1, 属性);
                    preparedStatement.executeUpdate();   
                }
            };
            session.doWork(work);
            tx.commit();
            System.out.println("操作成功!");
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            System.out.println("操作失败!");
        }
        finally{
            closeSession();
        }
    }
3.批量查询:findAllEntity()
主要代码:
  /**
   * [findAllEntity 批量查询]
   * 2种遍历集合的方式:
   * 1.Object[]数组:List<Object[]>list=query.list();
       query=session.createSQLQuery(sql);
              List<Object[]>list=query.list();
              for (Object[] objects : list) {
                for (Object object : objects) {
                    System.out.print(object+"\t");
                }
                System.out.println("");
            }
   * 2.实体类的形式:List<Entity>list=query.list();
   *  query=session.createSQLQuery(sql).addEntity(Entity.class);
              List<Entity>list=query.list();
              for (Entity entity : list) {
                System.out.println(entity.getXX());
            }
   *
   *
   */
public void findAllEntity() {
        String sql="select *from student";
        try {
              session=getSession();
               //第一种:Object[]
              /*query=session.createSQLQuery(sql);
              List<Object[]>list=query.list();
              for (Object[] objects : list) {
                for (Object object : objects) {
                    System.out.print(object+"\t");
                }
                System.out.println("");
            }*/
              //第二种:实体类
               query=session.createSQLQuery(sql).addEntity(Entity.class);
              List<Entity>list=query.list();
              for (Entity entity : list) {
                System.out.println(entity.getXX());
            }
              System.out.println(list.size());
              System.out.println("操作成功!");
          } catch (Exception e) {
              e.printStackTrace();
              System.out.println("操作失败!");
          }
          finally{
              closeSession();
          }
  }
3.条件查询:
/**
  *
  *
  * addEntity(alias【别名1】, entityClass【实体类】)
  * addJoin(alias【关联的别名】, path【别名1的属性】)
  * {}:获取别名对应的属性名
  * 别名.*:代表获取别名下面所有的属性
  */
public void findEntityByXX() {
    String sql="select {别名1.*},{别名2.*} from 表名1 别名1 inner join 表名2 别名2 on 别名1.字段名=别名2.字段名";
    try {
        session=getSession();
        query=session.createSQLQuery(sql).addEntity("别名", Entity.class).addJoin("别名", "别名.表名2");
        List list=query.list();
        System.out.println(list.size());
    } catch (Exception e) {
        e.printStackTrace();
    }   
    finally{
        closeSession();
    }
4.命名查询:
  需要在Entity.hbm.xml中:
  <query name="自定义:getEntity">
       <![CDATA[
       hql语句
       ]]>
    </query>
  主要代码:
  /**
   * 1.第一种方式:不加条件查询:query=session.getNamedQuery("getEntity");
   * 2.第二种:条件查询:query.setParameter("属性名", "条件");
   *
   */
  public void getEntityXX() {
    try {
        session=getSession();
        query=session.getNamedQuery("getEntity");
        query.setParameter("属性名", "条件");
        List<Entity>list=query.list();
        for (Entity entity : list) {
            System.out.println(entity.getXX());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    finally{
        closeSession();
    }
}
使用Session进行批量操作:
需要及时从缓存中清除已经处理完毕并且不会再访问的对象:
首先:调用flush()方法强制同步缓存和数据库:session.flush();
然后:调用clear()方法清空缓存:session.clear();
Hibernate批量操.zip (2.68 KB, 下载次数: 0)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-191380-1-1.html 上篇帖子: 在Red hat linux enterprise 9 上安装jdk 6.0 下篇帖子: linux cifs挂载windows共享文件夹
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表