背景
在开发数据清洗框架的时候, 基本思路是通过,配置任务的时候,通过设置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.
解决此问题
-
设置属性 tinyInt1isBit=false
-
设置MySQL字段类型根据实际情况, 如果只有 0 1 (true false)情况的,可以使用tinyint(1), 否则,类型不要设置 tinyint(1)