J'utilise NamedParameTejdbctOmbreTemplat pour effectuer une insertion dans une table. Le tableau utilise un prochain sur une séquence pour obtenir la clé primaire. Je veux ensuite que cet ID généré soit transmis à moi. J'utilise la mise en œuvre de la clé de la clé de printemps comme ceci: Cependant, lorsque j'exécute cette déclaration, je reçois: p> Toutes idées Il me manque? P> P>
5 Réponses :
Vous devez exécuter le La touche renvoyée de la base de données sera injectée dans le Exemple: P> jdbctemplate.Update (PreponStatementCreator P, Keyholder K) Code>.
Objet du titulaire de la clé CODE> . P>
final String INSERT_ORDER_STATEMENT
= "insert into order (product_id, quantity) values(?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(
Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(
INSERT_ORDER_STATEMENT, new String[] { "id" });
ps.setInt(1, order.getProductId());
ps.setInt(2, order.getQuantity());
return ps;
}
}, keyHolder);
Ceci est en train de retourner Rowid en titulaire et pas un nombre!
Je pense que vous utilisez la mauvaise méthode sur si oui, vous passez Le seul public code> Methode de mise à jour code> sur jdbctemplate code>. La seule des méthodes Code> Mettre à jour Code> qui semblerait correspondre à votre fragment de code est
params code> et
clé code> en tant que tableau VARGS de deux éléments et
jdbctemplate code> traite la touche code> sous forme de paramètres de liaison normale et à l'interpréter mal. P. >
jdbctemplate code> qui prend un porte-clés
p> est p>
trompeur, vérifiez ci-dessous la réponse de Konstantin
Il suffit de résoudre un problème similaire - avec Oracle, vous devez utiliser une autre méthode (à partir de avec des noms de keycolumns contenant des colonnes générées automatiquement, dans mon cas juste ["id"]. Sinon, tout ce que vous obtenez est Rowid. Voir NamedParameterjdbcoperations code>) -
Merci à cette réponse la question meilleure que les réponses précédentes et résolvez mon problème
Pas d'élaboration sur @konstantin Réponse: Voici un exemple de travail total: En supposant que la base de données est l'oracle et le nom de la colonne qui stocke généré ID est "généré" (peut être n'importe quel nom). Remarque: j'ai utilisé NamedParameterJDbctemPlappe.UPDate (....) Dans cet exemple, NOT PLUS JDBCTTELLALE CLASSE DE STREST.
public Integer insertRecordReturnGeneratedId(final MyObject obj) { final String INSERT_QUERY = "INSERT INTO MY_TABLE VALUES(GENERATED_ID_SEQ.NEXTVAL, :param1, :param2)"; try { MapSqlParameterSource parameters = new MapSqlParameterSource().addValue( "param1", obj.getField1() ).addValue( "param2", obj.getField1() ) ; final KeyHolder holder = new GeneratedKeyHolder(); this.namedParameterJdbcTemplate.update( INSERT_QUERY, parameters, holder, new String[] {"GENERATED_ID" } ); Number generatedId = holder.getKey(); // Note: USING holder.getKey("GENERATED_ID") IS ok TOO. return generatedId.intValue(); } catch( DataAccessException dataAccessException ) { } }
avec MySQL
CREATE TABLE `vets` ( `id` int(4) unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(30) DEFAULT NULL, `last_name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`), KEY `last_name` (`last_name`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; public @Data class Vet { private int id; private String firstname; private String lastname; } @Repository public class VetDaoImpl implements VetDao { /** Logger. */ private static final Logger LOGGER = LoggerFactory.getLogger(VetDaoImpl.class); private static final String INSERT_VET = "INSERT INTO vets (first_name, last_name) VALUES (:first_name, :last_name)"; @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; @Override public Number insertVet(final Vet vet) { MapSqlParameterSource paramSource = new MapSqlParameterSource(); paramSource.addValue("first_name", vet.getFirstname()); paramSource.addValue("last_name", vet.getLastname()); KeyHolder keyHolder = new GeneratedKeyHolder(); int nbRecord = namedParameterJdbcTemplate.update(INSERT_VET, paramSource, keyHolder, new String[] {"id" }); LOGGER.info("insertVet: id ["+keyHolder.getKey()+"]"); return nbRecord; } }