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函数返回的门类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++队列与循环队列
- 下一篇: mysql 1215_mysql执行带外