首页 > 解决方案 > 它不会给我代码错误,MySQLSyntaxErrorException

问题描述

这是错误:

运行: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 严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以在 sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)的第 1 行的“com.mysql.jdbc.JDBC42PreparedStatement@41399cae: SELECT * FROM people WHERE id”附近使用正确的语法在 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);
}

标签: javamysql

解决方案


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

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

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

  2. 永远不要使用String连接来构建 SQL。在您的示例中还没有问题,但如果不是,您id将有SQL 注入漏洞。由于您已经创建了使用:StringintPreparedStatement

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

  4. MySQL 不需要;在语句末尾有尾随。仅当您启用多语句执行时才需要这样做。


推荐阅读