2012-11-12 15 views
8

Metody baz danych w Spring JDBC akceptują pojedyncze źródło parametrów. Na przykład -Jak połączyć wiele źródeł parametrów w Spring JDBC?

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

Czy można łączyć ze sobą wiele źródeł parametrów? Na przykład załóżmy, że mam Bean Order -

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

Chcę zapisać Bean z dodatkowymi polami jak recordModificationTime i accessLevel.

Jeśli używam MapSqlParameterSource dla tych dodatkowych pól, które istnieją poza fasoli, nie mogę używać BeanPropertySqlParameterSource ponieważ metoda akceptuje tylko jedno źródło parametru. Konieczność użycia MapSqlParameterSource dla wszystkich moich danych oznacza, że ​​muszę ręcznie wyodrębnić wszystkie właściwości komponentu bean, co wymaga dużo pracy.

Jaki jest najlepszy sposób na rozwiązanie tego problemu?

Odpowiedz

12

można rozszerzyć AbstractSqlParameterSource i agregować obie wersje BeanProperty i mapa:

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

A teraz używać go tak:

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

jdbcTemplate.update(sql, mySource); 
+0

Dzięki @dei zmienił typ zwracany na getValue. – mrembisz

Powiązane problemy