`
edisonlv2010
  • 浏览: 43647 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JdbcTemplate中queryForObject的空结果或不正确结果数量问题

 
阅读更多
在使用Spring提供的JdbcTemplate中名为queryForObject API进行数据库查询时有时会抛出如下异常提示息,org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0 或者 org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2

在解决这些异常之前,我们首先来看看queryForObject API的源代码,假设我们调用的是queryForObjec(String sql, Class requiredType)。

JdbcTemplate.class
public <T> T queryForObject(String sql, Class<T> requiredType) 
		throws DataAccessException 
{return queryForObject(sql, getSingleColumnRowMapper(requiredType));}

public <T> T queryForObject(String sql, RowMapper<T> rowMapper) 
		throws DataAccessException {
    List<T> results = query(sql, rowMapper);
    return DataAccessUtils.requiredSingleResult(results);
}

public <T> List<T> query(String sql, RowMapper<T> rowMapper) 
		throws DataAccessException {
    return query(sql, new RowMapperResultSetExtractor<T>(rowMapper));
}

public <T> T query(final String sql, final ResultSetExtractor<T> rse) 
		throws DataAccessException {
	Assert.notNull(sql, "SQL must not be null");
	Assert.notNull(rse, "ResultSetExtractor must not be null");
	if (logger.isDebugEnabled()) {
		logger.debug("Executing SQL query [" + sql + "]");
	}
	class QueryStatementCallback implements StatementCallback<T>, SqlProvider {
		public T doInStatement(Statement stmt) throws SQLException {
			ResultSet rs = null;
			try {
				rs = stmt.executeQuery(sql);
				ResultSet rsToUse = rs;
				if (nativeJdbcExtractor != null) {
					rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
				}
				return rse.extractData(rsToUse);
			}
			finally {
				JdbcUtils.closeResultSet(rs);
			}
		}
		public String getSql() {
			return sql;
		}
	}
	return execute(new QueryStatementCallback());
}


DataAccessUtils.class
public static <T> T requiredSingleResult(Collection<T> results) 
		throws IncorrectResultSizeDataAccessException {
	int size = (results != null ? results.size() : 0);
	if (size == 0) {
		throw new EmptyResultDataAccessException(1);
	}
	if (results.size() > 1) {
		throw new IncorrectResultSizeDataAccessException(1, size);
	}
	return results.iterator().next();
}


通过阅读源代码,可以很清楚看到在DataAccessUtils.class中requiredSingleResult方法中,当结果集合的size为0或者大于1时,就会抛出以上两个异常。

为了避免出现以上的异常,最好还是使用queryForList API,即使返回的结果集合的size为0,即Zero Row,也不会抛出异常。如果size不为0,即可以使用get(0)取得第一个查询对象。

分享到:
评论

相关推荐

    Spring框架JdbcTemplate类中查询方法介绍

    在查询结果为空或查询结果大于 1 行时,JdbcTemplate 会抛出异常。这些异常包括: * org.springframework.dao.EmptyResultDataAccessException:查询结果为空 * org.springframework.dao....

    4.Spring中的JdbcTemplate,Spring中的的事务,

    ### Spring中的JdbcTemplate #### JdbcTemplate概述 JdbcTemplate是Spring框架提供的一种用于简化JDBC编程的对象。通过封装原生的JDBC API,JdbcTemplate不仅提高了代码的可读性和可维护性,还帮助开发者避免了...

    JdbcTemplate实例

    例如,`queryForInt()`用于返回整型结果,如`jdbcTemplate.queryForInt("select count(*) from user")`将返回user表格中的数据数目。 - `queryForObject()`方法:用于执行SQL查询并返回单个对象。示例中展示了如何...

    Spring JdbcTemplate 常用方法整理

    Spring的JdbcTemplate是Spring框架中用于简化数据库操作的工具类,它是基于JDBC但又抽象出了一层,避免了直接与数据库驱动API交互,从而提高了代码的可读性和可维护性。本文将深入探讨Spring JdbcTemplate的常用方法...

    jdbcTemplate

    5. **查询结果处理**:`JdbcTemplate`提供了多种方法来处理查询结果,如`queryForList`、`queryForObject`等,可以方便地将结果映射到Java对象。 6. **回调接口**:通过`PreparedStatementCreator`和`...

    JdbcTemplate操作总结

    总结起来,JdbcTemplate是Spring框架中一个强大的数据库操作工具,它通过提供一套模板方法简化了SQL的执行和结果处理,同时具备事务管理和安全性。通过合理配置和恰当的使用,可以大大提高开发效率,降低出错概率,...

    JdbcTemplate查询

    如果查询结果为空或不匹配指定的返回类型,则会抛出异常。 ##### 3. `queryForList()` 当需要获取多行数据时,可以使用`queryForList()`方法,它将返回一个包含多个映射关系的列表。每个映射都表示一条记录,其中...

    SpringJdbcTemplate封装工具类

    "更新记录.docx"文件可能是项目开发过程中对SpringJdbcTemplate封装工具类的修改日志,记录了每次更新的功能改进、bug修复或性能优化等内容,这对于版本管理和问题排查非常有帮助。 通过上述分析,我们可以看到...

    Spring--JdbcTemplate.pdf

    标题中提到的"JdbcTemplate"是Spring框架中提供的一个用于简化数据库操作的JDBC抽象库。它是对Java标准数据库编程接口JDBC的一种封装,旨在简化JDBC编程,减少样板代码,使得开发者在使用Spring框架时能够更便捷地对...

    springmvc JdbcTemplate demo

    在“WebJdbc”这个文件夹中,可能包含了一些示例代码或配置文件,用于演示SpringMVC和JdbcTemplate的整合。通过这些文件,初学者可以更好地理解这两个组件如何协同工作,以及如何在实际项目中进行数据库操作。学习这...

    Spring框架中jdbcTemplate 的使用.doc

    在查询中,JdbcTemplate可以根据提供的Class类型自动将数据库中的结果转换为对应的Java对象。例如,`queryForObject()`方法的第三个参数就是目标类型的Class对象,用于指定结果的类型。 8. **批处理**: 如果需要...

    spring jdbcTemplate 源码

    首先,让我们了解在不使用JDBCTemplate时,传统的JDBC操作通常涉及以下步骤:加载驱动、建立数据库连接、创建Statement或PreparedStatement对象、执行SQL、处理结果集、关闭资源。这个过程繁琐且容易出错,尤其是在...

    JdbcTemplate.jar

    - **queryForObject()**:执行查询并期望返回单个对象,如果结果集为空或有多个结果,会抛出异常。 - **update()**:用于执行更新、插入、删除等操作,返回受影响的行数。 - **execute()**:可以执行任意的SQL语句,...

    jdbcTemplate相关jar包.zip

    JdbcTemplate是Spring框架中的一个核心组件,主要用于简化Java应用程序对数据库的操作。它提供了一种声明式的编程方式,降低了与数据库交互的复杂性,使得开发者能够更专注于业务逻辑,而不是底层的SQL语句和连接...

    29、jdbcTemplate 教学1

    在这个实现类中,我们可以看到`getAppseriono()`方法使用`jdbcTemplate.queryForObject()`执行SQL查询并返回单个结果。这个方法接收SQL语句和结果类型的Class对象作为参数,然后返回查询结果。其他方法如`getBatchNo...

    springmvc整合JdbcTemplate框架

    在Java Web开发中,Spring MVC和JdbcTemplate是两个非常重要的组件。Spring MVC作为一个强大的MVC框架,负责处理HTTP请求、视图渲染以及业务逻辑的组织。而JdbcTemplate则是Spring提供的一个简单易用的数据库访问...

    Spring-JdbcTemplate

    return jdbcTemplate.queryForObject(sql, new Object[]{username}, new UserRowMapper()); } ``` ### 5. JdbcTemplate 与 MyBatis 比较 - **灵活性**:MyBatis 提供了更灵活的 SQL 编写方式,支持 XML 或注解...

    Spring JDBCTemplate

    Spring JDBCTemplate是Spring框架中的一个核心组件,主要用于简化数据库操作,提供了一种模板化的JDBC访问方式,避免了繁琐的SQL语句和结果集处理。它通过封装了JDBC的基本步骤,如打开和关闭连接、处理结果集等,...

    使用Spring JDBCTemplate进行增删改查curd操作

    在Spring框架中,JdbcTemplate是用于简化数据库...无论是在简单的CRUD操作还是复杂的事务处理中,它都是Spring开发中不可或缺的工具。通过熟练掌握JdbcTemplate的使用,开发者可以更高效地构建与数据库交互的Java应用。

    spring的jdbcTemplate小案例

    在本文中,我们将深入探讨Spring框架中的一个核心组件——JdbcTemplate。JdbcTemplate是Spring提供的一种数据库操作工具,它简化了数据库访问,使开发者...在实际项目中,JdbcTemplate是Spring开发中不可或缺的一部分。

Global site tag (gtag.js) - Google Analytics