Heim > Datenbank > MySQL-Tutorial > MySQL的sum函数返回的门类

MySQL的sum函数返回的门类

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-07 16:16:01
Original
1885 Leute haben es durchsucht

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<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);
}</map>
Nach dem Login kopieren


表字段“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 <br>DataBaseA打印的结果:<br>sumNumberOfOneDay, DECIMAL<br><br>DataBaseB打印的结果:<br>sumNumberOfOneDay, DOUBLE<br><br>基本可判断是MySQL的问题<br><br>网上搜索一下,果然:<br><pre name="code" class="java">
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.)
Nach dem Login kopieren

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());
			
Nach dem Login kopieren

2.利用Spring的BeanPropertyRowMapper:
List<somebean> list = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(SomeBean.class));
</somebean>
Nach dem Login kopieren

应该尽量采用方法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;
        }

Nach dem Login kopieren


    
Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
So ändern Sie MySQL in MySQL
Aus 1970-01-01 08:00:00
0
0
0
MySQL stoppt den Prozess
Aus 1970-01-01 08:00:00
0
0
0
MySQL-Startfehler unter Centos
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage