14

Spring JDBC のデータベース メソッドは、単一のパラメーター ソースを受け入れます。例えば ​​-

int org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(String sql, SqlParameterSource paramSource) throws DataAccessException

複数のパラメータ ソースを組み合わせることはできますか? たとえば、私が豆を持っているとしますOrder-

class Order {
int id;
float price;
int customerId;
Date date;
//Lots of other fields
}

recordModificationTimeこの Bean に、や などのフィールドを追加して保存したいと考えていますaccessLevel

MapSqlParameterSourceBean の外部に存在するこれらの追加フィールドに使用すると、メソッドがパラメーター ソースを 1 つしか受け付けないため、使用できませんBeanPropertySqlParameterSource。すべてのデータに使用するMapSqlParameterSource必要があるということは、すべての Bean プロパティを手動で抽出する必要があることを意味し、これは大変な作業です。

この問題に対処する最善の方法は何ですか?

4

1 に答える 1

21

AbstractSqlParameterSourceBeanProperty と Map の両方のバージョンを拡張および集約できます。

public class CombinedSqlParameterSource extends AbstractSqlParameterSource {
  private MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
  private BeanPropertySqlParameterSource beanPropertySqlParameterSource;

  public CombinedSqlParameterSource(Object object) {
    this.beanPropertySqlParameterSource = new BeanPropertySqlParameterSource(object);
  }

  public void addValue(String paramName, Object value) {
    mapSqlParameterSource.addValue(paramName, value);
  }

  @Override
  public boolean hasValue(String paramName) {
    return beanPropertySqlParameterSource.hasValue(paramName) || mapSqlParameterSource.hasValue(paramName);
  }

  @Override
  public Object getValue(String paramName) {
    return beanPropertySqlParameterSource.hasValue(paramName) ? beanPropertySqlParameterSource.getValue(paramName) : mapSqlParameterSource.getValue(paramName);
  }

  @Override
  public int getSqlType(String paramName) {
    return beanPropertySqlParameterSource.hasValue(paramName) ? beanPropertySqlParameterSource.getSqlType(paramName) : mapSqlParameterSource.getSqlType(paramName);
  }
}

そして今、次のように使用します。

CombinedSqlParameterSource mySource = new CombinedSqlParameterSource(myOrder);
mySource.addValue("recordModificationTime", time);
mySource.addValue("accessLevel", level);

jdbcTemplate.update(sql, mySource);
于 2012-11-12T09:37:44.320 に答える