Spring JDBC Modèle pour l'appel de Procédures Stockées
Quelle est la bonne manière pour appeler des procédures stockées à l'aide de jour moderne (vers 2012) Spring JDBC Modèle?
Dire, j'ai une procédure stockée qui déclare deux IN
et OUT
paramètres, quelque chose comme ceci:
mypkg.doSomething(
id OUT int,
name IN String,
date IN Date
)
Je suis venu à travers CallableStatementCreator
des approches fondées sur où nous avons à inscrire explicitement IN
et OUT
paramètres. Considérons la méthode suivante dans JdbcTemplate
classe:
public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters)
Bien sûr, je sais que je peux l'utiliser comme ça:
List<SqlParameter> declaredParameters = new ArrayList<SqlParameter>();
declaredParameters.add(new SqlOutParameter("id", Types.INTEGER));
declaredParameters.add(new SqlParameter("name", Types.VARCHAR));
declaredParameters.add(new SqlParameter("date", Types.DATE));
this.jdbcTemplate.call(new CallableStatementCreator() {
@Override
CallableStatement createCallableStatement(Connection con) throws SQLException {
CallableStatement stmnt = con.createCall("{mypkg.doSomething(?, ?, ?)}");
stmnt.registerOutParameter("id", Types.INTEGER);
stmnt.setString("name", "<name>");
stmnt.setDate("date", <date>);
return stmnt;
}
}, declaredParameters);
Quel est le but de declaredParameters
quand je suis déjà en les enregistrant dans mon csc
mise en œuvre? En d'autres termes, pourquoi aurais-je besoin de passer dans un csc
quand le printemps peut tout simplement con.prepareCall(sql)
en interne? Fondamentalement, je ne peux pas passer dans l'un d'eux au lieu de deux?
Ou, est-il une bien meilleure façon d'appeler des procédures stockées (à l'aide de Spring JDBC Modèle) que ce que j'ai pu rencontrer jusqu'à présent?
Remarque: Vous pouvez trouver bon nombre de questions qui semblent avoir un titre similaire, mais ils ne sont pas les mêmes que celui-ci.
- Je peux voir que cette question est très populaire aujourd'hui et il a déjà plus de 2 ans que cela a été demandé. Si quelqu'un pense qu'il y a encore de mieux que d'appeler des procédures stockées maintenant que le Printemps 4 est sorti, merci de poster une réponse ou suggérer une modification.
Vous devez vous connecter pour publier un commentaire.
Il y a un certain nombre de façons d'appeler des procédures stockées au Printemps.
Si vous utilisez
CallableStatementCreator
de déclarer les paramètres, vous allez être en utilisant Java de l'interface standard deCallableStatement
, j'.e registre des paramètres et de les définir séparément. À l'aide deSqlParameter
l'abstraction permet de rendre votre code plus propre.Je vous recommande de regarder
SimpleJdbcCall
. Il peut être utilisé comme ceci:De procédures simples, vous pouvez utiliser
jdbcTemplate
'supdate
méthode:SimpleJdbcCall
semble vraiment cool. Je vais tester cela et vous laisser savoir comment elle réussi dans mon cas.SimpleJdbcCall
. Je vous remercie."cannot invoke update on null object"
.jdbcTemplate.update("call SOME_PROC (?, ?)", param1, param2);
ne parvient pas, pour moi aussi avec l'erreurorg.postgresql.util.PSQLException: ERROR: syntax error at or near "call"
lorsqu'il est invoqué commegetNamedParameterJdbcTemplate().update("call API.UPSERT_TOKEN(:token, :email)", params)
?, ?
au lieu de:token, :email
jdbcTemplate.update("{ call my_schema.my_pkg.SOME_PROC (?, ?) }", param1, param2);
(note les accolades).SQL update affected 0 rows
lorsque les lignes ont été effectivement touchés?new SqlInOutParameter(paramName,Types.VARCHAR)
de sorte qu'ils seront inclus dans le retour de la CarteSimpleJdbcCall
a des pièges. Code pourrait coincé siSimpleJdbcCall
est partagé entre plusieurs threadsVoici les différentes façons d'appeler des procédures stockées à partir de java
1. À L'Aide De CallableStatement:
Ici, nous avons l'extérieur de gérer la ressource de clôture
2. À L'Aide De CallableStatementCreator
3. Utilisation SimpleJdbcCall:
4. Utilisation StoredProcedure classe org.springframework.jdbc.objet
Référence
En général, je préfère élargir le Printemps en fonction
StoredProcedure
de la classe à exécuter des procédures stockées.Vous avez besoin pour créer votre constructeur de la classe et de la nécessité d'appeler
StoredProcedure
constructeur de la classe en elle. Cette super-classe constructeur accepte de source de données et le nom de la procédure.Exemple de code:
Remplacer méthode execute de l'appel de procédure stockée comme ci-dessous
Espère que cela vous aide.
Une façon de plus de faire appel de la procédure stockée est:
Dans cet exemple 'ClientInvestigateDTO' est la classe POJO et "ClientInvestigateMapper' est le mappeur de classe.'client' stocke le résultat que vous obtenez sur l'appel de la procédure stockée.