JDBC类型真的重要吗?

JDBC类型真的重要吗?,jdbc,Jdbc,在当今的驱动程序中,JDBCTypes是最流行的DBMS之一,并且总是设置为JDBCType.OTHER?输入/输出类能否在字符流/二进制流/数字/时间点类型类中互换使用 我首先询问的是JDBCType/java.sql.Types常量,其次是用于检索的方法(即列映射到的java类)。我对几个数据库的经验是,一般来说,只要有意义,它们会很乐意将任何东西转换成任何其他东西。请注意,我没有执行任何类型的穷举测试,这只是一种经验,我几乎总是可以访问ResultSet列作为我在该上下文中特别想要的任何类

在当今的驱动程序中,
JDBCType
s是最流行的DBMS之一,并且总是设置为
JDBCType.OTHER
?输入/输出类能否在字符流/二进制流/数字/时间点类型类中互换使用

我首先询问的是
JDBCType
/
java.sql.Types
常量,其次是用于检索的方法(即列映射到的java类)。我对几个数据库的经验是,一般来说,只要有意义,它们会很乐意将任何东西转换成任何其他东西。请注意,我没有执行任何类型的穷举测试,这只是一种经验,我几乎总是可以访问ResultSet列作为我在该上下文中特别想要的任何类型,而不必担心JDBCDBMS SQL映射。显然,我在这里不提倡
timestamstring
integerstring
转换和类似的转换;例如,我还意识到使用
getObject
zoneDateTime
访问列与手动转换
getTimestamp
的结果之间的细微差别,但这是这些类背后的概念之间的差别

显然,应用程序实际上只在
PreparedStatement.setNull
CallableStatement.registerOutParameter
中使用
JDBCType
,我的经验是,只要我坚持数字/字符串/时间/二进制的区别,我就可以根据自己的意愿选择类


因此,总的来说,在我看来,它们似乎是15年前有问题的例子的遗迹,当时我们没有构建现代服务器端应用程序的经验和知识,大多数Java EE都是基于幻想的。

类型常量本身也用于元数据内省。例如,对于
DatabaseMetaData.getColumns
,结果集列
DATA\u TYPE
包含
java.sql.Types
代码和
ResultSetMetaData.getColumnType
返回
java.sql.Types
代码,该代码适用于其他元数据方法和对象。元数据内省在普通程序中可能不是很重要,但数据库工具和数据访问库或框架经常使用它

其他用途实际上取决于驱动程序和数据库系统。一些驱动程序(和数据库系统)总是在准备时间确定列的类型,并且在设置值时,驱动程序将值转换为参数的预期类型(只要这种转换是可能的或由JDBC指定)。也就是说,如果参数是VARCHAR,并且您设置了一个long,那么驱动程序将把long转换为string,并使用string作为参数值。对于那些数据库系统,
java.sql.Types
java.sql.JDBCType
没有太多的价值(除了元数据内省),通常会被忽略

在其他数据库系统及其驱动程序中,参数在准备时不一定具有预期的类型(或者,如果驱动程序提供类型信息,则可以跳过准备阶段,或者数据库系统允许您覆盖参数类型),类型将通过显式设置值来确定(因此,设置字符串将确定类型为VARCHAR,而设置long将确定类型为BIGINT,等等)。在这些情况下,类型常量将有用途,例如在
setNull
setObject
中,因为它将指定参数的类型,这可能会推断驱动程序或数据库上的特定转换或行为。在将参数传递给多态或重载的情况下,也可能需要使用类型常量d函数(也就是说,参数的实际类型决定函数的作用和返回内容)


CallableStatement
中的
registerOutParameter
实际上是一种特殊情况。对于第一种类型的驱动程序,这在技术上通常是不必要的(因为类型将由prepare确定),而对于第二种类型,可能需要将值到特定类型的转换留给数据库引擎,也可能需要能够在没有显式准备的情况下执行存储过程:您告诉驱动程序需要哪些OUT类型,然后驱动程序可以在没有先准备的情况下执行该过程。在最后一种情况下,在例如,它将发送语句文本、参数和预期OUT类型的描述符(不兼容的类型、太少或太多的参数或OUT类型等,数据库系统将拒绝执行,或者——虽然我不知道实际上是否存在这种情况——实际参数类型和预期OUT类型的组合可以选择特定的存储过程实现(如果数据库系统支持重载存储过程)er元数据方法和对象。元数据内省在普通程序中可能不太重要,但数据库工具和数据访问库或框架经常使用它

其他用法实际上取决于驱动程序和数据库系统。某些驱动程序(和数据库系统)将始终根据准备时间确定列的类型,并且在设置值时,驱动程序将值转换为参数的预期类型(只要这种转换是可能的或由JDBC指定)。也就是说,如果参数为VARCHAR,并且您设置了一个long,那么驱动程序将把long转换为字符串,并使用字符串作为参数值