2017-03-02 5 views
0

Ich habe im Frühjahr Dokumentation gelesen, dass MapSqlParameterSource nur ein Wrapper über Map ist. Was ist der Vorteil der Verwendung von MapSqlParameterSource anstelle von Map?mapqlparametersource vs java.util.map

public int countOfActorsByFirstName(String firstName) { 

    String sql = "select count(*) from T_ACTOR where first_name = :first_name"; 

    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName); 

    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class); 
} 




public int countOfActorsByFirstName(String firstName) { 

    String sql = "select count(*) from T_ACTOR where first_name = :first_name"; 

    Map<String, String> namedParameters = Collections.singletonMap("first_name", firstName); 

    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class); 
} 
+0

zur Zeit nichts zu verwenden:) fließend Methodenaufrufe, wie zu tun. Es ist ein Vermächtnis aus Zeiten, in denen Sie möglicherweise eine Java-Version verwenden, die keine Unterstützung für Generika bietet. – Kayaman

+1

Wie das Javadoc zeigt: eine flüssige API zum Auffüllen der Parameter, die Möglichkeit, SQL-Typen für die Parameter anzugeben. –

Antwort

1

Die MapSqlParameterSource ist nur ein Dekorateur eines LinkedHashMap, wenn Sie die MapSqlParameterSource überprüfen, sehen Sie dies:

private final Map<String, Object> values = new LinkedHashMap<String, Object>(); 

Es gibt nicht wirklich erhebliche Vorteile einer Karte oder Feder Implementierung verwenden.

Wenn Sie ein wenig auf dem Code graben, Sie addValue, unter dem Code verwenden können:

public MapSqlParameterSource addValue(String paramName, Object value) { 
    Assert.notNull(paramName, "Parameter name must not be null"); 
    this.values.put(paramName, value); 
    if (value instanceof SqlParameterValue) { 
     registerSqlType(paramName, ((SqlParameterValue) value).getSqlType()); 
    } 
    return this; 
} 

So, wie Sie sehen können addValue gibt das gleiche Objekt, das Sie verwenden können (wenn Sie mögen

.addValue("a", 1).addValue("b", 2)... 

Also, es ist nur eine Frage des Geschmacks Map oder MapSqlParameterSource

+0

Ein Nachteil der Verwendung von MapSqlParameterSource ist der fehlende Konstruktor 'new MapSqlParameterSource (MapSqlParameterSource)'. I. e. Sie können bereits gesetzte Parameter nicht erneut verwenden. Wenn ich beispielsweise einen Bericht erstelle, möchte ich das Start- und Enddatum eines Zeitraums für mehrere Anweisungen mit verschiedenen zusätzlichen Argumenten wiederverwenden. In diesem Fall muss ich eine konventionelle Map verwenden, damit ich folgendes machen kann: 'new MapSqlParameterSource (periodParams) .addValue (" additionalParam ", foobar);' –

Verwandte Themen