java - 如何在 Java 中选择一行并更新它?
问题描述
我正在尝试编写具有数据库连接性的 BankingApp。现在,我正在努力更新用户的余额。用户输入他存入的金额,然后从数据库中取出余额并将金额添加到其中,至少我是这么想的。
我会展示我尝试过的。
编辑:我放了第二个 PreparedStatement 并使用该语句执行了第二个查询,但它仍然无法正常工作。
public void deposit(){
System.out.println("How much money do u want to deposit?");
int val = sc.nextInt();
try {
String query = "SELECT Balance FROM accounts.accs where AccountNumber =" + 654321 + "";
Connection con = DriverManager.getConnection(url,username,password);
PreparedStatement stmt = con.prepareStatement(query);
ResultSet rs = stmt.executeQuery(query);
while (rs.next()){
int balance = rs.getInt("Balance");
System.out.println("test");
int updatedBalance = balance+val;
System.out.println("the updatetbalance is" + updatedBalance +"");
String query2 = "UPDATE accs" +
"SET Balance = " + updatedBalance +"" +
"WHERE AccountNumber =" + 654321 +"";
PreparedStatement stmt2 = con.prepareStatement(query);
stmt2.executeUpdate(query2);
con.commit();
}
updatedBalance 在控制台中显示正确,但在数据库中没有更新。我究竟做错了什么?
解决方案
第一件事:不要使用连接输入参数。它很容易发生SQL 注入。
第二:您使用的是哪个 DBMS?可以使用update-from-select语句通过单个查询来完成此更新。语法可能因数据库而异,所以我不会给你一个例子,但你绝对应该考虑使用这个选项。您可以在数据库文档中查找它。
最后,这是使用两个PreparedStatement
应该适合您的代码:
public void deposit() throws SQLException {
System.out.println("How much money do u want to deposit?");
int val = sc.nextInt();
int accountNumber = 654321;
String query = "SELECT Balance FROM accounts.accs where AccountNumber = ?";
try( Connection con = DriverManager.getConnection(url,username,password);
PreparedStatement stmt = con.prepareStatement(query)) {
stmt.setInt(1, accountNumber);
ResultSet rs = stmt.executeQuery();
String query2 = "UPDATE accs " +
"SET Balance = ? " +
"WHERE AccountNumber = ?";
try (PreparedStatement stmt2 = con.prepareStatement(query2)) {
while (rs.next()){
int balance = rs.getInt("Balance");
System.out.println("test");
int updatedBalance = balance+val;
System.out.println("the updatetbalance is" + updatedBalance +"");
stmt2.setInt(1, updatedBalance);
stmt2.setInt(2, accountNumber);
stmt2.executeUpdate();
}
}
}
}
推荐阅读
- python - 我得到 form.is_valid() false
- sql - 在 HIVE 中转置数据
- bash - 如何从 Git 配置中删除单个包含路径?
- topic-modeling - Mallet:通过 N-gram 进行标记化 (1,2)
- java - 如何将整个 Arraylist 传递给另一个活动
- angular - 如何在项目之间共享 Angular 组件
- laravel - Laravel : 如何从本地网络访问 laravel 应用程序
- javascript - 如果从数组 var 而不是 Google Apps 脚本中的 range.getDisplayValues() 手动创建二维数据,则不会填充数据表
- swift - Swift MVVM ViewModel UIViewRepresentable:初始化实例
- java - 如何为 netty 选择合适的 chunkSize 和 numDirectArenas