java - 它不会给我代码错误,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);
}
解决方案
在的rs = ps.executeQuery(String.valueOf(ps));
上下文中是不正确的PreparedStatement
。由于您在创建时已经提供了 SQL,因此ps
您想要执行rs = ps.executeQuery();
.
您的代码几乎没有什么大问题:
永远不要从 Swing EDT 运行 JDBC,因为您将阻止 Swing UI 刷新事件并且您的应用程序将冻结。您必须在后台任务中安排长时间运行的任务,例如 SQL 查询,请参阅Worker Threads 和 SwingWorker文档。
永远不要使用
String
连接来构建 SQL。在您的示例中还没有问题,但如果不是,您id
将有SQL 注入漏洞。由于您已经创建了使用:String
int
PreparedStatement
ps = con.prepareStatement("SELECT * FROM persons WHERE id = ?"); ps.setInt(1, Integer.parseInt(id));
PreparedStatement
如果您不打算重用它,请在处理后关闭它,请使用try-with-resources
syntax。MySQL 不需要
;
在语句末尾有尾随。仅当您启用多语句执行时才需要这样做。
推荐阅读
- ios - iTunes 应用程序被拒绝 - IAP
- azure - Azure power shell 命令删除 App 服务的 IP 限制
- java - 具有 2 个外键选项的休眠实体
- php - Nginx 子目录中的 PHP 应用程序
- python - Selenium Python/Django:在 ubuntu 上与 chromedriver 一起使用
- c# - MVC、Jquery 和 Ajax - 控制器中带有空参数的 JSON
- openwhisk - OpenWhisk 开源 UI?
- angular - 自定义指令 - Angular 2/4/5
- ios - class_replaceMethod 类别方法 return nil
- typeerror - 使用 whois-json 的 Sinon 测试错误