С традиционным JDBC мы получили избыточный (шаблонный) и подверженный ошибкам код:
public Account findByNumber(String number ) { String sql = "select * from accounts " + "where number = ?"; Account account = null; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = dataSource.getConnection(); ps = conn.prepareStatement(sql); ps.setString(1, number); rs = ps.executeQuery(); account = mapAccount(rs); } catch (SQLException e) { throw new RuntimeException("SQL exception occurred", e); } finally { if (rs != null) { try { rs.close(); } catch (SQLException ex) { // OMG } } if (ps != null) { try { ps.close(); } catch (SQLException ex) { // OMG } } if (conn != null) { try { conn.close(); } catch (SQLException ex) { // OMG } } } return account; }
Попробовав с ресурсами, мы могли бы сделать это проще, но не слишком сильно. Вместо этого в Spring JdbcTemplate мы используем шаблон метода шаблона, очищаем код, устраняем повторяющийся шаблонный код, избегаем распространенных ошибок и правильно обрабатываем исключения:
public Account findByNumber(String number) { String sql = "select * from accounts where number = ?"; return jdbcTemplate.query(sql, accountExtractor, number); } private class AccountExtractor implements ResultSetExtractor{ public Account extractData(ResultSet rs) throws SQLException, DataAccessException { return mapAccount(rs); } }
Spring получает соединение, выполняет инструкцию, обрабатывает набор результатов, обрабатывает исключения и освобождает соединение. Вы можете запросить одну или несколько строк. JdbcTemplate возвращает каждую строку результирующего набора в виде карты. При ожидании одной строки используйте queryForMap, при ожидании нескольких строк используйте queryForList, при вставке, обновлении или удалении используйте метод обновления:
public MapgetUser(int id) { String sql = "select * from users where id = ?"; return jdbcTemplate.queryForMap(sql, id); } public List
См. Документацию Spring Framework – Доступ к данным с помощью JDBC
Оригинал: “https://dev.to/eidher/spring-jdbc-4d3i”