jdbcTemplate.query和queryForObject方法的使用及区别

 更新时间:2025年12月30日 10:49:46   作者:码农辰南  
这篇文章主要分析了Spring框架中JdbcTemplate的query()和queryForObject()方法的区别,并提出了一些建议来避免在查询时出现权限不足的问题

一、问题原因

上周再项目上遇到一个信息集权限不足时,输出word功能中报错,查看代码发现该块查询逻辑直接使用了jdbcTemplate.queryForObject,根本没考虑信息集权限不足的情况,会出现查询不到数据导致报错的问题,下面就针对query() 和 queryForObject()做一下分析。

二、query() 和 queryForObject() 区别

JdbcTemplate 的 query() 和 queryForObject() 是 Spring 中操作数据库最常用的两个查询方法,核心区别在于返回结果形态、空结果处理、适用场景,以下是详细对比:

特性jdbcTemplate.query()jdbcTemplate.queryForObject()
返回值类型List(多条结果,无结果则返回空 List)T(单条结果,必须返回且仅返回 1 条)
空结果处理无匹配数据时返回空 List([]),不抛异常无匹配数据时抛 EmptyResultDataAccessException
多结果处理支持 0 条、1 条、多条结果仅支持恰好 1 条结果,多条则抛 IncorrectResultSizeDataAccessException
核心参数需指定 RowMapper/ResultSetExtractor 映射结果需指定 RowMapper/ 返回类型(如 Integer.class)
适用场景批量查询(列表查询)、允许无结果的单条查询明确仅需 1 条结果的场景(如根据唯一 ID 查单条数据)

三、修改建议

1、使用JdbcTemplate.query()替换 JdbcTemplate.queryForObject()

BeanPropertyRowMapper<Person> rowMapper = new BeanPropertyRowMapper<>(Person.class);
String sql = "select * from person where personId = '12'";
//下面这段代码有问题,当personId中12不存在,则会报异常EmptyResultDataAccessException
//Person person = jdbcTemplate.queryForObject(sql, rowMapper);
//使用query替换queryForObject
List<Person> query = jdbcTemplate.query(sql, rowMapper);
if(query != null){
   Person person = query.get(0);
}

2、使用mybatis替换 JdbcTemplate.queryForObject()

//BeanPropertyRowMapper<Person> rowMapper = new BeanPropertyRowMapper<>(Person.class);
String sql = "select * from person where personId = '12'";
//下面这段代码有问题,当personId中12不存在,则会报异常EmptyResultDataAccessException
//Person person = jdbcTemplate.queryForObject(sql, rowMapper);
//使用mybatis替换queryForObject,mybatis查询不到数据会返回null
Person person = rmbReportMapper.queryPersonBySql(sql);

四、总结

  • query() 是 “通用查询”,灵活处理任意条数结果,无异常风险;
  • queryForObject() 是 “单结果查询”,强约束结果数量,适合明确仅需 1 条的场景;
  • 日常开发中,除非确认数据必存在,否则优先用 query()处理单条查询,避免空结果异常。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • maven版本冲突的原籍及几种解决方法

    maven版本冲突的原籍及几种解决方法

    Maven版本冲突是指在使用Maven构建项目时,由于依赖传递机制导致同一个依赖的不同版本被引入项目中,从而引发的兼容性问题,下面就来介绍几种解决方法,感兴趣的可以了解一下
    2025-12-12
  • Spring Data Jpa 复合主键的实现

    Spring Data Jpa 复合主键的实现

    这篇文章主要介绍了Spring Data Jpa 复合主键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java二叉树的四种遍历(递归和非递归)

    Java二叉树的四种遍历(递归和非递归)

    这篇文章主要介绍了Java二叉树的四种遍历,二叉树的遍历可以分为前序、中序、后序、层次遍历,需要的朋友可以参考下
    2020-12-12
  • 利用Java代码实现区块链技术

    利用Java代码实现区块链技术

    这篇文章主要介绍了利用Java代码实现区块链技术,区块链的应用范围几乎无穷无尽,关于区块链是如何运作的,下文来看看具体的内容介绍吧,需要的朋友可以参考一下
    2022-04-04
  • 一文秒懂通过JavaCSV类库读写CSV文件的技巧

    一文秒懂通过JavaCSV类库读写CSV文件的技巧

    本文给大家推荐第三方工具库 JavaCSV,用来造一些 csv 测试数据文件,使用超级方便,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    这篇文章主要介绍了使用IDEA搭建SSM框架的详细教程 spring + springMVC +MyBatis,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • TreeSet判断重复元素解析及代码示例

    TreeSet判断重复元素解析及代码示例

    这篇文章主要介绍了TreeSet判断重复元素解析及代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java中instanceOf关键字的用法及特性详解

    Java中instanceOf关键字的用法及特性详解

    当我们在进行向下转型时,如果两个对象之间没有直接或间接的继承关系,在转换时有可能会产生强制类型转换异常,我们可以使用java中自带的instanceOf关键字来解决这个问题,所以本篇文章,会带大家学习instanceOf的用法及特性,需要的朋友可以参考下
    2023-05-05
  • Java中的自定义异常实现方式

    Java中的自定义异常实现方式

    这篇文章主要介绍了Java中的自定义异常实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • SpringAop源码及调用过程概述

    SpringAop源码及调用过程概述

    这篇文章主要介绍了SpringAop源码及调用过程概述,Spring AOP(面向切面编程)是Spring框架的一个重要特性,它提供了一种在程序运行期间动态地将额外的行为织入到代码中的方式,需要的朋友可以参考下
    2023-10-10

最新评论