Рубрики
Без рубрики

Весенний JDBC

С традиционным JDBC мы получили избыточный (шаблонный) и подверженный ошибкам код: публичная учетная запись findByNu… Помеченный spring, jdbc, jdbctemplate, java.

С традиционным 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 Map getUser(int id) {
        String sql = "select * from users where id = ?";
        return jdbcTemplate.queryForMap(sql, id);
    }

    public List> getUsers() {
        String sql = "select * from users";
        return jdbcTemplate.queryForList(sql);
    }

    public int insertUpdateOrDeleteUser(String sql) {
        return jdbcTemplate.update(sql);
    }

См. Документацию Spring Framework – Доступ к данным с помощью JDBC

Оригинал: “https://dev.to/eidher/spring-jdbc-4d3i”