MySQL的sum函数返回的类型 今天项目切换数据库时,出错 访问数据库的代码大概是这样: String sql = "select sum(number) as sumNumberOfOneDay from tableName";ListMap rows = getJdbcTemplate().queryForList(sql);for (Map row : rows) {SomeBean item =

MySQL的sum函数返回的类型

今天项目切换数据库时,出错

访问数据库的代码大概是这样:

String sql = "select sum(number) as sumNumberOfOneDay from tableName";

Listrows = getJdbcTemplate().queryForList(sql);

for (Map row : rows) {

SomeBean item = new SomeBean();

item.setSumNumberOfOneDay(objectToInt(row.get("sumNumberOfOneDay")));

}

private int objectToInt(Object obj) {

return Integer.parseInt("" + obj);

}

表字段“number”的类型是int(10) unsigned

连接数据库DataBaseA,测试运行正常;切换到另一数据库DataBaseB(数据库表,表名,表结构一样)时,发现报错:

java.lang.NumberFormatException: For input string: "10.0"

把sql语句拷贝到MySQL命令行窗口里面直接执行,sum(number)返回的值是10;

但在Spring的getJdbcTemplate().queryForList(sql)返回,则变成了10.0,

打印row.get("sumNumberOfOneDay").getClass()的结果是:class java.lang.Double

切回DataBaseA,打印结果是java.math.BigDecimal

两个数据库的查询结果在MySQL命令行窗口返回整数,但在Java程序中返回浮点数

那不用Spring,直接操作JDBC:

Connection conn = getJdbcTemplate().getDataSource().getConnection();

Statement st = conn.createStatement();

ResultSet rs = st.executeQuery(sql);

ResultSetMetaData rsmd = rs.getMetaData();

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

String name = rsmd.getColumnName(i);

String type = rsmd.getColumnTypeName(i);

System.out.println(name + ", " + type);

}

DataBaseA打印的结果:

sumNumberOfOneDay, DECIMAL

DataBaseB打印的结果:

sumNumberOfOneDay, DOUBLE

基本可判断是MySQL的问题

网上搜索一下,果然:

The SUM() and AVG() functions return a DECIMAL value for exact-value arguments (integer or DECIMAL), and a DOUBLE value for approximate-value arguments (FLOAT or DOUBLE). (Before MySQL 5.0.3, SUM() and AVG() return DOUBLE for all numeric arguments.)

http://stackoverflow.com/questions/10592481/what-is-the-return-type-of-sum-in-mysql

原来MySQL 5.0.3之前的版本,sum函数返回的是DOUBLE类型

回头检查一下MySQL的版本:

DataBaseA:

5.1.44 Source distribution

DataBaseB:

4.1.7-standard-log

果然是这样

解决办法:

1.笨方法,就是重写objectToInt方法:

if (obj instanceof Double) {

return ((Double)obj).intValue();

}

if (obj instanceof BigDecimal) {

return ((BigDecimal)obj).intValue();

}

return Integer.parseInt(obj.toString());

2.利用Spring的BeanPropertyRowMapper:

Listlist = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(SomeBean.class));

应该尽量采用方法2,避免自己处理

查看一下Spring的getJdbcTemplate().query(sql, new BeanPropertyRowMapper(SomeBean.class))方法,

发现它的大体思路是这样:

1.通过SomeBean.class得到所有property

2.根据property的类型,调用ResultSet.getXXX()得到对应的值

在ResultSet.getXXX()方法里面,就实现了类型转换

例如com.mysql.jdbc.Result的getInt方法(关键部分的代码):

val = getString(columnIndex);

if ((val != null) && (val.length() != 0)) {

if ((val.indexOf("e") == -1) && (val.indexOf("E") == -1)

&& (val.indexOf(".") == -1)) {

return Integer.parseInt(val);

} else {

// Convert floating point

return (int) (Double.parseDouble(val));

}

} else {

return 0;

}

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

