как я могу отобразить это эффективно в ibatis? - PullRequest
0 голосов
/ 09 февраля 2012

У меня ClientDetails в виде bean-компонента со структурой ниже:

public class ClientDetails{
    protected String id;
    protected String type;
    protected AddressDetails;
    protected PhoneDetails;
    //getters and setters follows...
}

public class AddressDetails{
     protected List<Address> address
    //getters and setters follows...
}

public Address{
    protected String addressType;
    protected String line1;
    protected String line2;
    protected String line3;
    //getters and setters follows...
}

public PhoneDetails{
    protected List<PhoneDetail> phoneDetail;
    //getters and setters follows...
}

public class PhoneDetail {

    protected String type;
    protected String phoneNumber;
   //getters and setters follows...
}

Таблицы в базе данных: ClientDetails, AddressDetails, PhoneDetails.

Я получу список ClientDetails на уровне обслуживания и долженвсегда обновляйте таблицу ClientDetails.AddressDetails, PhoneDetails будет необязательно обновляться (если не ноль).Как я могу отобразить это эффективно в ibatis?

1 Ответ

0 голосов
/ 09 февраля 2012

Ахилеш, это один из способов, который приходит мне в голову (см. Ниже).Я также изучаю 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 и посмотрел, можно ли это упростить, если это возможно.Опять же, я не уверен, что вы придерживаетесь такого подхода, но я подумал поделиться тем, что имел в виду.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...