MySQL TINYINT(1)神秘地映射到Java类型Integer

时间:2015-11-20 11:07:33

标签: java tomcat mysql-connector

我陷入了一个庞大的旧项目(j2sdk 1.4.2,Tomcat 4.1.29,MySQL 5.0.51a),我需要在工作中安装新的开发环境。

我有一个由我的Tomcat访问的MySQL数据库,它处理来自我的Java应用程序的请求。在该DB中,某些表包含我的应用程序所需的布尔值。

因此,在应用程序中,会生成一个预准备语句,将参数添加到其中,然后启动请求,并将此请求的结果集存储在自定义SQLResult对象内(即我的公司制作的自定义框架,不能做任何事情 - 但是,它与经典的java.sql.ResultSet对象非常相似。

问题在于:当java应用程序请求将一些数据存储在数据库中TINYINT(1)时,这些数据将作为java.lang.Integer而不是java.lang.Boolean返回给Java应用程序,如我想。

注意:Tomcat服务器使用的JDBC连接器版本是mysql-connector-java-3.0.11-stable。

到目前为止我测试的内容(没有结果):

  • 升级/降级MySQL连接器
  • 添加tinyInt1isBit=<true/1>作为我的连接字符串
  • 的结尾
  • 升级/降级MySQL数据库,始终使用源代码中给出的相同数据转储
  • 我记不起的其他很多东西,因为我测试了很多东西: - /

我现在很确定问题来自Tomcat服务器使用的MySQL JDBC连接器。因此,当我更改连接器的版本时,没有其他任何工作了(意思是,甚至无法连接用户)。

有什么想法吗?

编辑:我忘了确切地说,在java应用程序的另一部分中,对DECIMAL存储的数据的请求将返回为java.lang.String!这也是我必须解决的一个主要问题,但我认为这两个问题与原因有关。

2 个答案:

答案 0 :(得分:2)

来自Connector/J documentation

  

MySQL类型名称: TINYINT

     

GetColumnClassName的返回值: TINYINT

     

如果配置属性tinyInt1isBit设置为true(默认值)且存储大小为1,则返回Java类: java.lang.Boolean,如果不是,则返回java.lang.Integer。 / p>

请注意:或java.lang.Integer,如果没有。检查属性tinyInt1isBit并可能更改它。

如果您已经尝试重启mysql服务器。

答案 1 :(得分:0)

因此,经过一整周的工作,我设法找到了解决方案。当心,这有点愚蠢。

当我认为MySQL连接器是我的问题的根源时,我是对的。我决定重试我今天尝试的所有事情来解决这个问题,所以我稍微升级了连接器(从v3.0.11升级到v3.1.14)。然后我重新启动了有问题的数据库请求,并注意到我之前在Tomcat日志中没有看到的ERROR日志:指定的数据库名称不正确(类似myDB\?autoReconnect=true...)。实际上,在连接参数部分之前错误地插入了\

我从连接字符串中删除了有罪的\,重新启动了我的Tomcat,然后...... tadaaa!我的问题解决了!

但是,我使用旧的MySQL连接器(v3.0.11)进行了测试,它仍然将TINYINT(1)作为java.lang.IntegerDECIMAL作为java.lang.String返回。所以我猜客户端在它的生产Tomcat上升级了它的MySQL连接器而没有警告我。

无论如何,谢谢大家的建议。猜猜我将来调试时会更仔细地阅读服务器日志: - )