使用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规范声明接受字符串的方法在PreparedStatement
或CallableStatement
实现上CallableStatement
时应抛出SQLException
。 在这种情况下,它只抛出exception,因为它试图直接执行参数化查询。