You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
});

注意事项

  1. 确保Employee类已正确定义,包含EmpID、EmpName、EmpAge、EmpDept属性及对应的getter/setter方法。
  2. 导入必要的包:比如java.sql.SQLException、org.springframework.dao.DataAccessException(方案1需要)。

内容的提问来源于stack exchange,提问作者sushil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:41:31