在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
没有这个员工