Spring Boot使用JdbcTemplate查询员工数据遇编译错误,求解决方案
问题解决:Spring Boot JdbcTemplate编译错误
错误原因
你代码里的ResultSetExtractor<ArrayList<Employee>>()写法存在语法错误——接口不能直接通过()实例化,必须提供具体的实现逻辑(匿名内部类或Lambda表达式)。
修正方案
方案1:使用ResultSetExtractor(正确写法)
补全ResultSetExtractor的extractData方法实现,手动遍历ResultSet封装员工列表:
package demo; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ResultSetExtractor; @SpringBootApplication public class SpringMySqlApplication implements CommandLineRunner{ @Autowired private JdbcTemplate jdbcTemplate; public static void main(String[] args) { SpringApplication.run(SpringMySqlApplication.class, args); } @Override public void run(String... args) throws Exception { String sql = "select EmpID, EmpName, EmpAge, EmpDept FROM employees"; ArrayList<Employee> el = jdbcTemplate.query(sql, new ResultSetExtractor<ArrayList<Employee>>() { @Override public ArrayList<Employee> extractData(ResultSet rs) throws SQLException, DataAccessException { ArrayList<Employee> employees = new ArrayList<>(); while (rs.next()) { Employee emp = new Employee(); emp.setEmpID(rs.getInt("EmpID")); emp.setEmpName(rs.getString("EmpName")); emp.setEmpAge(rs.getInt("EmpAge")); emp.setEmpDept(rs.getString("EmpDept")); employees.add(emp); } return employees; } }); // 打印查询结果 for (Employee emp : el) { System.out.printf("ID: %d, Name: %s, Age: %d, Dept: %s%n", emp.getEmpID(), emp.getEmpName(), emp.getEmpAge(), emp.getEmpDept()); } } }
方案2:使用RowMapper(更简洁推荐)
RowMapper专注于单条记录的对象映射,JdbcTemplate会自动帮你封装成List,代码更简洁:
package demo; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @SpringBootApplication public class SpringMySqlApplication implements CommandLineRunner{ @Autowired private JdbcTemplate jdbcTemplate; public static void main(String[] args) { SpringApplication.run(SpringMySqlApplication.class, args); } @Override public void run(String... args) throws Exception { String sql = "select EmpID, EmpName, EmpAge, EmpDept FROM employees"; List<Employee> el = jdbcTemplate.query(sql, new RowMapper<Employee>() { @Override public Employee mapRow(ResultSet rs, int rowNum) throws SQLException { Employee emp = new Employee(); emp.setEmpID(rs.getInt("EmpID")); emp.setEmpName(rs.getString("EmpName")); emp.setEmpAge(rs.getInt("EmpAge")); emp.setEmpDept(rs.getString("EmpDept")); return emp; } }); // 打印查询结果 el.forEach(emp -> System.out.printf("ID: %d, Name: %s, Age: %d, Dept: %s%n", emp.getEmpID(), emp.getEmpName(), emp.getEmpAge(), emp.getEmpDept())); } }
方案3:Lambda简化(Java 8+)
如果使用Java 8及以上版本,可以用Lambda进一步简化RowMapper的写法:
List<Employee> el = jdbcTemplate.query(sql, (rs, rowNum) -> { Employee emp = new Employee(); emp.setEmpID(rs.getInt("EmpID")); emp.setEmpName(rs.getString("EmpName")); emp.setEmpAge(rs.getInt("EmpAge")); emp.setEmpDept(rs.getString("EmpDept")); return emp; });
注意事项
- 确保
Employee类已正确定义,包含EmpID、EmpName、EmpAge、EmpDept属性及对应的getter/setter方法。 - 导入必要的包:比如
java.sql.SQLException、org.springframework.dao.DataAccessException(方案1需要)。
内容的提问来源于stack exchange,提问作者sushil
相关产品推荐
相关产品推荐

