有时候即便在创建 Statement 对象的时候将 ResultType 设置成了 ResultSet.TYPE_FORWARD_ONLY,却依然可以在 ResultSet 对象中任意的移动而且不会报错。
这十有八九是因为所使用的数据库或者 Driver 本身并不支持这种的 ResultSet 类型,一般来说可以通过 DatabaseMetaData 的 supportsResultSetType() 来查看当前的 connection 是否支持某一种的 ResultSet 类型:
final String URL = "...";
Connection connection=DriverManager.getConnection(URL);
DatabaseMetaData md=connection.getMetaData();
if( md.supportsResultSetType( ResultSet.TYPE_FORWARD_ONLY ) )
System.out.println( " ****** 当前 connection 支持 Type_FORWARD_ONLY ****** " );
else
System.out.println( " ****** 当前 connection 不支持 Type_FORWARD_ONLY ****** " );
下面的表格总结了 MySQL 与 Oracle 数据库对常见的几个 ResultSet 类型的支持情况:
Oracle 11g | MySQL 8.0 | MySQL 5.7 | |
---|---|---|---|
所使用的驱动 | ojdbc 8 | mysql-connector 8.0.x | mysql-connector 8.0.x 与 mysql-connector 6.0x |
TYPE_FORWARD_ONLY | ✔ | ✔ | ✔ (只有使用 mysql-connector 8.0.x 时才会生效) |
TYPE_SCROLL_INSENSITIVE | ✔ | ✔ | ✔ |
TYPE_SCROLL_SENSITIVE | ✔ | ❌ | ❌ |
CONCUR_READ_ONLY | ✔ | ❌ | ❌ |
CONCUR_UPDATABLE | ✔ | ❌ | ❌ |
CLOSE_CURSORS_AT_COMMIT | ✔ | ❌ | ❌ |
CLOSE_CURSORS_OVER_COMMIT | ✔ | ❌ | ❌ |
可见,Oracle 与 MySQL 相比,所支持的 ResultSet 类型会更加地全面。
同时,通过测试发现,MySQL 5.7 在使用 mysql-connector 6.0x 驱动的情况下并不支持 TYPE_FORWARD_ONLY,但是使用 mysql-connector 8.0.x 驱动的话就可以支持 TYPE_FORWARD_ONLY,可见除了数据库本身会影响着 JDBC 对于 ResultSet 类型的支持之外,所使用的驱动也会影响着 JDBC 对于 ResultSet 类型的支持。