使用PreparedStatement执行多个插入 - Java

时间:2012-03-03 16:36:23

标签: java mysql

我正在使用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行“

1 个答案:

答案 0 :(得分:0)

您只能使用一个preparedStatement执行一个语句。您必须将sql拆分为两个单独的insert into ...序列。

另外

INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (" + peerID + ",LAST_INSERT_ID());";

看起来不像使用preparedStatment - 它已经硬编码peerID而不是占位符?