原生jdbc,将List数据切割后批量插入数据库

本文介绍了一种使用JDBC优化SQL Server数据批量插入的方法,通过将大量数据分割成小批次,并利用PreparedStatement的批处理功能,显著提高了数据插入的效率。文章详细展示了如何实现数据切割和批处理插入,以及具体的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司用的系统比较老,不能上框架,因此用原生jdbc。
原来的程序员写的一条一条插入,又慢又容易报error。
没办法,老夫上网找了资料,重新改写程序。

一、传入list,进行切割

// 数据传输,为提高插入效率,对数据进行切割
		int ls = list.size();
        int size = 1000;
		if (ls <= size) {
			// 若数据量小于size时,直接插入
			insertDulDataForSqlServer(list);
		} else {
			int times = (int) Math.ceil(ls / size);
			System.out.println("总插入批次   times: " + times);
			for (int i = 0; i <= times; i++) {
				System.out.println("截取的开始角标" + i * size + "  截止角标" + Math.min((i + 1) * size, ls) + " min"
						+ (i + 1) * size + " max" + ls);
				// Math.min()方法,取较小值
				List<Policy> subList = list.subList(i * size, Math.min((i + 1) * size, ls));
				// 插入
				insertDulDataForSqlServer(subList);
			}
		}

二、执行bean转化并插入

private void insertDulDataForSqlServer(List<Policy> list) throws SQLException {
		//连接数据库
		Connection conn = DBConnection();
		try {
				PreparedStatement stmt = conn
					.prepareStatement("insert into dbo.BC_CONTROL_INSURANCE values(?,?,?,?,?)");
			// 执行
			for (Policy bean : list) {
				preparedStatementStringSetter(stmt, 1, bean.getNo());
				preparedStatementStringSetter(stmt, 2, "");
				preparedStatementStringSetter(stmt, 3, bean.getIn());
				preparedStatementStringSetter(stmt, 4, bean.getPolicy());
				preparedStatementDateSetter(stmt, 5, bean.getDat());
				
				stmt.addBatch();

			}
			stmt.executeBatch();
			System.out.println("执行插入语句:");
			// 提交需要执行的语句
			conn.commit();
			stmt.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

到此基本结束,

后面最多给个jdbc连接

private Connection DBConnection() {

		String url = "jdbc:microsoft:sqlserver://ip;databaseName=DB_TRANS";
		String userString = "x";
		String pwd = "123";

		Connection conn = null;
		try {
			return conn = DriverManager.getConnection(url, userString, pwd);
		} catch (SQLException e) {
			//因为公司网络垃圾,怕连不上数据库,所以连接两次
			try {
				return conn = DriverManager.getConnection(url, userString, pwd);
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		return conn;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值