您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

MySQL的sum函数返回的门类

2024/11/17 0:57:05发布24次查看
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;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
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 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; }
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product