Java MySQL PreparedStatement SELECT语句

时间:2012-03-08 16:47:25

标签: java prepared-statement

我有一个数据库和一个Java程序。我正在尝试编写代码,因此如果在文本字段中输入了MockID,并且按下了提交按钮,则应从数据库中检索根据输入的Mock ID的详细信息并显示在textarea中。下面是我写的代码。该代码现在在我做出修改后起作用。但是,在textarea中,它实际上并没有显示给定Mock Id的记录中的相关信息,而只是文本。 有人可以建议吗?

    JButton button = new JButton("Submit");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {


        String mockId = textField.getText();    

        try {

            String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?";    

            PreparedStatement prest = con.prepareStatement(sql);
            prest.setString(1, mockId);

            prest.executeQuery();
            textArea.append("MockID, Subject, Year, Date");
            JOptionPane.showMessageDialog(frmFindMock, "Record has been updated.");


        }

        catch (SQLException e) {
        //System.out.println("Record couldn't be added!");
        e.printStackTrace();
        JOptionPane.showMessageDialog(frmFindMock, "Record couldn't be updated. Please try again.");
        }
        }

        });

    button.setBounds(303, 60, 75, 23);
    panel_1.add(button);

5 个答案:

答案 0 :(得分:4)

        String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?";    

        PreparedStatement prest = con.prepareStatement(sql);
        prest.setString(1, "MockID");
        prest.setString(2, "Subject");
        prest.setString(3, "Year");
        prest.setString(4, "Date");

这就是问题所在。在你的sql字符串中,你为1个参数腾出了空间(由?表示),但是你试图设置为4.因此你已经超出了界限。此外,由于您将MockID,Subject,Year和Date硬编码到语句中,因此没有理由使用setString尝试设置它们(错误地)。

要在此处显示答案:

ResultSet rs = prest.executeQuery();
String result;
while(rs.next()) {
    String id = rs.getString("MockID");
    String subject = rs.getString("Subject");
    String year = rs.getString("Year");
    String Date = rs.getString("Date");
    result += id + ", " + subject + ", " + year + ", " + date + "\n";
}
textarea.append(result);

答案 1 :(得分:1)

您的PreparedStatement只有一个变量...... MockID

SELECT MockID,Subject,Year,Date FROM mockexam WHERE MockID =?.... so following statements

                prest.setString(2, "Subject");
                prest.setString(3, "Year");
                prest.setString(4, "Date");

不是必需的。

Update for your comments

对于由“?”表示的所有变量,我们setString ....这里只有MockId是变量.....如果你想使用“select,你可以检索整行*“......但仍然只有一个参数(用?表示)到PreparedStatement,那就是你的MockId

答案 2 :(得分:1)

?是绑定变量占位符。你只有1.那你为什么试图绑定4件事?

答案 3 :(得分:0)

“日期”不是列名的好选择。这是我所知道的每个数据库中的保留字。它对用户来说也不是很有用。生日?死亡日期?订购日期?这是什么意思?

我首先要更改为“EXAM_DATE”或其他内容,看看是否有帮助。

答案 4 :(得分:0)

String sql = "SELECT MockID, Subject, Year, Date FROM mockexam WHERE MockID =?";    

准备此声明时,您“说”您将为每个?提供一个值。 这里只有一个,但您稍后会定义其中的4个:

    PreparedStatement prest = con.prepareStatement(sql);
    prest.setString(1, "MockID");
    prest.setString(2, "Subject");
    prest.setString(3, "Year");
    prest.setString(4, "Date");

不要忘记关闭连接,语句和可能的结果集以避免内存泄漏。