如果运行主类,则会出现此错误:
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 'insert into customerLogin(companyName,username,password) values('Big Company','D' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at dao.CustomerContactDAO.performUpdate(CustomerContactDAO.java:175) at dao.DAOTemplate.executeUpdate(DAOTemplate.java:27) at dao.CustomerContactDAO.addCustomerContact(CustomerContactDAO.java:88) at test.Test.main(Test.java:29)
这是我的DAO中的代码。我认为错误在于这些代码行,但我不知道它是哪一行:
public boolean addCustomerContact(CustomerContact c) { setQuery("insert into customerContact(companyName,lastName,firstName,email,telNum,local,cellNum) values(?,?,?,?,?,?,?);" + "insert into customerLogin(companyName,username,password) values(?,?,?)"); queries.add(getQuery()); KeyValuePair onePair; onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getCompanyName()); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getLastName()); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getFirstName()); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getEmail()); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.INT); onePair.setValue(c.getTelNum() + ""); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.INT); onePair.setValue(c.getLocal() + ""); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getCellNum() + ""); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getCompanyName()); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getUsername()); getParameters().add(onePair); onePair = new KeyValuePair(); onePair.setKey(KeyValuePair.STRING); onePair.setValue(c.getPassword()); getParameters().add(onePair); return executeUpdate(); }
您试图一次执行两个查询。JDBC不允许这样做。单个执行应该是一个且只有一个语句。某些驱动程序确实允许它,但是您需要使用一个连接属性来启用它,例如对于MySQL是allowMultiQueries,请参见http://dev.mysql.com/doc/refman/5.6/en/connector- j-reference- configuration- properties.html:
allowMultiQueries
allowMultiQueries 允许使用’;’ 在一个语句(真/假)期间分隔多个查询,默认为“假”,并且不影响依赖于rewriteBatchStatements的addBatch()和executeBatch()方法。
但是,我强烈建议执行为两个单独的语句(在事务中可选)。那是JDBC兼容的,并且可以在所有数据库上使用。