java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > jdbcTemplate.query和queryForObject方法区别

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

作者:码农辰南

这篇文章主要分析了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);

四、总结

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

您可能感兴趣的文章:
阅读全文