我有经典的设置
public class Parent {
String name;
Collection<Child> children;
private class child{
string name;
}
}
现在我想首先在父表中插入父属性,然后获取id并最终存储子记录。在ibatis中实现相同的最佳方法是什么?
答案 0 :(得分:0)
您可以执行以下操作:使用iBatis(我正在使用iBatis版本2.3.4,因此这个例子基于此)。创建一批语句可以提高性能。同样重要的是要注意将批处理包装在单个事务中,就像它没有被包装一样,然后将为每个语句启动一个新事务(性能可能是一个问题,具体取决于我认为的批量大小)。
见下面的例子。您会注意到批处理startBatch()
的开始仅在更新或插入父记录后启动。这是因为在调用executeBatch()
之前,不会生成数据库生成的密钥。这意味着如果您使用selectKey
使用生成的密钥更新对象,则它们将返回null。这就是父记录的创建/更新在startBatch()
语句之前的原因。希望这有助于您作为一个例子。
try {
sqlMap.startTransaction();
if (parent.getId == null) {
sqlMap.insert("createParent", parent);
} else {
sqlMap.update("updateParent", parent);
}
sqlMap.startBatch();
for (final Child exapleChild: parent.getChildren()) {
exapleChild.setParentId(parent.getId);
sqlMap.insert("createChildForParent", objectReference1);
}
sqlMap.executeBatch();
sqlMap.commitTransaction();
} catch (final SQLException e) {
throw new XXXException(e);
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
throw new XXXException(e);
}
}