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

时间:2014-09-19 08:13:55

标签: java mysql sql jdbc

我必须将值从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()上,它的递增和表单中的值存储在一行中,在下一行中,存储了注册表和登录表中的值。如何将所有这些存储在一行中?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

您正在进行3次插入,因此至少会创建3行。此外,当您执行SELECT CustId FROM signup时,如何确保只从CustId表中获取signup的一个正确值?使用此查询,您将获取所有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);