我试图将一些数据添加到我的数据库,但它出现了错误:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException。
以下是代码:
Main.java中的AddToDatabase方法
public static void addToDatabaze(String name ,String address, String city, String phone, String email, String dateOfBirth, String age, String martialStatus, String gender, String id, String mainDepartment, String department, String training) throws ClassNotFoundException, SQLException
{
//Databaza
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://***.*.*.*:****/employ";
String uname="*****";
String pass="***********";
connect = DriverManager.getConnection(url,uname,pass);
Statement statement;
String query = "INSERT INTO employeetable (name,address,city,phone,email,dateofbirth,age,martialstatus,gender,id,maindepartment,department,training)values(" + name + "," + address + "," + city + "," + phone + "," + email + "," + dateOfBirth + "," + age + "," + martialStatus + "," + gender + "," + id + "," + mainDepartment + "," + department + "," + training + ")";
statement = connect.createStatement();
statement.execute(query);
}
AddNewEmployeeController.java
private Main main;
@FXML
private TextField nameField;
@FXML
private TextField addressField;
@FXML
private TextField cityField;
@FXML
private TextField phoneField;
@FXML
private TextField emailField;
@FXML
private DatePicker dateOfBirth;
@FXML
private TextField ageField;
@FXML
private ChoiceBox martialStatusBox;
@FXML
private RadioButton maleButton;
@FXML
private RadioButton femaleButton;
@FXML
private TextField idField;
@FXML
private ComboBox mainDepartmentBox;
@FXML
private ComboBox departmentBox;
@FXML
private CheckBox yesBox;
@FXML
private CheckBox noBox;
@FXML
private void addButton() throws ClassNotFoundException, SQLException
{
if(yesBox.isSelected())
{
main.addToDatabaze(nameField.getText(),addressField.getText(),cityField.getText(),phoneField.getText(),emailField.getText(),dateOfBirth.getValue().toString(),ageField.getText(),martialStatusBox.getSelectionModel().getSelectedItem().toString(),"Male",idField.getText(),mainDepartmentBox.getSelectionModel().getSelectedItem().toString(),departmentBox.getSelectionModel().getSelectedItem().toString(),"Yes");
closeBtn();
}
}
输出:
Caused by: com.mysql.jdbc.exceptions.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 'Years,Single,Male,1404996,Electrical,Design,Yes)' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
at com.mysql.jdbc.Statement.execute(Statement.java:727)
at employee.Main.addToDatabaze(Main.java:58)
at employee.view.AddNewEmployeeController.addButton(AddNewEmployeeController.java:164)
... 118 more
P.S。主要:java:58就是这一行:
statement.execute(query);
AddNewEmployeeController.java:164就是这一行:
main.addToDatabaze(nameField.getText(),addressField.getText(),cityField.getText(),phoneField.getText(),emailField.getText(),dateOfBirth.getValue().toString(),ageField.getText(),martialStatusBox.getSelectionModel().getSelectedItem().toString(),"Male",idField.getText(),mainDepartmentBox.getSelectionModel().getSelectedItem().toString(),departmentBox.getSelectionModel().getSelectedItem().toString(),"Yes");
年,单身,男性,1404996,电气,设计,是: 当我试图将数据添加到:TextField ageField,ChoiceBox martialStatusBox," Male",idField,ComboBox mainDepartmentBox,ComboBox departmentBox," Yes"。
答案 0 :(得分:0)
您需要使用prepared statements:
try (PreparedStatement statement = connection.prepareStatement(
"INSERT INTO employeetable (name,address,city,phone,email,dateofbirth,age,martialstatus,gender,id,maindepartment,department,training)" +
" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
statement.setString(1, name);
statement.setString(2, address);
// ... etc for the other fields
statement.executeUpdate();
}
原始代码的问题在于您忘记在字符串值周围添加引号。天真的解决方案是使用
"...('" + name + "','" + address + "'..."
然而,这仍然很糟糕,因为如果name
的值为O'Reilly
,请猜测会发生什么。这被称为SQL注入,它是最大的安全问题之一,甚至认为通过使用如上所示的预准备语句可以轻松避免。