mysql sum函数返回类型_MySQL的sum函数返回的门类相关推荐

  1. mysql sum返回类型_MySQL的sum函数返回的类型

    今天项目切换数据库时,出错 访问数据库的代码大概是这样: String sql = "select sum(number) as sumNumberOfOneDay from tableNa ...

  2. oracle sum函数返回类型,Oracle / PLSQL SUM函数

    这个Oracle教程解释了如何使用Oracle / PLSQL SUM函数. SUM(x) 添加x中的所有值,并返回总和. SUM函数对一组行进行操作,并返回一行输出. Null值被SUM函数忽略.您 ...

  3. mysql自定义函数的分号_MySQL之自定义函数实例讲解

    转自:https://www.2cto.com/database/201804/740205.html MySQL中已经有很多函数,如时间函数等,但是有时这些函数不能满足自己的设计需求,此时需要自定义 ...

  4. mysql自定义函数的分号_MySQL基础(三)—函数、自定义函数

    上一篇 MySQL基础(二)-操作表记录 这一篇是对函数的笔记,其中操作的数据库在上一篇文章中有代码,可以去看一下. 1.函数 1.1:函数的分类 字符函数 数值运算符与函数 比较运算符与函数 日期时 ...

  5. mysql自定义函数的分号_MySQL基础(三)―函数、自定义函数

    MySQL基础(二)―操作表记录 这一篇是对han的笔记,其中操作的数据库在上一篇文章中有代码,可以去看一下. 字符函数 数值运算符与函数 比较运算符与函数 日期时间函数 信息函数 聚合函数 加密函数 ...

  6. mysql concat键值对_mysql中concat函数实现数据库字段合并查询

    concat()函数是mysql中用来字符类型的字段联合查询的一个不错的函数,但尽量不要使用哦, mysql中怎么合并两个字段为一个字段呢?试了好多方法,结果还是不是我想要的 例如:select (a ...

  7. mysql几种索引类型_Mysql几种索引类型的区别及适用情况

    如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyI ...

  8. 数组在mysql中是什么类型_MySQL 中的数据类型介绍

    1.概述 要了解一个数据库,我们也必须了解其支持的数据类型. MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型 字符串类型 时间日期类型 另一类是几何数据类型,用的不多,也没多介绍.  ...

  9. mysql相隔多长时间_Mysql 计算时间间隔函数

    mysql计算时间差函数 MySql计算两个日期的时间差函数TIMESTAMPDIFF用法,只要用一句SQL语句就可以办到了. MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法 ...

最新文章

  1. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
  2. linux centos lamp,Centos下搭建LAMP
  3. QT的QDBusVariant类的使用
  4. C# async 和 await 理解
  5. 正确使用PresentModalViewController
  6. LeetCode 1855. 下标对中的最大距离(双指针)
  7. iphone开发之C++和Objective-C混编
  8. pandas 基本使用
  9. [leetcode]1.两数之和
  10. android paint 线宽_Paint setStrokeWidth方法:设置空心线宽
  11. mysql q4m_Mysql Q4M 队列操作封装(二)
  12. 高薪诚聘项目经理,架构师,高级工程师,工程师,网页设计师
  13. zencart 商城 Twitter推广技巧
  14. android html模板下载地址,Android HTML模板
  15. 淘宝虚拟物品类目管理规范
  16. ssh连接远程服务器
  17. 2019年中国公有云厂商发展状况白皮书
  18. c语言程序设置存根,gmock可以用于存根C函数吗?
  19. ps更换证件照底色(视频版)
  20. 161、锐捷交换机如何配置ssh管理

热门文章

  1. Andrew Ng深度学习课程笔记
  2. 浅述 Docker 的容器编排
  3. 数据中台 VS 传统大数据平台,这 8 点区别要了解
  4. 对不起,我把APP也给爬了
  5. oracle 12c 低版本,oracle高版本迁移数据到低版本(12c至11g)方法
  6. python创建只包含一个元素的元组时_Python中声明只包含一个元素的元组数据方法...
  7. ironpython3桌面开发_IronPython项目有了新负责人
  8. RuoYi-Cloud 进阶篇_01( Seata 单机环境搭建)
  9. (进阶篇)Redis6.2.0 集群 哨兵模式_哨兵工作原理_02
  10. Guns 查询列表_入门试炼03