Java 类型映射到 Java SQL 类型 Util

标签 java sql hibernate jdbc jdbctemplate

我正在使用 java.sql.Connection.createArrayOf() 方法来为我的 SQL 查询创建数组参数。

例如:

Long[] arrayOfLongs = {1L, 2L, 3L};

需要调用conn.createArrayOf("bigint", arrayOfLongs);

同时

String[] arrayOfStrings = {"a", "b", "c"};

需要打电话

conn.createArrayOf("varchar", arrayOfStrings);

等等...

我的问题是:是否有一个实用程序类可以将 Java 类型映射到 SQL 类型(作为字符串而不是整数的 java.sql.TYPES)?非常感谢

最佳答案

据我所知,直接映射(Java 类型 => SQL 类型)是不可能的,因为单个 Java 类型可以匹配许多 SQL 类型。您可以通过 Appendix B of the JBDC API Specification 确认这一点。例如,String可以映射到CHAR , VARCHAR , LONGVARCHAR , NCHAR , NVARCHARLONGNVARCHAR

基本上,您必须将 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);
         }
     }
 }

关于Java 类型映射到 Java SQL 类型 Util,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359634/

相关文章:

php - 选择值达到和超过(但只有一个超过)另一个值的记录?

sql - 如何对过去 3 个月的列中每个字段进行 SUM()

java - 无法使用条件获取列表

java - 如何在 Spring MVC 中管理用户 session

JavaFX - 文件(视频)上传

MySQL 查询计算行之间的时间差

java - Hibernate 继承 SingleTable

java - 如何将枚举的所有值映射到常量表达式?

java - 仅当 Jpanel 大小已满时才显示 Jtable 滚动条

java - 设置不同对象具有相同的属性