将Java Object存储为MySQL中的BLOB:奇怪的错误

有一点问题我希望有人可以开导我。

尝试序列化我自己创建的Java对象,该对象由其他Java对象组成(同样是我自己创建的)。 当jdbc尝试运行将Object存储为blob的PreparedStatement时,它运行正常,直到我收到此错误。

我运行MySQL作为数据库并检查我试图存储在blob字段中的所有对象都被定义为“implements Serializable”。 我试图在MySQL和MedBlob中尝试正常的BLOB数据类型。 我通过Xampp运行MySQL客户端版本:5.1.41。

代码如下:

LinkedList tt = t; //Ignore these two variables String tName = ""; int modelCode = 0; for (int i = 0; i< tt.size();i++){ tName = t.get(i).getTableName(); modelCode = session.getCurrentModel(); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(t.get(i)); byte[] tableAsBytes = baos.toByteArray(); fyProject.connectionController sg = new fyProject.connectionController(1); PreparedStatement pstmt = sg.prepareSQL ("INSERT INTO tableList (table) VALUES(?);"); ByteArrayInputStream bais = new ByteArrayInputStream(tableAsBytes); pstmt.setBinaryStream(1,bais, (long) tableAsBytes.length); System.out.println(pstmt.toString()); //pstmt.setString(2, tName); //pstmt.setInt(3, modelCode); pstmt.executeUpdate(); sg.conn.commit(); pstmt.close(); conn.close(); }catch(Exception e) { e.printStackTrace(); } }

错误堆栈如下:

 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 'table) VALUES(_binary'¬í\0sr\0fyProject.TableÊl;EÞ›\0L\0 attributest\0Lja' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 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:1052) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330) at fyProject.connectionController.insertTable(connectionController.java:368) at fyProject.connectionController.createTables(connectionController.java:292) at fyProject.Main.main(Main.java:40) 

谢谢您的帮助。

刘易斯

编辑:固定代码如下。

  public void insertTable() { LinkedList
tt = t; //Ignore these two variables String tName = ""; int modelCode = 0; for (int i = 0; i< tt.size();i++){ tName = tt.get(i).getTableName(); modelCode = session.getCurrentModel(); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); //Test a = new Test(1); oos.writeObject(tt.get(i)); byte[] tableAsBytes = baos.toByteArray(); fyProject.connectionController sg = new fyProject.connectionController(1); PreparedStatement pstmt = sg.prepareSQL ("INSERT INTO tableList (tableField) VALUES(?);"); ByteArrayInputStream bais = new ByteArrayInputStream(tableAsBytes); pstmt.setBinaryStream(1,bais, (long) tableAsBytes.length); System.out.println(pstmt.toString()); //pstmt.setString(2, tName); //pstmt.setInt(3, modelCode); pstmt.executeUpdate(); //sg.conn.commit(); pstmt.close(); conn.close(); }catch(Exception e) { e.printStackTrace(); } } }

TABLE是MySQL关键字 。 由于您将其用作列的名称,因此需要将名称转义为:

 INSERT INTO tableList (`table`) VALUES(?); 
Interesting Posts