Deux déclarations préparées différentes dans un seul lot
Je veux envoyer deux déclarations préparées en un seul lot.
Actuellement, je suis en train de faire cela en deux comme vous pouvez le voir dans les lignes commentées et il fonctionne, mais ce n'est pas l'objectif principal ici. Quelqu'un peut me dire quoi mettre à la place de ces observations pour obtenir cette chose de travailler?
import java.lang.ClassNotFoundException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.DriverManager;
public class Main
{
public static void main(String[] args)
{
Connection connection = null;
PreparedStatement preparedStatementWithdraw = null;
PreparedStatement preparedStatementDeposit = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/youtube", "root", "root");
preparedStatementWithdraw = withdrawFromChecking(connection, preparedStatementWithdraw, new BigDecimal(100), 1);
preparedStatementDeposit = depositIntoSaving(connection, preparedStatementDeposit, new BigDecimal(300), 1);
//preparedStatementDeposit.executeBatch();
//preparedStatementWithdraw.executeBatch();
System.out.println("Account Modified!");
}
catch(ClassNotFoundException error)
{
System.out.println("Error: " + error.getMessage());
}
catch(SQLException error)
{
System.out.println("Error: " + error.getMessage());
}
finally
{
if(connection != null) try{connection.close();} catch(SQLException error) {}
if(preparedStatementDeposit != null) try{preparedStatementDeposit.close();} catch(SQLException error) {}
}
}
public static PreparedStatement withdrawFromChecking(Connection connection, PreparedStatement preparedStatement, BigDecimal balance, int id) throws SQLException
{
preparedStatement = connection.prepareStatement("UPDATE bankAccount SET checkingBalance = checkingBalance - ? WHERE id = ?");
preparedStatement.setBigDecimal(1, balance);
preparedStatement.setInt(2, id);
preparedStatement.addBatch();
return preparedStatement;
}
public static PreparedStatement depositIntoSaving(Connection connection, PreparedStatement preparedStatement, BigDecimal balance, int id) throws SQLException
{
preparedStatement = connection.prepareStatement("UPDATE bankAccount SET savingBalance = savingBalance + ? WHERE id = ?");
preparedStatement.setBigDecimal(1, balance);
preparedStatement.setInt(2, id);
preparedStatement.addBatch();
return preparedStatement;
}
}
source d'informationauteur gmustudent | 2012-10-19
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas exécuter deux états en un seul lot. @Dan mentionné que vous pouvez-et doit -- les faire en une seule opération.
Une autre option est d'utiliser une procédure stockée qui peut tout faire dans un seul aller-retour vers le serveur, tout en conservant les avantages de la transaction unique
Vous pouvez essayer d'exécuter les deux déclaration est d'une seule opération, comme ceci:
Le problème est que addBatch fonctionne sur une seule déclaration préparée à l'avance, voir c'est comment vous pouvez utiliser plusieurs instructions sql avec addBatch.
Lorsque vous parlez de PreparedStatementun lot est associé à cette PreparedStatement de l'objet lot de commandes et PAS l'inverse. Vous devriez regarder la javadoc pour
addBatch()
méthode pour en savoir plus à ce sujet.Donc dans votre cas, voici ce que j'aurais fait:
De sorte que votre code devrait ressembler à quelque chose comme ceci:
Je pense que vous souhaitez fusionner votre déclaration de requêtes sous forme de l'un et de faire quelque chose comme ceci: