今天遇到一个很坑的错误,在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]。为了防止此类错误再次发生,谨以此文章来提醒自己,同时也希望能帮到有需要的个位朋友们!