Igo*_*pov 6 java jdbc derby h2 hsqldb
这是令我头疼的代码:
public List<String> listColumnsForTable(String tableName) throws SQLException {
List<String> columns = new ArrayList<String>();
DatabaseMetaData metadata = _connection.getMetaData();
ResultSet resultSet = metadata.getColumns(null, null, tableName, null);
while (resultSet.next())
columns.add(resultSet.getString("COLUMN_NAME"));
return columns;
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于SQL Server(我没有检查过MySQL,Oracle或其他),但我需要在内存数据库中运行一些集成测试.我尝试的所有数据库(h2,hsqldb和derby)都失败了.
这是github上的链接.
如果你想要完整的项目(测试h2,hsqldb,derby和sql server),请执行以下操作:
git clone git://github.com/sensui/InMemoryColumns.git
cd InMemoryColumns
gradlew
Run Code Online (Sandbox Code Playgroud)
所有依赖项将自动下载.如果要查看库版本,请查看build.gradle脚本.
现在,在您喜欢的IDE(eclipse或idea)中导入项目.
测试在DatabaseMetadataCheckerTests类(canListColumnsForTable和canCheckIfColumnsExistInTable)中可用.
通常你不应该修改它们.我创建了4个测试类,为内存数据库中的每个提供连接细节,你需要运行它们(这DatabaseMetadataCheckerTests是抽象的,所以你不运行它).
注意:
当/找到解决方案时,将通过该特定数据库的测试.您可以通过扩展DatabaseMetadataCheckerTests类并提供连接详细信息(检查其他测试)轻松尝试其他数据库,如Oracle或MySQL .
该表名和列名应该是大写.检查此提交以获取详细信息
H2,HSQLDB(以及Oracle和DB2)符合SQL标准,因此不带引号的对象名称被折叠为大写(SQL Server不会这样做,它保留您使用的任何情况,并且它可能被配置为不区分大小写字符串比较).
create table foo (id integer)将FOO与列名一起存储ID在系统目录中.
因此,您需要将表名以大写形式传递给JDBC API调用.
关于将此移植到其他DBMS的说明:
Postgres不符合此处的标准,并将所有内容折叠为小写
对于MySQL,它没有明确的答案如何做到这一点.它取决于各种配置设置(以及存储引擎和文件系统),因此您永远无法确定不带引号的表名将如何实际存储在系统中.
| 归档时间: |
|
| 查看次数: |
2073 次 |
| 最近记录: |