使用PreparedStatement-Java执行多个插入

使用PreparedStatement-Java执行多个插入,java,mysql,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

我正在使用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语句执行批处理,但我不能在一个语句中使用多个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服务器版本对应的手册,以了解在第3行“INSERT-INTO-DISTRIBUTES(PEERID,FILEID)value(16,LAST_-INSERT_-ID())”附近使用的正确语法”

您只能使用单个preparedStatement执行一条语句。您必须将sql拆分为两个独立的
插入到
。。。序列


看起来不像是在使用PreparedStation-它使用硬编码的peerID而不是占位符

如果没有您的代码,您真的不能做很多事情…您会遇到什么错误?不要吞下catch块中的异常。至少把它们打印出来!您是否尝试过在没有“;”和“\n”的情况下单独执行这两条语句?我不熟悉Connector/J,但这些以分号分隔的行似乎不太好。“\n”仅用于调试目的。MySql需要分号字符,以便在批处理中执行查询。通过在MySQL Workbench中编写查询,我已经测试过该语句是正确的。问题是,我认为在尝试以PreparedStatement形式执行时,可以使用
PreparedStatement\35; addBatch()
INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (" + peerID + ",LAST_INSERT_ID());";