store Java Object as BLOB in MySQL: strange error

混江龙づ霸主 提交于 2019-12-23 00:41:08

问题


got a little problem im hoping someone can enlighten me on.

Trying to serialise a Java Object of my own creation which is made up of other Java Objects (Again of my own creation). It was running fine until I get this error when the jdbc attempts to run the PreparedStatement storing the Object as a blob.

Im running MySQL as the database and have checked that all my objects which im attempting to store in the blob field are defined as "implements Serializable". I have attempted to try a normal BLOB datatype in MySQL and also MedBlob. Im running MySQL client version: 5.1.41 via Xampp.

Code is below:

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

Error stack is below:

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)

Thanks for the help.

Lewis

EDIT: Fixed code is below.

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

回答1:


TABLE is a MySQL keyword. Since you use it as a name for your column, you need to escape the name like this:

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


来源:https://stackoverflow.com/questions/9065687/store-java-object-as-blob-in-mysql-strange-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!