【问题标题】:It does not give me error in code, MySQLSyntaxErrorException它不会给我代码错误,MySQLSyntaxErrorException
【发布时间】:2019-03-24 21:33:49
【问题描述】:

这是错误:

运行: 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 服务器版本相对应的手册,以在第 1 行的 'com.mysql.jdbc.JDBC42PreparedStatement@41399cae: SELECT * FROM people WHERE id' 附近使用正确的语法 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 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);
}

【问题讨论】:

    标签: java mysql


    【解决方案1】:

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

    你的代码有几个大问题:

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

    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 不需要在语句末尾有尾随 ;。仅当您启用多语句执行时才需要这样做。

    【讨论】:

    • 实际上有些驱动不允许;在语句末尾(我相信oracle 9就是其中之一)
    • 非常感谢!将 sql 的值放入 rs = ps.executeQuery(String.valueOf(ps));解决了问题! :)
    • @locrasm999 这是错误的解决方案。您正在强制对 SQL 进行两次解析。使用此答案中的解决方案。
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多