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()处理单条查询,避免空结果异常。

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

相关文章

  • springboot拦截器过滤token,并返回结果及异常处理操作

    springboot拦截器过滤token,并返回结果及异常处理操作

    这篇文章主要介绍了springboot拦截器过滤token,并返回结果及异常处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot实现JWT认证的完整方案

    SpringBoot实现JWT认证的完整方案

    JWT(JSON Web Token)是一种用于在网络应用间安全传递信息的开放标准,特别适合分布式系统的身份验证,下面我将详细介绍如何在SpringBoot项目中实现JWT认证的完整方案,需要的朋友可以参考下
    2025-10-10
  • java中Map、Set、List的简单使用教程(快速入门)

    java中Map、Set、List的简单使用教程(快速入门)

    这篇文章主要给大家介绍了关于java中Map、Set、List简单使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • java.lang.String和java.util.NClob互相转换方式

    java.lang.String和java.util.NClob互相转换方式

    这篇文章主要介绍了java.lang.String和java.util.NClob互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • FF浏览器和IE下载文件乱码问题的解决方法

    FF浏览器和IE下载文件乱码问题的解决方法

    大家可以看到如下截图,下载文件出现了乱码,在其他浏览器(IE,Chrome....)上没有出现这个问题,解决方法很简单,遇到类似问题的朋友可以了解下哦
    2013-08-08
  • Java中的Lock与ReentrantLock深入解析

    Java中的Lock与ReentrantLock深入解析

    这篇文章主要介绍了Java中的Lock与ReentrantLock深入解析,Lock位于java.util.concurrent.locks包下,是一种线程同步机制,就像synchronized块一样,但是,Lock比synchronized块更灵活、更复杂,需要的朋友可以参考下
    2024-01-01
  • logback 自定义Pattern模板教程

    logback 自定义Pattern模板教程

    这篇文章主要介绍了logback 自定义Pattern模板教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java汇编源码如何查看环境搭建

    Java汇编源码如何查看环境搭建

    这篇文章主要介绍了如何在IntelliJ IDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJ IDEA以方便查看Java字节码文件,接着,详细说明了如何下载和配置HSDIS插件,以便在IDEA中查看Java方法的汇编代码
    2025-01-01
  • java链表的常见简单面试算法题详解

    java链表的常见简单面试算法题详解

    文章总结:本文主要介绍了单链表的基本操作,包括头插法、尾插法、链表翻转、链表成环判断、成环位置判断、成环长度判断,以及有序链表的合并,通过实例和代码示例,详细讲解了每种操作的原理和实现方法
    2025-01-01
  • MyBatis流式查询两种实现方式

    MyBatis流式查询两种实现方式

    本文详解MyBatis流式查询,通过ResultHandler和Cursor实现边读边处理,避免内存溢出,ResultHandler逐条回调,Cursor支持迭代,需注意事务控制及游标关闭问题,适合不同场景灵活使用,感兴趣的朋友跟随小编一起看看吧
    2025-08-08

最新评论