我有以下代码:
manager.prepareStatement("REPLACE INTO `players` SELECT `id`, `uuid`, ?, ?, `date`"
+ " FROM `players` WHERE `uuid` = ? AND `date` = ?;");
manager.addString(1, ...);
manager.addString(2, ...);
manager.addString(3, uuid.toString());
manager.addLong(4, ...);
logger.debug("Updated " + manager.update() + " rows");
manager.commit();
manager.closeStatement();
我之前也做过以下事情:
ALTER TABLE `players` ADD CONSTRAINT `uuid_date` UNIQUE ( `uuid`, `date` );
如果找到现有行,则REPLACE INTO应该替换,否则插入。我希望这将始终影响至少1行。但是,由于某种原因,什么也没发生,它告诉我0行受到影响。这怎么可能?
编辑:我使用了Like this。我认为问题在于,如果SELECT找不到任何内容,它将不会插入,但是我该如何解决?
注意:manager
是我用来处理异常的自定义类的实例。
答案 0 :(得分:-1)
这是preparedstatement的正确用法:
@Override
public long write(Connection con) throws SQLException {
Gson gson = new Gson();
String batchQuery = "INSERT INTO " + ResultSchema.ID.getTableName() +
" (" + ResultSchema.URL.getColumnName() + "," +
ResultSchema.SE_TITLE.getColumnName() +
") VALUES (?,?)";
PreparedStatement preparedStatement = con.prepareStatement(batchQuery);
preparedStatement.setString(1, this.getUrl());
preparedStatement.setString(2, this.getSeTitle());
preparedStatement.addBatch();
return preparedStatement.executeBatch()[0];
}
您应该调用execute或executeBatch将查询应用于数据库。