它不会给我代码MySQLSyntaxErrorException

时间:2019-03-24 21:33:50

标签: java mysql

这是错误:

  

运行:   Mon Mar 25 05:22:00 SGT 2019警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45 +,5.6.26 +和5.7.6+的要求,如果未设置显式选项,则默认情况下必须建立SSL连接。为了与不使用SSL的现有应用程序兼容,将verifyServerCertificate属性设置为'false'。您需要通过设置useSSL = false来显式禁用SSL,或者设置useSSL = true并为服务器证书验证提供信任库。   2019年3月25日5:22:15 mypackage.profile jButton6ActionPerformed   严重:null   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误。检查与您的MySQL服务器版本相对应的手册,以获取在'com.mysql.jdbc.JDBC42PreparedStatement@41399cae附近使用的正确语法:SELECT * FROM FROM WHERE id'第1行       在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)处       在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)       在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

然后这是代码:

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    PreparedStatement ps;
    ResultSet rs;
    String id = txtid.getText();
    if (id.isEmpty()) {
        JOptionPane.showMessageDialog(null, "ID field is empty");
        return;
    }
    String sql = "SELECT * FROM persons WHERE id = "+ Integer.parseInt(id) + ";";
    JOptionPane.showConfirmDialog(null,"Is this right?\n" + sql);
    try {
        ps = con.prepareStatement(sql);
        rs = ps.executeQuery(String.valueOf(ps));
        if(rs.next()){
        txtln.setText(rs.getString("lastName"));
        txtfn.setText(rs.getString("firstName"));
        txtadrs.setText(rs.getString("address"));
        txtcity.setText(rs.getString("city"));
        }
    } catch (SQLException ex) {
        Logger.getLogger(profile.class.getName()).log(Level.SEVERE, null, ex);
    }
}                                        

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    dispose();
    new menu().setVisible(true);
}

1 个答案:

答案 0 :(得分:4)

PreparedStatement的上下文中,rs = ps.executeQuery(String.valueOf(ps));不正确。由于创建ps时已经提供了SQL,因此您想执行rs = ps.executeQuery();

您的代码几乎没有什么大问题:

  1. 永远不要从Swing EDT运行JDBC,因为您将阻止Swing UI刷新事件,并且应用程序将冻结。您必须在后台任务中安排长期运行的任务(例如SQL查询),请参阅Worker Threads and SwingWorker文档。

  2. 切勿使用String串联来构建SQL。在您的示例中,还没有问题,但是如果id将是String而不是int,那么您将拥有SQL Injection vulnerability。由于您已经创建了PreparedStatement,因此请使用:

    ps = con.prepareStatement("SELECT * FROM persons WHERE id = ?");
    ps.setInt(1, Integer.parseInt(id));
    
  3. 在处理PreparedStatement之后关闭它,如果您不打算重复使用它,请使用try-with-resources syntax

  4. MySQL语句末尾不需要结尾;。仅在启用多语句执行时才需要。