今天遇到一個很坑的錯誤,在java中寫好dao和dto後,寫了一個插入訂單表的測試方法,代碼如下:
package cn.edu.lingnan.dto;
public class Order {
private String OID;
private String CustomerName;
private String CustomerPhone;
private String CustomerSex;
private String EID;
private String RoomID;
private String BeginTime;
private String EndTime;
public Order(String _OID, String _CustomerName, String _CustomerPhone,String _CustomerSex, String _EID, String _RoomID, String _BeginTime, String _EndTime)
{
OID = _OID;
CustomerName = _CustomerName;
CustomerPhone = _CustomerPhone;
CustomerSex= _CustomerSex;
EID = _EID;
RoomID = _RoomID;
BeginTime = _BeginTime;
EndTime = _EndTime;
}
@Override
public String toString() {
return "Order [OID=" + OID + ", CustomerName=" + CustomerName + ", CustomerPhone=" + CustomerPhone
+ ", CustomerSex=" + CustomerSex + ", EID=" + EID + ", RoomID=" + RoomID + ", BeginTime=" + BeginTime
+ ", EndTime=" + EndTime + ", toString()=" + super.toString() + "]";
}
public String getOID() {
return OID;
}
public void setOID(String _OID) {
OID = _OID;
}
public String getCustomerName() {
return CustomerName;
}
public void setCustomerName(String _CustomerName) {
CustomerName = _CustomerName;
}
public String getCustomerPhone() {
return CustomerPhone;
}
public void setCustomerPhone(String _CustomerPhone) {
CustomerPhone = _CustomerPhone;
}
public String getCustomerSex() {
return CustomerSex;
}
public void setCustomerSex(String _CustomerSex) {
CustomerSex = _CustomerSex;
}
public String getEID() {
return EID;
}
public void setEID(String _EID) {
EID = _EID;
}
public String getRoomID() {
return RoomID;
}
public void setRoomID(String _RoomID) {
RoomID = _RoomID;
}
public String getBeginTime() {
return BeginTime;
}
public void setBeginTime(String _BeginTime) {
BeginTime = _BeginTime;
}
public String getEndTime() {
return EndTime;
}
public void setEndTime(String _EndTime) {
EndTime = _EndTime;
}
}
import java.util.Vector;
import cn.edu.lingnan.dto.Order;
import cn.edu.lingnan.util.DataAccess;
public class OrderDao {
public boolean AddOrder(Order _o)
{
boolean flag = false;
Connection conn = null;
PreparedStatement prep = null;
try {
conn = DataAccess.getConnection();
prep=conn.prepareStatement("insert into Order values(?,?,?,?,?,?,?,?)");
prep.setString(1, _o.getOID());
prep.setString(2, _o.getCustomerName());
prep.setString(3, _o.getCustomerPhone());
prep.setString(4, _o.getCustomerSex());
prep.setString(5, _o.getEID());
prep.setString(6, _o.getRoomID());
prep.setString(7, _o.getBeginTime());
prep.setString(8, _o.getEndTime());
prep.executeUpdate();
RoomDao rd = new RoomDao();
boolean b = rd.ChangeState(_o.getRoomID(), "錕斤拷住");
if(b)
flag = true;
}
catch(SQLException e)
{
System.out.println(e.getMessage());
}
finally{
DataAccess.closeConnection(conn, prep);
}
return flag;
}
}
然後寫了一個測試類:
package cn.edu.lingnan.test;
import cn.edu.lingnan.dao.OrderDao;
import cn.edu.lingnan.dto.Order;
public class AddOrderTest {
public static void main(String[] args)
{
OrderDao od = new OrderDao();
Order o = new Order("O001", "小明", "123456", "1", "E001", "R101", "2019-10-01", "2019-10-02");
boolean result = od.AddOrder(o);
System.out.println(result);
}
}
但是呢,數據怎麼也插不進去,報錯如下:
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 values(‘O001’,’?°???’,‘123456’,‘1’,‘E001’,‘R101’,‘2019-10-01’,‘2019-10-02’ at line 1
可以看到控制檯的信息裏面,sql語句已經出現了錯誤,我代碼裏的小明在控制檯變成了????,一開始我以爲是編碼錯誤,就把eclipse和navicat的編碼方式都換了,還是不行,最後經過百度才知道,order是mysql的關鍵字,所以在寫sql語句的時候要在sql語句中的order加上反引號,==》`order`,這樣就可以成功插入了。
類似的情況我在sqlserver也遇到過,不過在sqlserver的關鍵詞是用[](中括號)來把數據括起來,例如在sqlserver中user寫在sql語句中的時候,要把它寫成[user]。爲了防止此類錯誤再次發生,謹以此文章來提醒自己,同時也希望能幫到有需要的個位朋友們!