batchSave部分字段为空

表结构如下:

CREATE TABLE `x_test` (
 `id` int(11) NOT NULL,
  `pid` int(11) DEFAULT NULL,
  `name` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

代码如下:

public static void main(String[] args) {
        //连接数据库
	start();

	List<Record> res = new ArrayList<>();
	res.add(new Record().set("id", "110000").set("name", "北京市"));
	res.add(new Record().set("id", "110100").set("pid", "110000").set("name", "市辖区"));

	// 使用批量增加后pid全部为空,但是明显有pid不为空的数据
	// Db.batchSave("x_test", res, 2);

	// 一个一个的保存时就不会出现这个问题
	for (Record record : res) {
		Db.save("x_test", record);
	}

	try {
	        //关闭数据库
		stop();
	} catch (Exception e) {
		e.printStackTrace();
	}
}


要存两条数据,一条为北京市,没有父ID,一条为市辖区,父ID为北京市的ID
使用Db.batchSave时,保存的两条数据父ID全为空


评论区

JFinal

2017-09-07 15:20

batchSave 方法会以第一条数据为蓝本生成一个 sql , 而这个 sql 是后续所有数据都共同依赖的

我猜测是你的 List 中的第一个 record 少一个字段,而后续的 record 需要这个字段,确保一下第一个 record 对象能够做为蓝本就可以

这个是由 jdbc 的 batch 机制决定的,batch 需要共享一条 sql,然后所有数据直接 addBatch 进来,一次性提交,以此来提升效率,所以你必须保证生成的这条 sql 是正确的,即:保证 list 中第一个 record 生成的 sql 是可共享的

edeye

2017-09-07 16:34

好的,谢谢~

热门反馈

扫码入社