解决Incorrect result size: expected 1, actual 0异常

在Spring中使用jdbcTemplate.queryForObject做数据库查询时出现以下异常

信息: Loaded JDBC driver: oracle.jdbc.OracleDriver
Exception in thread "main" org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
	at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71)
	at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:801)
	at com.cgl.dao.impl.EmpDaoImpl.queryEmpByEmpno(EmpDaoImpl.java:38)
	at com.cgl.test.Test.queryEmpByEmpno(Test.java:15)
	at com.cgl.test.Test.main(Test.java:58)

错误原因
   jdbcTemplate.queryForObject有且只能查询一条数据,如果数据库中没有这条数据或者数据库中这条数据有相同的那么会抛出此异常。
解决办法
  可以使用Spring中的query方法,或者使用try-catch捕获异常

@Override
	public Emp queryEmpByEmpno(int empno) {
		Emp emp;
		try {
			String sql="select * from emp where empno = ?";
			RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<Emp>(Emp.class);
			emp = jdbcTemplate.queryForObject(sql,rowMapper,empno);
		} catch (DataAccessException e) {
			return null;
		}
		return emp;
	}

测试类 测试emp表中存在的员工

public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		EmpDao empDao = context.getBean(EmpDao.class);
		Emp emp = empDao.queryEmpByEmpno(7788);
		if (emp == null) {
			System.out.println("没有这个员工");
		}else {
			System.out.println(emp);
		}
	}

运行结果

信息: Loaded JDBC driver: oracle.jdbc.OracleDriver
Emp [empno=7788, ename=SCOTT, job=ANALYST, mgr=7566, hiredate=1987-04-19 00:00:00.0, sal=3000.0, comm=null, deptno=20]

测试类 测试emp表中不存在的员工

public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		EmpDao empDao = context.getBean(EmpDao.class);
		Emp emp = empDao.queryEmpByEmpno(9999);
		if (emp == null) {
			System.out.println("没有这个员工");
		}else {
			System.out.println(emp);
		}
	}

运行结果

信息: Loaded JDBC driver: oracle.jdbc.OracleDriver
没有这个员工
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值