最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL的sum函数返回的门类

来源:动视网 责编:小采 时间:2020-11-09 13:59:35
文档

MySQL的sum函数返回的门类

MySQL的sum函数返回的门类:MySQL的sum函数返回的类型 今天项目切换数据库时,出错 访问数据库的代码大概是这样: String sql = select sum(number) as sumNumberOfOneDay from tableName;ListMap rows = getJdbcTemplate().queryForList(
推荐度:
导读MySQL的sum函数返回的门类:MySQL的sum函数返回的类型 今天项目切换数据库时,出错 访问数据库的代码大概是这样: String sql = select sum(number) as sumNumberOfOneDay from tableName;ListMap rows = getJdbcTemplate().queryForList(


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 <= 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:
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;
 }

文档

MySQL的sum函数返回的门类

MySQL的sum函数返回的门类:MySQL的sum函数返回的类型 今天项目切换数据库时,出错 访问数据库的代码大概是这样: String sql = select sum(number) as sumNumberOfOneDay from tableName;ListMap rows = getJdbcTemplate().queryForList(
推荐度:
标签: 返回 函数 mysql
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top