我正在使用Java + Connector / J + MySQL开发一个项目。 我需要使用一个PreparedStatement执行以下查询。有可能吗?
INSERT INTO FILES (FILENAME, FILESIZE, HASH) VALUES (a,b,c)
ON DUPLICATE KEY UPDATE FILEID=LAST_INSERT_ID(FILEID);
INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (1,LAST_INSERT_ID());
当我尝试执行此操作时,出现错误。我知道如何批量执行相同的INSERT语句,但我不能让它在一个语句中使用多个插入运行。
java中执行上述代码的代码是:
query = "INSERT INTO FILES (FILENAME, FILESIZE, HASHROOT, HASHLIST) VALUES (?,?,?,?)\n" +
"ON DUPLICATE KEY UPDATE FILEID=LAST_INSERT_ID(FILEID);\n" +
"INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (" + peerID + ",LAST_INSERT_ID());";
pstmt = null;
try
{
pstmt = conn.prepareStatement(query);
stmt.setString(1, files[i].getFileName());
pstmt.setLong(2, files[i].getFileSize());
pstmt.setString(3, /* Get some data here */);
pstmt.setBytes(4, /* Get some data here */);
pstmt.addBatch();
pstmt.executeBatch();
}
catch (Exception ex)
{
// Error handling
}
finally
{
// Close resources
}
编辑:我在catch块中遇到的错误是说“你的SQL语法有错误;请查看与你的MySQL服务器版本相对应的手册,以便在'INSERT INTO DISTRIBUTES'附近使用正确的语法(PEERID, FILEID)VALUES(16,LAST_INSERT_ID())'在第3行“
答案 0 :(得分:0)
您只能使用一个preparedStatement执行一个语句。您必须将sql拆分为两个单独的insert into
...序列。
另外
INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (" + peerID + ",LAST_INSERT_ID());";
看起来不像使用preparedStatment - 它已经硬编码peerID
而不是占位符?