这是错误:
运行: 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);
}
答案 0 :(得分:4)
在PreparedStatement
的上下文中,rs = ps.executeQuery(String.valueOf(ps));
不正确。由于创建ps
时已经提供了SQL,因此您想执行rs = ps.executeQuery();
。
您的代码几乎没有什么大问题:
永远不要从Swing EDT运行JDBC,因为您将阻止Swing UI刷新事件,并且应用程序将冻结。您必须在后台任务中安排长期运行的任务(例如SQL查询),请参阅Worker Threads and SwingWorker文档。
切勿使用String
串联来构建SQL。在您的示例中,还没有问题,但是如果id
将是String
而不是int
,那么您将拥有SQL Injection vulnerability。由于您已经创建了PreparedStatement
,因此请使用:
ps = con.prepareStatement("SELECT * FROM persons WHERE id = ?");
ps.setInt(1, Integer.parseInt(id));
在处理PreparedStatement
之后关闭它,如果您不打算重复使用它,请使用try-with-resources
syntax。
MySQL语句末尾不需要结尾;
。仅在启用多语句执行时才需要。