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

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

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

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

List 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.)

外链网址已屏蔽

原来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 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;

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值