我正在使用java.sql.Connection.createArrayOf()
方法为我的SQL查询创建数组参数。
例如:
Long[] arrayOfLongs = {1L, 2L, 3L};
需要致电conn.createArrayOf("bigint", arrayOfLongs);
,而
String[] arrayOfStrings = {"a", "b", "c"};
需要致电
conn.createArrayOf("varchar", arrayOfStrings);
等...
我的问题是:是否有一个Utility类将Java类型映射到SQL类型(作为字符串而不是整个java.sql.TYPES)?非常感谢
答案 0 :(得分:0)
据我所知,直接映射(Java types => SQL类型)是不可能的,因为单个Java类型可以匹配许多SQL类型。您可以使用Appendix B of the JBDC API Specification进行确认。例如,String
可以映射到CHAR
,VARCHAR
,LONGVARCHAR
,NCHAR
,NVARCHAR
或LONGNVARCHAR
。
基本上,您必须将Java类型映射到数据库表描述中使用的数据类型。
更新:
所有JDBC数据库驱动程序都必须实现setObject()
setter,它似乎是SQL数据类型的一种猜测函数。不幸的是,似乎没有可能重用这个功能来实现你想要的东西,但你可以通过查看源代码很好地了解它实际上在做什么。
以下是MySQL正在猜测数据类型的示例:
public void setObject(int parameterIndex, Object parameterObj)
throws SQLException {
if (parameterObj == null) {
setNull(parameterIndex, java.sql.Types.OTHER);
} else {
if (parameterObj instanceof Byte ) {
setInt(parameterIndex, ((Byte ) parameterObj).intValue());
} else if (parameterObj instanceof String ) {
setString(parameterIndex, (String ) parameterObj);
} else if (parameterObj instanceof BigDecimal ) {
setBigDecimal(parameterIndex, (BigDecimal ) parameterObj);
} else if (parameterObj instanceof Short ) {
setShort(parameterIndex, ((Short ) parameterObj).shortValue());
} else if (parameterObj instanceof Integer ) {
setInt(parameterIndex, ((Integer ) parameterObj).intValue());
} else if (parameterObj instanceof Long ) {
setLong(parameterIndex, ((Long ) parameterObj).longValue());
} else if (parameterObj instanceof Float ) {
setFloat(parameterIndex, ((Float ) parameterObj).floatValue());
} else if (parameterObj instanceof Double ) {
setDouble(parameterIndex, ((Double ) parameterObj).doubleValue());
} else if (parameterObj instanceof byte[]) {
setBytes(parameterIndex, (byte[]) parameterObj);
} else if (parameterObj instanceof java.sql.Date ) {
setDate(parameterIndex, (java.sql.Date ) parameterObj);
} else if (parameterObj instanceof Time ) {
setTime(parameterIndex, (Time ) parameterObj);
} else if (parameterObj instanceof Timestamp ) {
setTimestamp(parameterIndex, (Timestamp ) parameterObj);
} else if (parameterObj instanceof Boolean ) {
setBoolean(parameterIndex,
((Boolean ) parameterObj).booleanValue());
} else if (parameterObj instanceof InputStream ) {
setBinaryStream(parameterIndex, (InputStream ) parameterObj, -1);
} else if (parameterObj instanceof java.sql.Blob ) {
setBlob(parameterIndex, (java.sql.Blob ) parameterObj);
} else if (parameterObj instanceof java.sql.Clob ) {
setClob(parameterIndex, (java.sql.Clob ) parameterObj);
} else {
setSerializableObject(parameterIndex, parameterObj);
}
}
}