300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > MySQL的sum函数返回的门类

MySQL的sum函数返回的门类

时间:2018-10-22 10:27:40

相关推荐

MySQL的sum函数返回的门类

数据库|mysql教程

MySQL,sum,函数,返回,门类,MySQL,sum,函

数据库-mysql教程

爱溜源码论坛,vscode换行输入,笔记本刷ubuntu刷不了系统,sts中 tomcat,sqlite批量创建表,隐藏设置选项插件,前端超好看的ui框架,爬虫文件无法从pycharm,php 局部刷新,seo公司赚钱,快鲤鱼网站那样的程序,公司网页设计模板,个人网站模板制作教程lzw

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

tp5个人博客源码,vscode 么使用,s4 ubuntu,tomcat alpha,sqlite 时间相减,windows服务器防火墙怎么关闭,jquery 裁剪插件,容易的前端框架,nodejs爬虫 异步,php面向对象三大特性,seo推广 是什么,电台网站模板,网页许愿墙,酷炫片头免费模板,织梦404页面自动跳转,mfc图书管理系统,第四方支付平台程序lzw

php淘宝客源码,双系统花屏ubuntu,tomcat 8连接池配置,爬虫模拟js交互,php考试管理系统效果图,海口包年seolzw

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

/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 pointreturn (int) (Double.parseDouble(val)); } } else { return 0; }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。