首页 > 解决方案 > 简单的 jdbcTemplate.query() 应该返回一个列表,但不是

问题描述

我正在使用 spring 4.0(启动),这是代码:

        String sql = "SELECT emp_id,name,role FROM employees";
        List<Employee> employees = jdbcTemplate.query(sql,(rs, rowNum)-> 
        new Employee(rs.getInt("emp_id"), rs.getString("name"),
                rs.getString("role")));         
        employees.forEach(employee -> {log.info(employee.toString());
            log.info("part a");});

代码看起来如此简单明了,但问题是员工在日志中根本没有返回任何内容。这不意味着员工中的一切都是空的吗?

Logger 本身应该没有问题,因为此代码之前的日志记录有效。

数据库被正确输入。当我通过 mysql 客户端查询时,我可以在那里看到它们。

我犯了什么样的Java错误(如果是一个)?

编辑:这是我执行简单数据库查询的完整功能,上面的代码来自:

    @Override
    public void run(String... args) throws Exception {
        log.info("Creating tables");

        jdbcTemplate.execute("DROP TABLE IF EXISTS employee");
        jdbcTemplate.execute("CREATE TABLE employee (emp_id int, name varchar(100), role varchar(100))");

        log.info("Inserting Baggins Hopkins");
        int rowsAffected = jdbcTemplate.update("INSERT INTO EMPLOYEE(EMP_ID, NAME, ROLE)"
                + " VALUES(1,'Baggins Hopkins','thief')");
        log.info("rows affected: "+ Integer.toString(rowsAffected));
        int rowsAffected1 = jdbcTemplate.update("INSERT INTO EMPLOYEE(EMP_ID, NAME, ROLE)"
                + " VALUES(2,'Doolous Hopkins','robber')");
        log.info("rows affected: "+ Integer.toString(rowsAffected1));
        log.info("Querying for employee");
        String sql = "SELECT emp_id,name,role FROM employee";
        List<Employee> employees = jdbcTemplate.query(sql,(rs, rowNum)-> 
        new Employee(rs.getInt("emp_id"), rs.getString("name"),
                rs.getString("role")));
        log.info("Part A:");
        log.info(String.valueOf(employees.isEmpty()));
//      List<Employee> employees = new ArrayList<Employee>();
//      final List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
//      for(final Map row : rows) {
//          Employee employee = new Employee();
//          employee.setId((int)row.get("emp_id"));
//          employee.setName((String)row.get("name"));
//          employee.setRole((String)row.get("role"));
//      };

        employees.forEach(employee -> {log.info(employee.toString());
            log.info("part a");});

    }

这是出现错误时的日志:

 :: Spring Boot ::        (v2.1.0.RELEASE)

2018-11-07 22:08:36.599  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : Starting JdbcTest1Application on KitKat with PID 5476 (C:\Users\Nano\Downloads\jdbc-test1\jdbc-test1\target\classes started by Nano in C:\Users\Nano\Downloads\jdbc-test1\jdbc-test1)
2018-11-07 22:08:36.599  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : No active profile set, falling back to default profiles: default
2018-11-07 22:08:37.458  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : Started JdbcTest1Application in 1.156 seconds (JVM running for 2.08)
2018-11-07 22:08:37.474  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : Creating tables
2018-11-07 22:08:37.474  INFO 5476 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2018-11-07 22:08:37.614  INFO 5476 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2018-11-07 22:08:38.873  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : Inserting Baggins Hopkins
2018-11-07 22:08:39.042  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : rows affected: 1
2018-11-07 22:08:39.183  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : rows affected: 1
2018-11-07 22:08:39.183  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : Querying for employee
2018-11-07 22:08:39.214  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : Part A:
2018-11-07 22:08:39.214  INFO 5476 --- [           main] c.j.jdbctest1.JdbcTest1Application       : true
2018-11-07 22:08:39.230  INFO 5476 --- [       Thread-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2018-11-07 22:08:39.230  INFO 5476 --- [       Thread-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

标签: javamysqlarraysspring-bootjdbctemplate

解决方案


您可以使用另一种方式获取员工列表:

private static final RowMapper<Employee> ROW_MAPPER = BeanPropertyRowMapper.newInstance(Employee.class);

String sql = "SELECT emp_id,name,role FROM employees";
List<Employee> employees = jdbcTemplate.query(sql, ROW_MAPPER);

或者

List<Employee> employees = jdbcTemplate.queryForList(sql, Employee.class);

推荐阅读