2014-09-19 100 views
0

我必須從jsp表單插入值到數據庫表和我需要插入2個不同表中的兩列的值相同的表。如何在mysql中編寫單個查詢以進行多個數據操作?

下面是代碼:

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()其遞增,並從表格中的值被存儲在一行和下一行中從註冊和登錄表中的值越來越存儲。如何使所有這些被存儲在一行中?任何幫助表示讚賞。

+1

如何通過選擇查詢獲取custId和loginId,然後只插入一個插入查詢? – irene 2014-09-19 08:23:31

+0

@Narmer那麼該如何解決? – user3349720 2014-09-19 08:25:45

+0

@irene你可以讓我知道如何做到這一點? – user3349720 2014-09-19 08:26:37

回答

2

您正在做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); 
+0

如何獲取id? – user3349720 2014-09-19 09:01:00

+0

在您的問題中添加您的表格定義。你應該在表格之間有一個共同的列,並使用它來獲取正確的ID。 – Narmer 2014-09-19 09:02:45

+0

實際上它反對一個註冊表,它在提交他的名字姓氏,郵件,手機號碼在註冊表中。註冊有一個主鍵CustId(這是一個用於登錄和忘記密碼錶的外鍵)。用戶名和密碼位於登錄表中。登錄表具有主密鑰LoginId,它是Forgotpassword表的外鍵。並且祕密的問答將坐在忘記密碼錶中。所以爲了傳遞這些外鍵CustId和LoginId,一些值正在掙扎中。請幫助我,以便我可以獲取這些ID並將它放在where子句中,因爲您已經顯示 – user3349720 2014-09-19 09:06:01

相關問題