如何在Java中确定检索到的值类型?

时间:2016-09-29 09:14:34

标签: java

搜索失败了好几天,我想我会问。

我正在从表中检索一个值,该列的列都是varchar。我们如何确定价值的类型。例如,

帐号可能包含123456123456:78910

等值
    ...
    try(ResultSet rs = stmt.executeQuery("select * from table")){
      if(rs.next()){
        //Cannot use anything other than 'getString'
        String var = rs.getString("accountnumber");                 
        //Determine if var is an Integer
        System.out.println(var instanceof Integer)  //returns false because 'var' is of type String.
      }
    }
   ...

非常感谢任何指针。

3 个答案:

答案 0 :(得分:2)

事情按预期工作。这些列在模式中键入为varchar,因此数据库和Java SQL接口无法知道您是否确实有数字或名称或日期或内部存储的任何内容。只有getString才有效。

您可以尝试以有意义的方式解析字符串结果。

例如,Integer.parseInt方法会将字符串转换为整数,或者如果不能则抛出异常。有LongDouble等的等效版本。

但是,查看示例帐户数字,它们不是真正的整数,而是具有更复杂的结构。您可能希望使用具有两个字段的类(primaryAccountNumber,theOtherAccountNumber)等对其进行建模,并且应该进行解析。

另一方面,您不应该从数据库select *,而应该明确您需要的字段。这可以防止模式更改删除您所依赖的字段(选择将失败,而不是稍后的某些代码),或者引入太多数据并仅使用一些数据。

答案 1 :(得分:1)

ResultSet#getMetaData();会为您提供所需的信息。 ResultMetaData有一些方法可以帮助例如。 getColumnType(int)getColumnClassName(int)

答案 2 :(得分:0)

您可以使用pattern matching检查其编号或字符串。

  String var = rs.getString("accountnumber");
  Matcher ss1 = Pattern.compile("([0-9]*)").matcher(var);
  if (ss1.matches()) {
      // its a number
  } else {
      // its a string
  }