【问题标题】:JDBC How can I use a place holder in a prepared statement with a where clause?JDBC 如何在带有 where 子句的预准备语句中使用占位符?
【发布时间】:2014-07-19 11:44:49
【问题描述】:

我很难理解为什么这不起作用,如果我直接在 MySQL 控制台中输入完全相同的内容,它会接受它,但是当我尝试运行它时,它会报告语法错误。

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '= '6'' 附近使用正确的语法

我要做的就是接收行中的数据,其中包含用户输入的任何 member_id 值。出于测试目的,该值始终为 6,我尝试将其解析为 int 而不是字符串,这给出了相同的错误,我尝试将 ID 变量添加到字符串的末尾而不是使用占位符,但它没有也不是很喜欢。

代码如下:

public class MemberDAO {

public PreparedStatement ps = null;
public Connection dbConnection = null;

public List<Member> getMembersDetails(String ID) throws SQLException{

    List<Member> membersDetails = new ArrayList();

    String getMembershipDetails = "SELECT first_name, last_name, phone_number, email, over_18, date_joined, date_expire, fines FROM members"
            + "WHERE member_id = ?";

    try {
        DBConnection mc = new DBConnection();
        dbConnection = mc.getConnection();
        ps = dbConnection.prepareStatement(getMembershipDetails);

        ps.setString(1, ID);
        ps.executeQuery();

        ResultSet rs = ps.executeQuery(getMembershipDetails);


        String firstName = rs.getString("first_name");
        String lastName = rs.getString("last_name");
        String phoneNumber = rs.getString("phone_number");
        String email = rs.getString("email");
        String over18 = rs.getString("over_18");
        String dateJoined = rs.getString("date_joined");
        String dateExpired = rs.getString("date_expire");
        String fines = rs.getString("fines");

        Member m;
        m = new Member(firstName, lastName, phoneNumber, email, over18, dateJoined, dateExpired, fines);
        membersDetails.add(m);


    }  catch (SQLException ex){
        System.err.println(ex);
        System.out.println("Failed to get Membership Details.");
        return null;
    } finally{
        if (ps != null){
            ps.close();
        }
        if (dbConnection != null){
            dbConnection.close();
        }
    } return membersDetails;
}

这就是所谓的:

private void btnChangeCustomerActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    customerID = JOptionPane.showInputDialog(null, "Enter Customer ID.");

    MemberDAO member = new MemberDAO();
    try {
        List membersDetails = member.getMembersDetails(customerID);

        txtFullName.setText(membersDetails.get(0) + " " + membersDetails.get(1));
    } catch (SQLException ex) {
        System.err.println(ex);
        System.out.println("Failed to get Details.");
        JOptionPane.showMessageDialog(null, "Failed to retrieve data.");
    }
}    

感谢任何输入。

【问题讨论】:

  • 为什么不在 String getMembershipDetails 中创建 sql 查询 = "SELECT first_name, last_name, phone_number, email, over_18, date_joined, date_expire, fines FROM members" + "WHERE member_id = ?";
  • 另外一件事,你设置 txtFullName 的方式没有多大意义,因为你假设你会从查询中得到两行......
  • 我不太明白你在问吉米什么。 Beny,first_name 和 last_name 必须填写,并将作为第一个和第二个条目添加到数组中,所以 membersDetails.get(0) 和 membersDetails.get(1) 应该得到强制性的名字和姓氏条目?跨度>
  • 我使用了 prepareStatement 而不是 createStatement,因为有人告诉我如果你想使用占位符,你需要使用 prepare 语句,我也关闭了语句和连接。
  • @fost memberDetails 包含一个成员列表,因此 memberDetails.get(0) 将返回第一个成员,.get(1) 返回第二个成员...

标签: java mysql jdbc prepared-statement


【解决方案1】:

您的查询缺少空格:

...fines FROM members"
        + "WHERE...

会导致

 FROM membersWHERE

哪个是无效的 SQL

改成

 + " WHERE....

【讨论】:

    【解决方案2】:

    您的查询是:

    SELECT first_name, last_name, phone_number, email, over_18, date_joined, date_expire, fines FROM 
    
    members WHERE member_id = ?
    

    所以在成员之间和你需要一个空白字符的地方

    SELECT first_name, last_name, phone_number, email, over_18, date_joined, date_expire, fines FROM members WHERE member_id = ?
    

    【讨论】:

    • 大声笑,太尴尬了,太久了。现在收到此错误“java.sql.SQLException:在结果集开始之前”,因此开始新的搜索。但至少我们取得了进展,ty。
    • 在您的代码中我看不到 createstatment()。您还必须关闭语句和 Db 连接!你可以在这篇文章中看到我的回答:stackoverflow.com/questions/24826029/…Good luck!
    • @Jimmysnn 您是否强烈建议使用字符串连接而不是占位符参数?那是SQL注入!一个可怕的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多