使用varchar作为主键的数据类型插入查询

该计划不接受下文所述的查询─

public class loginDaos { public void create(loginBean bean) { ConnectionPool c = ConnectionPool.getInstance(); c.initialize(); Connection con = c.getConnection(); try { String sql = "INSERT INTO login VALUES(?,?,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, bean.getCode()); pstmt.setString(2, bean.getUserid()); pstmt.setString(3, bean.getPassword()); pstmt.setString(4, bean.getPosition()); pstmt.executeUpdate(sql); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { loginDaos ld = new loginDaos(); loginBean lb = new loginBean("representative", "rep7", "rep7", "r"); ld.create(lb); } } 

表格是:

  CREATE TABLE login ( userid char(25); password varchar(45), code char(5), position char(), PRIMARY KEY (code) ); 

我目前将userid,密码,代码和位置的值保持为String。堆栈跟踪是:

  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 '?,?,?,?)' 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:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485) at login.loginDaos.create(loginDaos.java:33) at login.loginDaos.main(loginDaos.java:42) 

建立成功(总时间:0秒)

救命!

当您使用PreparedStatement ,您应该使用不带String参数的executeQuery()executeUpdate()execute()方法。

所以要解决问题使用:

 // .... pstmt.setString(3, bean.getPassword()); pstmt.setString(4, bean.getPosition()); pstmt.executeUpdate(); 

MySQL驱动程序实现有一个错误,因为JDBC规范声明接受字符串的方法在PreparedStatementCallableStatement实现上CallableStatement时应抛出SQLException 。 在这种情况下,它只抛出exception,因为它试图直接执行参数化查询。