我将 JDBC 与 mysql-connector-java-6.0.2.jar 一起使用,除非我做错了什么,否则我认为 DatabaseMetaData.ownDeletesAreVisible 和 DatabaseMetaData.deletesAreDetected 实现在彼此之间以某种方式不一致。
以下是 JDBC 规范关于 ownDeletesAreVisible 的说明:
" ...如果删除的行被删除或替换为空行,则DatabaseMetaData.ownDeletesAreVisible(int type)方法将返回true。如果ResultSet对象仍然包含已删除的行,则返回false,这意味着删除不作为对给定类型的 ResultSet 对象的更改可见... "
关于 deletesAreDetected:
“ ...如果从 ResultSet 对象中删除的行被删除,则方法 deletesAreDetected 返回 false,如果删除的行被空行或无效行替换,则返回 true... ”
我将输出添加为注释:
import static java.sql.ResultSet.CONCUR_UPDATABLE;
import static java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE;
import java.sql.*;
public class Deletions {
public static void main(String[] args) throws SQLException {
try (Connection conn = DBUtils.getConnection();
Statement stmt = conn.createStatement(TYPE_SCROLL_INSENSITIVE, CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("select * from book")) {
DatabaseMetaData dbmd = conn.getMetaData();
//prints false
System.out.println(dbmd.ownDeletesAreVisible(TYPE_SCROLL_INSENSITIVE));
// prints false. Controversy?
System.out.println(dbmd.deletesAreDetected(TYPE_SCROLL_INSENSITIVE));
// Prints everything including foo
printAll(rs);
// deletes foo
while (rs.next()) {
String title = rs.getString(2);
if (title.equalsIgnoreCase("foo")) {
rs.deleteRow();
}
}
// Prints everything without foo
printAll(rs);
}
}
private static void printAll(ResultSet rs) throws SQLException {
rs.beforeFirst();
while (rs.next()) {
System.out.println(rs.getString(2));
}
rs.beforeFirst();
}
}