gpt4 book ai didi

java - 如何在 mysql 中为多个数据操作编写单个查询?

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:16 24 4
gpt4 key购买 nike

我必须将值从 jsp 表单插入到数据库表,然后再插入同一个表,我需要为来自 2 个不同表的两列插入值。

代码如下:

public class ForgotPassWordDAO {

private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

public void createSecretQnA(ForgotPassWord forgotPassWord) {
String sql = "INSERT INTO forgotpassword (PwdId,SecretQuestion1,SecretAnswer1,SecretQuestion2,SecretAnswer2)VALUES(?,?,?,?,?)"; // Here am inserting form values to database.
String sql1="INSERT INTO forgotpassword (CustId) SELECT CustId FROM signup";// Here am trying to get value from another table and insert
String sql2="INSERT INTO forgotpassword (LoginId) SELECT LoginId FROM login"; // Here am trying to get value from another table and insert
Connection conn = null;

try {
conn = dataSource.createConnection();
PreparedStatement ps = conn.prepareStatement(sql);
PreparedStatement ps1 = conn.prepareStatement(sql1);
PreparedStatement ps2 = conn.prepareStatement(sql2);
ps.setInt(1, forgotPassWord.getId());
ps.setString(2, forgotPassWord.getSq1());
ps.setString(3, forgotPassWord.getAnSq1());
ps.setString(4, forgotPassWord.getSq2());
ps.setString(5, forgotPassWord.getAnSq2());
ps.executeUpdate();
ps1.executeUpdate();
ps2.executeUpdate();
ps.close();

} catch (SQLException e) {
throw new RuntimeException(e);

}

catch (NullPointerException e1){

}
finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}

}

但在每个 executeUpdate() 中,它的递增和来自表单的值存储在一行中,而在下一行中,来自注册和登录表的值被存储。如何让所有这些都存储在一行中?感谢您的帮助。

最佳答案

您正在进行 3 次插入,因此至少创建了 3 行。此外,当您执行 SELECT CustId FROM signup 时,您如何确保从 signup 表中仅获取一个正确的 CustId 值?通过此查询,您将获取所有 CustIdlogin 表和查询也是如此。

要仅解决您的问题,您必须创建一个查询:

String sql =  "INSERT INTO forgotpassword (PwdId,SecretQuestion1,SecretAnswer1,SecretQuestion2,SecretAnswer2,CustId,LoginId)VALUES(?,?,?,?,?,(SELECT CustId FROM signup),(SELECT LoginId FROM login))"; 
^ ^ ^ ^

但我认为您还没有想够。

应该是这样的:

SELECT LoginId FROM login WHERE CustId=? //Here I'm guessing, I don't know your tables.

重点是在 login 表和 signup 表中获取与忘记密码的用户相对应的正确值。这可以通过 WHERE 子句轻松完成(假设您的外键设置正确)。


编辑

根据您的评论,我将阐明您应该添加新用户的方式。

首先您需要创建新用户,因此一旦发送并检查了所需的信息,您就可以在 signup 表中插入一个新行。但是等待执行查询。

您需要 CustId。因为是自增列,你不知道MySQL创建了哪个值。您必须获取它,您可以在创建新用户时直接执行此操作,将参数添加到准备好的语句中:

PreparedStatement pstmt = conn.prepareStatement(sqlForNewUser, Statement.RETURN_GENERATED_KEYS);  
pstmt.executeUpdate();
ResultSet keys = pstmt.getGeneratedKeys();
keys.next();
custId = keys.getInt(1);

现在您有了新的用户 ID,可以用它来插入其他值:

String sql =  "INSERT INTO forgotpassword (PwdId,SecretQuestion1,SecretAnswer1,SecretQuestion2,SecretAnswer2,CustId,LoginId)VALUES(?,?,?,?,?,(SELECT CustId FROM signup WHERE CustId = ?),(SELECT LoginId FROM login WHERE CustId = ?))";
//...
ps.setString(6, custId);
ps.setString(7, custId);

关于java - 如何在 mysql 中为多个数据操作编写单个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com