简单 jdbcTemplate.query() 应该是 return 一个列表,但不是
Simple jdbcTemplate.query() is supposed to return a list, but isn't
我正在使用 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");});
代码看起来简单明了,但问题是员工在日志中根本没有返回任何内容。这是否意味着 employees 中的所有内容都是空的?
记录器本身应该没有问题,因为这段代码之前的记录工作。
数据库输入正确。当我通过 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.
您可以使用其他方式获取员工列表:
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);
发帖人的回答:
这是一个简单的语法错误。
正如评论员指出的那样,我一直在插入错误的 table...
我在 sql 查询中的语法错误。
之前,我插入 'employees,' 但我应该插入 'employee.'
queryForList() returns 一个包含 Map 的 List,但是,仍然 returns null。我在上面的 post 中评论了这一点。我不知道那有什么问题(我之前没有尝试过使用 List> )。不过问题已经解决了。
我正在使用 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");});
代码看起来简单明了,但问题是员工在日志中根本没有返回任何内容。这是否意味着 employees 中的所有内容都是空的?
记录器本身应该没有问题,因为这段代码之前的记录工作。
数据库输入正确。当我通过 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.
您可以使用其他方式获取员工列表:
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);
发帖人的回答:
这是一个简单的语法错误。 正如评论员指出的那样,我一直在插入错误的 table... 我在 sql 查询中的语法错误。
之前,我插入 'employees,' 但我应该插入 'employee.'
queryForList() returns 一个包含 Map 的 List,但是,仍然 returns null。我在上面的 post 中评论了这一点。我不知道那有什么问题(我之前没有尝试过使用 List> )。不过问题已经解决了。