2012-11-12 7 views
8

Die Datenbankmethoden in Spring JDBC akzeptieren eine einzelne Parameterquelle. Zum Beispiel -Wie können mehrere Parameterquellen in Spring JDBC kombiniert werden?

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

Ist es möglich, mehrere Parameterquellen miteinander zu kombinieren? Angenommen, ich habe eine Bohne Order -

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

ich diese Bohne mit einigen zusätzlichen Bereichen wie recordModificationTime und accessLevel speichern möchten. Wenn ich MapSqlParameterSource für diese zusätzlichen Felder verwende, die außerhalb der Bean existieren, kann ich BeanPropertySqlParameterSource nicht verwenden, da die Methode nur eine Parameterquelle akzeptiert. Wenn ich für alle meine Daten MapSqlParameterSource verwenden muss, muss ich alle Bean-Eigenschaften manuell extrahieren, was eine Menge Arbeit bedeutet.

Was ist der beste Weg, um mit diesem Problem umzugehen?

Antwort

12

Sie können AbstractSqlParameterSource erweitern und aggregieren beide BeanProperty und Map-Versionen:

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); 
    } 
} 

Und jetzt ist es wie folgt verwenden:

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

jdbcTemplate.update(sql, mySource); 
+0

Dank @dei änderte Rückgabetyp auf getValue. – mrembisz