在Hibernate应用中,批量处理有两种方法,一种是通过Hibernate的缓存,另一种是绕过Hibernate,直接调用JDBC API来处理。

一:批量插入

(1)通过Hibernate的缓存进行批量插入

使用这种方法时,首先要在Hibernate的配置文件 hibernate.cfg.xml 中设置批量尺寸属性 hibernate.jdbc.batch_size ,且最好关闭Hibernate的二级缓存以提高效率。

<hibernate-configuration>
   <session-factory>
        <property name="hibernate.jdbc.batch_size">50</property> //设置批量尺寸
        <property name="hibernate.cache.use_second_level_cache">false</property> //关闭二级缓存
        <mapping resource="org/vo/Usertable.hbm.xml" /> 
   </session-factory>
</hibernate-configuration>

批量插入:

public class HibernateTest {
	public static void main(String args[]){
		Session session=HibernateSessionFactory.getSession();
		Transaction ts=session.beginTransaction();
		for(int i=0;i<50;i++){
			Usertable user=new Usertable();
			user.setPassword("100"+i);
			session.save(user);
			if(i%50==0){
				session.flush();  //以50位一个批次向数据库中提交,此值应与配置的批量尺寸一致
				session.clear();  //清空缓存区,释放内存供下批数据使用
			}
		}
		ts.commit();
		HibernateSessionFactory.closeSession();
	}
}

(2)绕过Hibernate直接调用JDBC进行插入

public class HibernateTest {
	public static void main(String args[]){
		Session session=HibernateSessionFactory.getSession();
		Transaction ts=session.beginTransaction();
		session.doWork(
			new Work(){
				public void execute(Connection connection) throws SQLException{
					try{
						PreparedStatement stmt=
			connection.prepareStatement("insert into usertable(password) values (?)");
						for(int i=0;i<50;i++){
							stmt.setString(1, "100"+i);
							stmt.addBatch(); //添加到批处理命令中
						}
						stmt.executeBatch(); //执行批处理任务
					}catch(SQLException e){
						e.printStackTrace();
					}
				}
			});
		ts.commit();
		HibernateSessionFactory.closeSession();
	}
}

二:批量更新

(1)由Hibernate直接进行批量更新
为了使HIbernate的HQL直接支持update的批量更新语法,首先在HIbernate的配置文件 hibernate.cfg.xml 中设置HQL/SQL查询翻译器属性 "hibernate.query.factory_class"。

<hibernate-configuration>
       ......
      <property name="hibernate.query.factory_class">
		org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
	</property>
	<mapping resource="org/vo/Usertable.hbm.xml" />
   </session-factory>
</hibernate-configuration>

批量更新:

public class HibernateTest {
	public static void main(String args[]){
		Session session=HibernateSessionFactory.getSession();
		Transaction ts=session.beginTransaction();
		Query query=session.createQuery("update Usertable set password='123'");
		query.executeUpdate();
		ts.commit();
		HibernateSessionFactory.closeSession();
	}
}

(2)绕过Hibernate调用JDBC进行批量更新

public class HibernateTest {
	public static void main(String args[]){
		Session session=HibernateSessionFactory.getSession();
		Transaction ts=session.beginTransaction();
		session.doWork(
			new Work(){
				public void execute(Connection connection) throws SQLException{
					try{
						Statement stmt=connection.createStatement();
						stmt.executeUpdate("update usertable set username='ltx'");
					}catch(SQLException e){
						e.printStackTrace();
					}
				}
			});
		ts.commit();
		HibernateSessionFactory.closeSession();
	}
}

三:批量删除

(1)由Hibernate直接进行批量删除
为了使HIbernate的HQL直接支持 delete 的批量删除语法,首先在HIbernate的配置文件 hibernate.cfg.xml 中设置HQL/SQL查询翻译器属性 "hibernate.query.factory_class"。

<hibernate-configuration>
       ......
      <property name="hibernate.query.factory_class">
		org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
	</property>
	<mapping resource="org/vo/Usertable.hbm.xml" />
   </session-factory>
</hibernate-configuration>

批量删除:

public class HibernateTest {
	public static void main(String args[]){
		Session session=HibernateSessionFactory.getSession();
		Transaction ts=session.beginTransaction();
		Query query=session.createQuery("delete Usertable where id<120");
		query.executeUpdate();
		ts.commit();
		HibernateSessionFactory.closeSession();
	}
}

(2)绕过Hibernate调用JDBC进行批量删除

public class HibernateTest {
	public static void main(String args[]){
		Session session=HibernateSessionFactory.getSession();
		Transaction ts=session.beginTransaction();
		session.doWork(
			new Work(){
				public void execute(Connection connection) throws SQLException{
					try{
						Statement stmt=connection.createStatement();
						stmt.executeUpdate("delete from Usertable where id>120");
					}catch(SQLException e){
						e.printStackTrace();
					}
				}
			});
		ts.commit();
		HibernateSessionFactory.closeSession();
	}
}

 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