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();
}
}
}
谢谢fivedigit!正如旁注所示,即使在使用上述语句时,我也遇到了一个问题,因为即使使用单引号括起来,也不能在MySQL中使用字段名称。我将字段名称更改为'tableField'(没有单引号),它工作正常。生病发布我的新Java代码,再次遇到这个问题的人。 – 2012-01-31 16:22:59
实际上,您可以使用表作为列名称,但您需要使用反引号(')在查询中转义表名和列名。单引号用于字符串文字。 – fivedigit 2012-01-31 16:56:16
真的吗?当我尝试 INSERT INTO tableList('table')VALUES(?); 我得到了一个不同的错误,但是当我将字段名更改为tableField,然后将SQL读入 INSERT INTO tableList(tableField)VALUES(?); 我没有问题。奇怪;无论如何,谢谢你的帮助,一直在我的脑海里徘徊一天。 – 2012-02-01 11:43:39