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的方法如下:

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。

具体批量增删改查的代码实现:

/* =============Session提供的使用HQL语句增删改查的方法============= */
	/**
	 * 批量插入(保存)操作,本例未使用HQL语句 注意:插入数据时:只支持INSERT INTO ... SELECT ...形式,不支持INSERT
	 * INTO ... VALUES ...形式.
	 *
	 * @param userList
	 */
	public static void insertByHql(List<User> userList) {
		// 获取Session
		Session session = Hibernate4Util.getCurrentSession();
		try {
			// 开启事务
			Transaction transaction = session.beginTransaction();

			User tempUser = null;
			for (int i = 0; i < userList.size(); i++) {
				tempUser = userList.get(i);
				// 保存对象
				session.save(tempUser);
				// 批插入的对象立即写入数据库并释放内存
				if (i % 10 == 0) {
					session.flush();
					session.clear();
				}
			}
			transaction.commit();
		} catch (Exception e) {
			// 打印错误信息
			e.printStackTrace();
			// 出错将回滚事物
			session.getTransaction().rollback();
		} finally {
			// 关闭Session
			Hibernate4Util.closeSession(session);
		}

	}

	/**
	 * 通过HQL语句,实现批量删除 【具体应用需要自行扩展】
	 *
	 * @param id
	 */
	public static void deleteByHql(int id) {
		String deleteHql = "delete User user where user.id = ?";

		Session session = Hibernate4Util.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Query deleteQuery = session.createQuery(deleteHql);
		deleteQuery.setParameter(0, id);
		int result = deleteQuery.executeUpdate();
		System.out.println("result = " + result);
		transaction.commit();

		Hibernate4Util.closeSession(session);
	}

	/**
	 * 批量分页查询
	 *
	 * @param pageNo 页码
	 * @param pageSize 页面记录数据
	 */
	public static void selectByHql(int pageNo, int pageSize) {

		int fistRow = pageSize * pageNo;
		int maxRow = pageSize * (pageNo + 1);
		String selectHql = "from User user";

		Session session = Hibernate4Util.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Query selectQuery = session.createQuery(selectHql);
		selectQuery.setFirstResult(fistRow);
		selectQuery.setMaxResults(maxRow);
		List<User> userList = selectQuery.list();
		System.out.println(userList.toString());

		Hibernate4Util.closeSession(session);
	}

	/**
	 * 通过HQL语句,批量更新数据
	 */
	public static void updateByHql() {
		String updateHql = "update User user set user.userName =:newName where user.userName=:oldName";

		Session session = Hibernate4Util.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Query updateQuery = session.createQuery(updateHql);
		updateQuery.setString("newName", "Hoking");
		updateQuery.setString("oldName", "mahc");
		int result = updateQuery.executeUpdate();
		System.out.println("result = " + result);
		transaction.commit();

		Hibernate4Util.closeSession(session);
	}

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

时间: 2024-10-07 19:40:56

Hibernate 批量增删改查操作的相关文章

MyBatis批量增删改查操作

前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 批量增加操作步骤 1. 在接口UserMapper中添加批量增加方法. /** * 批量增加操作 * @param users */ public void batchInsertUsers(List<User> users); 2.在User.xml中添加批量增加操作的配置. <!-- 批量增

Hibernate 基本增删改查操作

本文将要介绍Hibernate基本的增删改查的操作的实现,首先我们创建一个对象实例.一般情况下会创建User,本例也不例外需要创建这样的对象. [转载使用,请注明出处:http://blog.csdn.net/mahoking] User对象 public class User { private Integer id; private String userName; private String password; /*以下省略getter与setter*/ } 配置User.hbm.xml

(六)Hibernate的增删改查操作(2)

一.在Hibernate中使用原生SQL语句 sql语句面向的是数据库,所以sql语句中对应的不再是bean了,比如sql="select * from user"   在hql中*是无效的,但是在sql中可以使用,且user指的是数据库中的user表. 案例一: package action; import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.h

(五)Hibernate的增删改查操作(2)

接上一章节 HQL的预编译语句 HIbernate中的预编译与Spring的预编译的处理差不多.    1:使用标准的?  2:使用命名参数   2.1:使用名称逐个设置.   2.2:使用Map(key的值等于参数的名称)    2.3:使用Bean(属性的名称等于参数的名称) 案例一:Query_HQL_Prepared.java package action; import java.util.HashMap; import java.util.List; import java.util

Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面进行描述.参考前文: Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中 Java+MyE

数组的增删改查操作

做批量数据录入时须要对json内的数组进行增删改查操作,splice还是非常强大的记录一下用法. var lang = ["php","java","javascript"]; //删除 var removed = lang.splice(2,1); console.log(lang); //php,javascript //console.log(removed); //java ,返回删除的项 //插入 var insert = lang.s

(转)SQLite数据库增删改查操作

原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).d

Scala对MongoDB的增删改查操作

=========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! =========================================== 依赖环境:jdk1.8.Scala 2.12.idea mongodb Driver:3.1.1.注意,mongo for scala的驱动涉及多个jar(如下图),依赖于mongo-java-driver.jar 这里使用的sbt管理依赖,直接在bu

作业员工信息表实现增删改查操作

有以下员工信息表 当然此表你在文件存储时可以这样表示 1 1,Alex Li,22,13651054608,IT,2013-04-01 现需要对这个员工信息文件,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select  * from staff_table where dept = "IT" select  * from staff_table where enroll