java - SQL 语句和准备语句错误

标签 java mysql sql prepared-statement inner-join

用户输入一种疾病,SQL 应该返回所有患有这种疾病的患者详细信息。但是我收到以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

SQL查询如下图所示。请帮我调试一下。

SELECT patient_personal_details.patient_id, 
       patient_personal_details.first_name, 
       patient_personal_details.last_name, 
       patient_personal_details.gender, 
       patient_personal_details.occupation, 
       patient_personal_details.marital_status 
FROM patient_personal_details
INNER JOIN patient_medical_details
ON patient_personal_details.patient_id = patient_medical_details.patient_id
WHERE patient_medical_details.disease = ?

代码如下:

public JTable getAllPatientsByDisease(String disease)throws RemoteException{
    JTable table = null;
    try{
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/hospital_database","root","");
        String sql = " SELECT patient_personal_details.patient_id, patient_personal_details.first_name, patient_personal_details.last_name, patient_personal_details.gender, patient_personal_details.occupation, patient_personal_details.marital_status FROM patient_personal_details "
                + " INNER JOIN patient_medical_details "
                + " ON patient_personal_details.patient_id = patient_medical_details.patient_id "
                + " WHERE patient_medical_details.disease = ? ";
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setString(1, disease);
        ResultSet rs = ps.executeQuery(sql);

        table =  new JTable(buildTableModel(rs));
    }
    catch(SQLException | ClassNotFoundException e){
        System.out.println("Error: "+e);
    }
    return table;
}

最佳答案

更新后的答案:(现在我们有了代码)

问题出在这里:

ResultSet rs = ps.executeQuery(sql);
// ----------------------------^^^

删除sql,只需使用:

ResultSet rs = ps.executeQuery();

通过将 SQL 指定为参数,您使用的是 Statement#executeQuery , 不是 PreparedStatement#executeQuery . Statement#executeQuery 按字面意义使用 SQL 字符串,而不替换参数(基本上就像您没有调用 setString 一样)。 (是的,这不是 JDBC 人员的绝妙设计决定。)


原始答案:

该错误消息的关键位是 “...near '?'” 这告诉我们您从未设置要在此时替换到查询中的值,因此 ?按字面意思使用。

您需要使用 setString (如果“疾病”列是文本列)或 setInt 等,为查询设置参数。例如:

PreparedStatement ps = connection.prepareStatement("SELECT ... WHERE patient_medical_details.disease = ?");
ps.setString(1, "arachnophobia"); // <===
ResultSet rs = ps.executeQuery();

参数的编号(有点令人惊讶)第一个 ? 以 1 开始,第二个以 2 开始,依此类推。

关于java - SQL 语句和准备语句错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600015/

相关文章:

java - 通过 executorservice 进行顺序事件处理

mysql - 如何在不使用docker-compose的情况下通过单个命令使用dump.sql文件启动mysql docker容器

sql - 如何可靠地列出和删除 Oracle 中的所有空间索引?

sql - 带有 INSERT 存储过程的 C#\r\n 问题

java - 在java中使用递归来解决迷宫问题

java - 十进制到二进制的转换

mysql - 如何在 Sequelize.js 中关联两个表到第三个表?

mysql - 列出 MySQL 中可用的数据类型

java - 包含多个 JAR 的 RMI

mysql - 更新重复的行,除了一个