Jdbc把MySQL tinyint(1) 数据类型转换为Boolean类型问题记录

1,546 阅读1分钟

背景

在开发数据清洗框架的时候, 基本思路是通过,配置任务的时候,通过设置sql及数据库server等信息,实现迭代器,读取待清洗数据,此方式使用jdbcTemplate直接执行拼装的SQL。读取数据库的tinyint(1)类型的字段被映射成Java Boolean类型数据类型。

问题分析

类型转换出错,debug发现,tinyint(1) 被解析成了

com.mysql.cj.result.Field@532171fa[dbName=bbs,tableName=topics,originalTableName=topics,columnName=recommendStatus,originalColumnName=is_recommend,mysqlType=1(FIELD_TYPE_BIT),sqlType=-7,flags=, charsetIndex=63, charsetName=ISO-8859-1] 

tinyint 类型字段被解析成了

com.mysql.cj.result.Field@2604d8ef[dbName=bbs,tableName=topics,originalTableName=topics,columnName=status,originalColumnName=status,mysqlType=1(FIELD_TYPE_TINYINT),sqlType=-6,flags=, charsetIndex=63, charsetName=ISO-8859-1]

比较两者发现都是tinyint 解析结果不一样。代码如下:

// 初始化DataSource
dataSource.setJdbcUrl(context.getJdbc().getUrl());
dataSource.setUsername(context.getJdbc().getUsername());
dataSource.setPassword(context.getJdbc().getPassword());
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);

// 获取数据
resultSet.getObject(columnName);

com.mysql.cj.jdbc.Driver 驱动使用的mysql-connector-java 8.0.x 版本

参考: dev.mysql.com/doc/connect…

其注明映射关系

TINYINT TINYINT java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not.

解决此问题

  1. 设置属性 tinyInt1isBit=false

  2. 设置MySQL字段类型根据实际情况, 如果只有 0 1 (true false)情况的,可以使用tinyint(1), 否则,类型不要设置 tinyint(1)