JDBC 查询和插入任意表

Posted

技术标签:

【中文标题】JDBC 查询和插入任意表【英文标题】:JDBC querying and inserting into arbitrary tables 【发布时间】:2015-11-29 04:48:16 【问题描述】:

使用 JDBC 查询(总是选择所有列)和插入任意 Oracle 数据库表的好方法是什么?我创建了以下方法(尚未测试它)来检索任何表的属性名称和类型(我需要这些名称用于显示目的):

public ArrayList<Map<String, String>> retrieveTableAttributes(String tableName) throws SQLException
  ArrayList<Map<String, String>> attributes = new ArrayList<>();
  DatabaseMetaData dbmd = conn.getMetaData();
  ResultSet resultSet = dbmd.getColumns(null, null, tableName, null);
  int i = 0;
  while (resultSet.next()) 
    attributes.add(new HashMap<String, String>());
    attributes.get(i).put(resultSet.getString("COLUMN_NAME"), resultSet.getString("TYPE_NAME"));
    i++;
  
  resultSet.close();
  return attributes;

我发现了这个方法PreparedStatement#setObject(int parameterIndex, Object x, int targetSqlType),我认为它可以用来为任意列类型设置一个值(在这种情况下,我需要将列类型作为 int 而不是类型名称),但我是不确定。那么,有没有更好的方法来设置和更重要的是从任意类型的列中获取值?如果有帮助,我正在尝试创建一个 Java EE GUI 工具来操作数据库(从数据库中的任何表中添加、删除、更新行)。

【问题讨论】:

【参考方案1】:

使用反射从命名类型中获取类型代码的简单方法:

public int getTypeByName(String name) 
    for (Field field : java.sql.Types.class.getFields()) 
        if (name.equalsIgnoreCase(field.getName())) return (Integer) field.get(null);
    

    return -1;

请注意,可能无法保证 TYPE_NAME 列与 Oracle 的列支持相匹配。更安全的选择可能只是依靠驱动程序使用无类型的 setObject 和 getObject 方法做出正确的转换选择。

【讨论】:

以上是关于JDBC 查询和插入任意表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jdbc oracle 插入和选择全局临时表? [复制]

SQL 查询能使用事务嘛?合适嘛?

测试通过 Mule JDBC 传输到嵌入式 HSQLDB 的插入,后续查询不返回任何结果

jdbc 批量插入和查询与使用生成键的单次插入

如何在没有连接的情况下查询多个相关表,并使用 JDBC 获得一致的数据?

java jdbc 删除数据库表中一列后不能用SQL语句在更新和查询表中其他数据了