Spring JdbcTemplate - Insérer le blob et retourner la clé générée
De la source JDBC de la documentation, je sais comment insérer un blob à l'aide de JdbcTemplate
final File blobIn = new File("spring2004.jpg");
final InputStream blobIs = new FileInputStream(blobIn);
jdbcTemplate.execute(
"INSERT INTO lob_table (id, a_blob) VALUES (?, ?)",
new AbstractLobCreatingPreparedStatementCallback(lobhandler) {
protected void setValues(PreparedStatement ps, LobCreator lobCreator)
throws SQLException {
ps.setLong(1, 1L);
lobCreator.setBlobAsBinaryStream(ps, 2, blobIs, (int)blobIn.length());
}
}
);
blobIs.close();
Et aussi comment récupérer la clé générée d'une nouvelle ligne insérée:
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(INSERT_SQL, new String[] {"id"});
ps.setString(1, name);
return ps;
}
},
keyHolder);
//keyHolder.getKey() now contains the generated key
Est-il un moyen que je pouvais combiner les deux?
source d'informationauteur itsadok
Vous devez vous connecter pour publier un commentaire.
Je suis venu ici à la recherche pour la même réponse, mais n'était pas satisfait de ce qui a été accepté. J'ai donc fait un peu de creuser autour et est venu avec cette solution que j'ai testé dans Oracle 10g et le Printemps 3.0
cela nécessite aussi la suite de la classe abstraite, fondée en partie sur le Printemps AbstractLobCreatingPreparedStatementcallback
Aussi, le tableau que vous créez dans Oracle doit avoir une clé auto-incrémentée pour l'id à l'aide d'une séquence et la détente. Le déclencheur est nécessaire car sinon vous auriez à utiliser le Printemps NamedParameterJdbcOperations (à faire la séquence.nextval dans votre SQL) qui ne semble pas avoir de support pour porte-clés (que j'utilise pour récupérer l'auto-gen id). Consultez cet article de blog (pas mon blog) pour plus d'info: http://www.lifeaftercoffee.com/2006/02/17/how-to-create-auto-increment-columns-in-oracle/
Tout cela semblait trop compliqué pour moi. Cela fonctionne et est simple. Il utilise
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
J'ai fini par la simple exécution de deux requêtes, l'une pour créer la ligne et une mise à jour de la goutte.
En regardant le source code et d'en extraire les pièces nécessaires, je suis venu avec cette:
Je ne peux pas dire que je comprends tout à fait ce qui se passe ici. Je ne suis pas sûr si la complexité de la méthode pour extraire la clé générée est nécessaire dans ce cas simple, et je ne suis pas tout à fait clair au sujet de l'avantage de même à l'aide de JdbcTemplate lorsque le code de ce poilu.
De toute façon, j'ai testé le code ci-dessus et il fonctionne. Pour mon cas, j'ai décidé qu'il ne ferait que compliquer mon code de trop.
Dans le cas où votre base de données est mysql, vous pouvez générer automatiquement votre clé primaire. Puis d'insérer un enregistrement dans votre base de données, vous pouvez utiliser la syntaxe suivante pour l'insertion:
En 2012,
SimpleJdbcTemplate
est obsolète. C'est ce que j'ai fait:SQL ressemble à ceci:
C'est testé sur MySql seulement et j'ai collé uniquement la partie pertinente.
Après l'Exécution de ma classe de test, le résultat est illustré ci-dessous:
"enregistrement ajouté par modèle.mise à jour(cfp), kh): 1 ajouté et a obtenu 36"
Une autre solution avec lambda (qui n'est pas nécessaire):
NB. Désolé, ce n'inclut pas KeyGenerator.
Peut-être que certains comme ceci:
Veuillez utiliser: