在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();
}
}