日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2024/9/27 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql sum函数返回类型_MySQL的sum函数返回的门类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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";

Listrows = 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:

Listlist = 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;

}

本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴

本文系統來源:php中文網

總結

以上是生活随笔為你收集整理的mysql sum函数返回类型_MySQL的sum函数返回的门类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。