Ахилеш, это один из способов, который приходит мне в голову (см. Ниже).Я также изучаю Ibatis / MyBatis и постепенно овладеваю им.Я так понимаю, вы хотите, чтобы несколько вставок / обновлений были включены в одну транзакцию (с точки зрения производительности)?Подобно пакетному обновлению, оберните пакет в одну транзакцию.Этот пример основан на IBatis 2.3.4
В вашем классе DAO вы можете иметь
final SqlMapClient sqlMap = getSqlMapClient();
try {
sqlMap.startTransaction();
sqlMap.startBatch();
for (final ClientDetails clientXXX : clientDetailsList) {
createOrUpdateClientDetails(sqlMapClient, clientXXX);
createOrUpdateClientAddressDetails(sqlMapClient, clientXXX.getAddressDetails());
createOrUpdateOtherXXXDetails(clientXXX.getXXXXX); //have similar private method
}
sqlMap.executeBatch();
sqlMap.commitTransaction();
} catch (final SQLException e) {
throw new XXXException(e);
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
throw new XXXException(e);
}
}
private void createOrUpdateClientDetails(final SqlMapClient sqlMap, final List<ClientDetails> clientDetails) {
for (final ClientDetails client: clientDetails) {
if (client.getId() != null) {
sqlMap.update("updateClientXXX", client); //your sqlmap method
} else {
sqlMap.insert("createClientXXX", client); //your sqlmap method
}
}
}
Однако учтите, что всякий раз, когда вы используете пакетный набор операторов, ключи, сгенерированные базой данных, не будутгенерироваться до тех пор, пока вы не вызовете метод executeBatch ().Это означает, что если вы используете selectKey
для обновления ваших объектов сгенерированным ключом (ключами), они будут возвращать ноль. Если у вас есть какой-либо объект, для которого требуется новый сгенерированный ключ как часть другой зависимой вставки, тогда вы можете использовать эту вставку / родительскую вставку до startBatch () .Например, для AddressDetails и PhoneDetails customer_id будет иметь значение FK?
Я бы еще раз посмотрел на ваш родительский класс ClientDetails и посмотрел, можно ли это упростить, если это возможно.Опять же, я не уверен, что вы придерживаетесь такого подхода, но я подумал поделиться тем, что имел в виду.Спасибо