2012-01-30 102 views
1

得到了一个小问题,希望有人能够启发我。将Java对象存储为MySQL中的BLOB:奇怪的错误

试图序列化由其他Java对象(我自己创建的)组成的自己创建的Java对象。它运行良好,直到我在jdbc尝试运行将Object存储为Blob的PreparedStatement时出现此错误。

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

代码如下:

LinkedList<Table> 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<Table> 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(); 
      } 
     } 
    } 

回答

4

TABLEMySQL keyword。由于您将它用作列的名称,因此您需要像这样跳过名称:

INSERT INTO tableList (`table`) VALUES(?); 
+0

谢谢fivedigit!正如旁注所示,即使在使用上述语句时,我也遇到了一个问题,因为即使使用单引号括起来,也不能在MySQL中使用字段名称。我将字段名称更改为'tableField'(没有单引号),它工作正常。生病发布我的新Java代码,再次遇到这个问题的人。 – 2012-01-31 16:22:59

+0

实际上,您可以使用表作为列名称,但您需要使用反引号(')在查询中转义表名和列名。单引号用于字符串文字。 – fivedigit 2012-01-31 16:56:16

+0

真的吗?当我尝试 INSERT INTO tableList('table')VALUES(?); 我得到了一个不同的错误,但是当我将字段名更改为tableField,然后将SQL读入 INSERT INTO tableList(tableField)VALUES(?); 我没有问题。奇怪;无论如何,谢谢你的帮助,一直在我的脑海里徘徊一天。 – 2012-02-01 11:43:39