hibernate的批处理API:session.createQuery(hql).executeUpdate(),如果有参数则在执行之前设置参数。
批量更新示例:
@Test
public void testBatchUpdate() {
String hql = "update Employee set name=:name , age=:age where id>:minId and id<:maxId";
session.createQuery(hql).setString("name", "zhangsan").setInteger("age", 18).setInteger("minId", 10)
.setInteger("maxId", 100).executeUpdate();
}
批量删除示例:
@Test
public void testBatchDelete() {
String hql = "delete Department where id>:minId";
session.createQuery(hql).setInteger("minId", 20).executeUpdate();
}
session.createQuery(hql).executeUpdate()方法只会产生一条sql语句,update语句或是delete语句,只操作一次数据库,效率大大提升。
此外,不能用此方法进行批量插入,只能用原生的jdbc操作:
@Test
public void testBatchInsert() {
session.doWork(new Work() {
@Override
public void execute(Connection conn) throws SQLException {
// 原生jdbc操作
System.out.println(conn);
String sql = "insert into tb_employee (name,age) values ('a',18),('b',18),('c',18),('d',18),('e',18),('f',18),('g',18),('h',18),('i',18),('j',18),('k',18),('l',18),('m',18),('n',18)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.execute();
}
});
}
利用session.doWork()方法,这样也只会产生一条insert语句,进行批量插入操作。注意,方法里的conn对象类型是c3p0.jar包中的代理Connection类型,跟Hibernate没关系。
或者一点都不用Hibernae的API,全部用原生API,略。