表结构如下:
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
我猜测是你的 List 中的第一个 record 少一个字段,而后续的 record 需要这个字段,确保一下第一个 record 对象能够做为蓝本就可以
这个是由 jdbc 的 batch 机制决定的,batch 需要共享一条 sql,然后所有数据直接 addBatch 进来,一次性提交,以此来提升效率,所以你必须保证生成的这条 sql 是正确的,即:保证 list 中第一个 record 生成的 sql 是可共享的