Hibernate 批量增删改查操作

上文介绍Hibernate基本的增删改查,本例将介绍更实用的批量增删改查的操作的实现。本文中增删改查的操作,仅供参考。如果读者需要应用到实际的应用场景需要的话,需要在此基础上扩展与丰富。

【转载使用,请注明出处:http://blog.csdn.net/mahoking
       在学习本例时,需要扩展一下Hibernate中Session的知识。Hibernate中的Session是一级缓存,可以理解为进程级的缓存。在进程运行期间一直存在。Session可以理解为一个可以操作数据库的对象 具体如何操作数据库,Session中有方法, 如果只是单独的Hibernate程序的话. 获得session之后,打开事务,操作数据库,提交(回滚事务),关闭session。就这样完成了操作DB 。
Hibernate中Session的使用:
在Hibernate中session主要是用来操作数据库,Hibernate在操作数据库前需要得到Session的实例,这个类似于jdbc中的Connection。
获得Session的方法如下:

  1. Session session = sessionFactory.openSession();  

       通过Session对象可以对数据库进行增删改查的操作,对应的方法分别为:save(),delete(),update(),saveOrUpdate(),load(),get()。在Hibernate 3中,取消了find()方法,必须通过Query或Criteria来进行查询。对于它的几个最基本的方法如save()、delete()、flush()等的学习需要一定的时间。在深入了解这些这些方法前,了解session的缓存机制以及Hibernate中Java对象的状态对我们是很有帮助的。
      在一个Hibernate应用中,Java对象可以处于以下三个状态之一:
      1.临时状态(Transient)。处于这个状态的对象还被没有纳入Hibernate的缓存管理体系,跟任何session都不关联,在数据库中也没有对应的记录。
      2.持久化状态(Persistent)。处于这个状态的对象位于Session的缓存中,并且和数据库中的一条数据记录相对应。
      3.游离状态(Detached)。处于这个状态的对象不再位于Session的缓存中,它与临时对象的最大区别在于,游离对象在数据库中还可能存在一条与它对应的记录。
上述3个状态之间是可以相互转化的,而且我们所说的状态都是针对某一个session实例而言的,比方说,对象A对于session1而言是处于持久化状态的,因为它处于session1的缓存中,但是对于session2而言对象A并不在它的缓存中,因此它是处于游离状态的。

扩展:
Q:
Session中get()和load()方法的区别?
A:

1、get方法会在调用之后立即向数据库发出sql语句(不考虑缓存的情况下),返回持久化对象;而load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
2、查询数据库中不存在的数据时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException。
具体批量增删改查的代码实现:


 

  1. /* =============Session提供的使用HQL语句增删改查的方法============= */  
  2.     /** 
  3.      * 批量插入(保存)操作,本例未使用HQL语句 注意:插入数据时:只支持INSERT INTO ... SELECT ...形式,不支持INSERT 
  4.      * INTO ... VALUES ...形式. 
  5.      *  
  6.      * @param userList 
  7.      */  
  8.     public static void insertByHql(List<User> userList) {  
  9.         // 获取Session  
  10.         Session session = Hibernate4Util.getCurrentSession();  
  11.         try {  
  12.             // 开启事务  
  13.             Transaction transaction = session.beginTransaction();  
  14.   
  15.             User tempUser = null;  
  16.             for (int i = 0; i < userList.size(); i++) {  
  17.                 tempUser = userList.get(i);  
  18.                 // 保存对象  
  19.                 session.save(tempUser);  
  20.                 // 批插入的对象立即写入数据库并释放内存  
  21.                 if (i % 10 == 0) {  
  22.                     session.flush();  
  23.                     session.clear();  
  24.                 }  
  25.             }  
  26.             transaction.commit();  
  27.         } catch (Exception e) {  
  28.             // 打印错误信息  
  29.             e.printStackTrace();  
  30.             // 出错将回滚事物  
  31.             session.getTransaction().rollback();  
  32.         } finally {  
  33.             // 关闭Session  
  34.             Hibernate4Util.closeSession(session);  
  35.         }  
  36.   
  37.     }  
  38.   
  39.     /** 
  40.      * 通过HQL语句,实现批量删除 【具体应用需要自行扩展】 
  41.      *  
  42.      * @param id 
  43.      */  
  44.     public static void deleteByHql(int id) {  
  45.         String deleteHql = "delete User user where user.id = ?";  
  46.   
  47.         Session session = Hibernate4Util.getCurrentSession();  
  48.         Transaction transaction = session.beginTransaction();  
  49.         Query deleteQuery = session.createQuery(deleteHql);  
  50.         deleteQuery.setParameter(0, id);  
  51.         int result = deleteQuery.executeUpdate();  
  52.         System.out.println("result = " + result);  
  53.         transaction.commit();  
  54.   
  55.         Hibernate4Util.closeSession(session);  
  56.     }  
  57.   
  58.     /** 
  59.      * 批量分页查询 
  60.      *  
  61.      * @param pageNo 页码 
  62.      * @param pageSize 页面记录数据 
  63.      */  
  64.     public static void selectByHql(int pageNo, int pageSize) {  
  65.   
  66.         int fistRow = pageSize * pageNo;  
  67.         int maxRow = pageSize * (pageNo + 1);  
  68.         String selectHql = "from User user";  
  69.   
  70.         Session session = Hibernate4Util.getCurrentSession();  
  71.         Transaction transaction = session.beginTransaction();  
  72.         Query selectQuery = session.createQuery(selectHql);  
  73.         selectQuery.setFirstResult(fistRow);  
  74.         selectQuery.setMaxResults(maxRow);  
  75.         List<User> userList = selectQuery.list();  
  76.         System.out.println(userList.toString());  
  77.   
  78.         Hibernate4Util.closeSession(session);  
  79.     }  
  80.   
  81.     /** 
  82.      * 通过HQL语句,批量更新数据 
  83.      */  
  84.     public static void updateByHql() {  
  85.         String updateHql = "update User user set user.userName =:newName where user.userName=:oldName";  
  86.   
  87.         Session session = Hibernate4Util.getCurrentSession();  
  88.         Transaction transaction = session.beginTransaction();  
  89.         Query updateQuery = session.createQuery(updateHql);  
  90.         updateQuery.setString("newName""Hoking");  
  91.         updateQuery.setString("oldName""mahc");  
  92.         int result = updateQuery.executeUpdate();  
  93.         System.out.println("result = " + result);  
  94.         transaction.commit();  
  95.   
  96.         Hibernate4Util.closeSession(session);  
  97.     }  


【转载使用,请注明出处:http://blog.csdn.net/mahoking

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值