我想知道在运行时检查变量类型的最佳方法。
public Iterator<?> read(String entityName, String propertyName, Object propertyValue) {
String query = "select * from " + entityName + " where " + propertyName + "=";
try {
int value = Integer.parseInt((String)propertyValue);
query=query+value;
} catch (NumberFormatException e) {
// failed
}
try {
String value = (String)propertyValue;
query=query+"'"+value+"'";
} catch (ClassCastException e) {
// failed
}
try {
float value = Float.parseFloat((String)propertyValue);
query=query+value;
} catch (NumberFormatException e) {
// failed
}
//Creating JDBC connection and execute query
Iterator<Element> result=queryConn.execute();
return result;
}
我需要在运行时检查变量类型是int,float还是String。还有其他最好的办法吗?
或者我是否需要为每个变量类型编写单独的方法?
答案 0 :(得分:4)
试试这段代码:
if(floatVariable instanceof Float){}
if(intVariable instanceof Integer){}
if(stringVariable instanceof String){}
答案 1 :(得分:1)
还有其他最好的办法吗?
我建议您在实际查询中命名要选择的列。如果采用这种方法,则可以将每个列解析为适当的类型,而不必担心类型转换问题。例如,如果选择的第一列是整数类型,那么您只需调用Integer.parseInt()
而不必担心类型错误。
这是一个争论,为什么使用SELECT *
是一种反模式:
如果您使用SELECT *
作为查询,那么我们甚至不知道要返回的列数。为了对此进行猜测,我们必须分析您的代码似乎期望的列数。但是,如果有人要更改架构会发生什么,从而可能会改变RDBMS返回列的顺序?然后您的整个应用程序逻辑可能必须更改。
答案 2 :(得分:1)
有很多方法可以处理这种情况。
答案 3 :(得分:1)
因为您将对象作为输入,所以您始终可以使用 instanceof 关键字进行检查。而不是使用原语尝试使用类似(Integer.class)的类。还有一件事是你应该使用 PreparedStatement always.Your代码容易出现 SqlInjection 。