我必须将值从jsp表单插入到数据库表和同一个表中,我需要为两个不同的表中的两列插入值。
以下是代码:
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()上,它的递增和表单中的值存储在一行中,在下一行中,存储了注册表和登录表中的值。如何将所有这些存储在一行中?任何帮助表示赞赏。
答案 0 :(得分:3)
您正在进行3次插入,因此至少会创建3行。此外,当您执行SELECT CustId FROM signup
时,如何确保只从CustId
表中获取signup
的一个正确值?使用此查询,您将获取所有CustId
。 login
表和查询也是如此。
要解决您的问题,您必须创建一个查询:
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);