该段代码写在DaoImpl中就可以,用的时候通过dao调用
如果先要执行其他sql语句,可以再PreparedStatement一次
例如批处理前,要删除表
PreparedStatement del = connection.prepareStatement("detele from tableName");
虽然executeBatch()是批处理的意思,但实际上还是一条条传入数据库,速度慢
要启动批处理需要将数据库连接添加 rewriteBatchStatement=true
如
<property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/table?characterEncoding=utf8&autocommit=false&rewriteBatchedStatements=true" />
此次是写在xml文件中,连接用的转义字符&,否则用&连接就可以
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.internal.SessionFactoryImpl;
import org.springframework.transaction.annotation.Transactional;
Logger logger = Logger.getLogger(xx.class);
@PersistenceUnit(unitName = "entityManagerFactory")
protected EntityManagerFactory entityManagerFactory;
@PersistenceContext
private EntityManager entityManager;
@Transactional(readOnly=false)
public int batchJDBC(String sql, Object[] args) throws SQLException {
int num = 0;
long start = System.currentTimeMillis();
EntityManager em = entityManagerFactory.createEntityManager();
Session session = (Session) em.getDelegate();
SessionFactoryImpl sessionFactory = (SessionFactoryImpl) session.getSessionFactory();
Connection connection = sessionFactory.getConnectionProvider().getConnection();
//开启事务
connection.setAutoCommit(false);
try {
PreparedStatement ps = connection.prepareStatement(sql);
for(int i = 0; i < args.length; i++) {
Object[] obj = (Object[]) args[i];
for(int j = 0; j < obj.length; j++) {
ps.setObject((j+1), obj[j]);
}
ps.addBatch();
}
int[] r = ps.executeBatch();
ps.clearBatch();
for(int a : r) {
if(a > 0) {
num++;
}
}
} catch (SQLException e) {
connection.rollback();
logger.error(xx.class, e);
throw e;
} finally {
connection.close();
if(em.isOpen()) {
em.close();
}
}
long end = System.currentTimeMillis();
logger.info("成功处理:" + num);
return num;
}