2017-03-01 4 views
1
String SQL = "INSERT INTO Employee (name, age, salary) VALUES (:name,:age,:salary)"; 
Map namedParameters = new HashMap(); 
namedParameters.put("name", name); 
namedParameters.put("age", age); 
namedParameters.put("salary", salary); 
namedParameterJdbcTemplate.update(SQL, namedParameters); 

String SQL = "UPDATE Employee SET age = :age WHERE empid = :empid"; 
SqlParameterSource namedParameters = new MapSqlParameterSource(); 
namedParameters.addValue("age", age); 
namedParameters.addValue("empid", empid); 
namedParameterJdbcTemplate.update(SQL, namedParameters); 

Semble à la fois Map et SqlParameterSource sont identiques. Mais pourquoi les développeurs API ont-ils ajouté ces API? Existe-t-il un scénario particulier pour utiliser Map ou SqlParameterSource, ce qui accélère l'exécution? S'il vous plaît expliquez-moi clairement. Merci d'avance.Quand utiliser Map et SqlParameterSource dans namedParameterJdbcTemplate?

Répondre

2

L'utilisation d'une carte convient aux cas simples, mais l'utilisation de SqlParamaterSource sur une carte présente deux avantages.

Le premier est simplement le modèle de générateur vous permettant d'ajouter plusieurs valeurs en ligne (namedParameters.addValue(). AddValue(). AddValue() etc).

La seconde est plus puissante. Le jdbcTemplate déterminera automatiquement le sqlType de vos valeurs de carte tandis que le SqlParamaterSource vous permet d'utiliser explicitement le sqlType de votre choix. Cela peut poser problème selon votre base de données, vos index et vos paramètres.

Un exemple serait Integers et Longs avec une base de données Oracle. Le template jdbc ajoutera ces objets à votre requête avec des guillemets entourants '' les rendant effectivement des chaînes dans votre requête de base de données. Si vous avez un nombre dans votre base de données avec 0 premiers, il ne sera pas trouvé parce que '0XXXX' ne correspondra pas 'XXXX'. Si vous passez le bon sqlType, le template jdbc effectuera une comparaison de nombres sans guillemets donc XXXX sera égal à XXXX.

0

Lorsque mes valeurs de place titulaire sont de types différents, ce (MapSqlParameterSource) m'a vraiment aidé:

String SQL = "UPDATE Employee SET joindate = :joinDate WHERE empid = :empid"; 

MapSqlParameterSource namedParameters = new MapSqlParameterSource(); 

    namedParameters.addValue("date", joinDate, Types.Date); 
    namedParameters.addValue("empid", empid, Types.Integer); 
    namedParameterJdbcTemplate.update(SQL, namedParameters);