JdbcTemplate查询结果为map时如何处理

探讨了使用JdbcTemplate查询数据库返回Map时的异常处理策略,包括EmptyResultDataAccessException和IncorrectResultSizeDataAccessException的捕获与抛出,以及在DAO层的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JdbcTemplate做为一种常用的和数据库交互的方式,用起来很方便。但是当查询结果为map时要求查询的结果有且仅有一条数据。接下来我们看看源码到底是如何处理的。
queryForMapqueryForObjectrequiredSingleResult
重点看第三个截图,如何处理查询结果的,如果查询结果为空,则throw new EmptyResultDataAccessException(1);,如果结果大于1条,则throw new IncorrectResultSizeDataAccessException(1, results.size());
我们看一下这两个异常,发现EmptyResultDataAccessExceptionIncorrectResultSizeDataAccessException的一个子类。
queryForMap异常
当抛出这个异常后,我们在控制台上看到的就是下面这个方法打印的语句。
"Incorrect result size: expected " + expectedSize + ", actual " + actualSize
那么,如何在Dao层该如何处理呢,因为我们会在service中处理事务,所有会将dao层的异常抛到service,但是查询map为空时是合理的,所以我们一般会捕获EmptyResultDataAccessException,map为多条数据时我们认为不合理,一般会抛出去 ,接下来我们看看写的代码,一般情况下我们只捕获EmptyResultDataAccessException ,返回null。IncorrectResultSizeDataAccessException 异常我们不进行捕获,会直接抛出处理后返回给前端页面。

    public Map<String,Object> queryDetail(String id) throws Exception {

        String sql="select * from `v_device_user` where status=1 and data_id = ?";
        try {
            return jdbcTemplate.queryForMap(sql, new Object[]{id});
        }catch (EmptyResultDataAccessException e){
        // 查询不到数据的时候
         	e.printStackTrace()
            return null;
        }catch (IncorrectResultSizeDataAccessException e){
        // 查询到不止一条数据的时候
         	e.printStackTrace()
            return null;
        }
    }

一般我们这样写即可处理业务需求,在实际开发中应根据具体业务进行处理。

public Map<String,Object> queryDetail(String id) throws Exception {

        String sql="select * from `test` where status=1 and data_id = ?";
        try {
            return jdbcTemplate.queryForMap(sql, new Object[]{id});
        }catch (EmptyResultDataAccessException e){
        // 查询不到数据的时候
        	e.printStackTrace()
            return null;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值