这是我的源代码。
private void btnLoadActionPerformed(java.awt.event.ActionEvent evt) {
public void saveOrder(JTable jTable2, JDateChooser jd) {
if (jTable2.getRowCount() > 0) {
for (int i = 0; i < jTable2.getRowCount(); i++) {
int lot_id = Integer.parseInt(jTable2.getValueAt(i, 0).toString());
String lot_date = jTable2.getValueAt(i, 1).toString();
String lot_type = jTable2.getValueAt(i, 2).toString();
int draw = Integer.parseInt(jTable2.getValueAt(i, 4).toString());
int f_order = Integer.parseInt(jTable2.getValueAt(i, 5).toString());
int qty = Integer.parseInt(jTable2.getValueAt(i, 6).toString());
double cost = Double.parseDouble(jTable2.getValueAt(i, 7).toString());
double profit = Double.parseDouble(jTable2.getValueAt(i, 8).toString());
try {
boolean b = JDBC.putData("insert into order(lot_date, inst_id, qty, total, ptotal) values('"+lot_date+"', '"+lot_id+"', '"+qty+"', '"+cost+"', '"+profit+"' )");
if (b) {
JOptionPane.showMessageDialog(null, "invoice saved one");
}
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
JOptionPane.showMessageDialog(null, "Enter Item to Invoice", "Error", JOptionPane.ERROR_MESSAGE);
}
}}
这是我的JDBC类。
package Modle;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class JDBC {
static Connection con;
static boolean b;
public static void setCon() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost/lottery", "root", "");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static Connection getCon() throws Exception{
if (con==null) {
setCon();
}
return con;
}
public static boolean putData(String sql){
try {
PreparedStatement state = getCon().prepareStatement(sql);
state.executeUpdate();
b=true;
} catch (Exception e) {
e.printStackTrace();
b=false;
}
return b;
}
}
当我按下此按钮时,我有一个语法错误异常。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order(lot_date, inst_id, qty, total, ptotal) values('2014-11-14', '4', '5', '100' at line 1
这是我的订单表。
在这个运动中,我没有向lot_id添加值并绘制字段。请帮我。
![在此处输入图像说明] [2]
答案 0 :(得分:2)
order
是SQL中的保留字,因此如果要将其用作表名,则需要使用前向引号来保护它:
boolean b = JDBC.putData("insert into `order` (lot_date, inst_id, qty, total, ptotal) values ('"+lot_date+"', '"+lot_id+"', '"+qty+"', '"+cost+"', '"+profit+"' )");
答案 1 :(得分:1)
这与错误无关,但是当您已经使用PreparedStatement
时,请使用占位符(?
)来设置值。
这可以防止SQL Injection攻击。
Why do I use PreparedStatement?
原因很简单:
- 在内联绑定值时,可以省略源于错误字符串连接的语法错误。
- 在内联绑定值时,可以从错误的字符串连接中省略SQL注入漏洞。
- 在内联更多“复杂”数据类型时,例如TIMESTAMP,二进制数据等,可以避免边缘情况。
- 您可以保持打开PreparedStatements一段时间,重新使用新的绑定值而不是立即关闭它们(例如,在Postgres中很有用)。
- 您可以在更复杂的数据库中使用自适应游标共享(Oracle-speak)。这有助于防止为每个新的绑定值集合进行硬解析SQL语句。