当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

MySQL的sum函数返回的类型

发表于: 2013-12-03   作者:bylijinnan   来源:转载   浏览:
摘要: 今天项目切换数据库时,出错 访问数据库的代码大概是这样: String sql = "select sum(number) as sumNumberOfOneDay from tableName"; List<Map> rows = getJdbcTemplate().queryForList(sql); for (Map row : rows
今天项目切换数据库时,出错

访问数据库的代码大概是这样:
String sql =  "select sum(number) as sumNumberOfOneDay from tableName";
List<Map> rows = 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:
List<SomeBean> list = 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;
        }



    

MySQL的sum函数返回的类型

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在C# 5.0功能之Async一瞥中,简单的介绍了Async CTP的使用,我们一起领略了下一版本的C#可能给我们
函数返回引用和指针类型 #include <stdio.h> #include <stdlib.h> #include <iostre
在C# 5.0功能之Async一瞥中,简单的介绍了Async CTP的使用,我们一起领略了下一版本的C#可能给我们
下面主要是一个简单的例子,复制到oracle数据库的相应位置即可使用 1、 2、create or replace type
mysql sum求和 字段为double类型 精度不对 [问题点数:40分] 不显示删除回复 显示所有回复 显示星级
IntelliSense:无法重载仅按返回类型区分的函数 d:\programfiles (x86)\microsoft sdks\windows\v7.0
一、 ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看。 ASP.NET MVC 1
一、 ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看。 ASP.NET MVC 1
一、 ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看。 ASP.NET MVC 1
新建后台代码用以测试返回类型,在这里我新建的如下: [java] view plain copy /** * 项目名称:Spr
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号