Java 使用JDBC批插入到具有外键的多个表
我正在编写一个方法,该方法接收树结构并将其插入数据库,其中每个分支都是另一个数据库表。 例如:Java 使用JDBC批插入到具有外键的多个表,java,jdbc,insert,batch-processing,relation,Java,Jdbc,Insert,Batch Processing,Relation,我正在编写一个方法,该方法接收树结构并将其插入数据库,其中每个分支都是另一个数据库表。 例如: tree = { "_id": "111", "field1": "", "field2": "", "field3": { "_id": "333", "_parent_id": "111", "field3_1": "", "field3_2": "", "field3_3": [
tree = {
"_id": "111",
"field1": "",
"field2": "",
"field3": {
"_id": "333",
"_parent_id": "111",
"field3_1": "",
"field3_2": "",
"field3_3": [
{
"_id": "1",
"_parent_id": "333",
"field3_3_1": ""
},
{
"_id": "2",
"_parent_id": "333",
"field3_3_1": ""
},
{
"_id": "3",
"_parent_id": "333",
"field3_3_1": ""
}
]
}
}
应该对应于三个表:tree、field3和field3_3-它们在_id和_parent_id上有关系。
每个分支可以是单个值、表或对象,基本上树是动态结构,对应于PostgreSQL数据库中的某些数据结构。
我正在使用jdbc将数据插入数据库。当用户可能提供具有多个分支或多个分支值的大树时,插入此类数据的最佳方式是什么?
我在想这样一句话:
with first_insert as(
insert into sample(firstname, lastname)
values('fai55', 'shaggk')
RETURNING id
),
second_insert as(
insert into sample1(id, adddetails)
values
((select id from first_insert), 'ss')
RETURNING user_id
)
但是,如果内部insert处理大批量记录(field3_3将为每个数据行包含100k条记录),那么问题就会出现
我已经使用PreparedStatement和executeBatch()实现了在单个DB级别上接受表和插入的方法,效果非常好。类似于此方法的任何内容,可用于树?如果树是动态结构,我认为您必须将收到的json解析为可以在Java中使用的内容 这样的事情可以通过使用和。假设您在
字符串数据中序列化了传入的json。然后您可以使用:
JSONObject dataJson = new JSONObject(data);
现在您可以在Java中使用此树结构。您可以使用dataJson.toString()
将其序列化回来,或者创建自定义序列化程序
如果问题是插入大小,可以循环使用dataJson
,并将其拆分为合理的块。例如,你可以使用这样的东西
JSONArray jsonArr = dataJson.getJSONArray("field3");
JSONArray dataAccumJsonArr = new JSONArray();
for (int i = 0; i < jsonArr.length(); i++) {
dataAccumJsonArr.put(jsonArr.get(i));
if (dataAccum.length() > 999) {
doInsert(dataAccumJsonArr);
dataAccumJsonArr = new JSONArray();
}
}
doInsert(dataAccumJsonArr);
JSONArray jsonArr=dataJson.getJSONArray(“field3”);
JSONArray dataAccumJsonArr=新的JSONArray();
for(int i=0;i999){
doInsert(数据采集器);
dataAccumJsonArr=新的JSONArray();
}
}
doInsert(数据采集器);
我通过以下方法解决了问题:
我从树的一个级别获取元素,并将其所有非对象值插入preparedStatement批处理中(它们位于一个表中),返回插入的记录ID。然后我获取每个插入元素的子元素,分配正确的父元素id,并将它们批量插入到另一个表和另一个表中。很好