Maven项目中用JDBC的方式批量处理——20.4.1

该段代码写在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&amp;autocommit=false&amp;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;
		
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值