본문 바로가기

Spring/Toby의 스프링3 따라하기

토비의스프링3 JdbcTemplate의 queryForObject

728x90

토비의 스프링3를 따라하면서 Spring버젼이 올라가면서 바뀐부분이 있어서 정리해서 올려놓습니다.

 

3장 Template

queryForInt --> queryForObject

토비의스프링3를 따라하다가 JdbcContext를 JdbcTemplate으로 바꿔주는 구간에서 책이 오래 되었기 때문에 스프링을 최신버젼(저는 5버젼)을 쓰면 따라하기 힘든 구간이 나옵니다.

public int getCount() throws SQLException {
        StatementStrategy st = new StatementStrategy() {
            @Override
            public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
                PreparedStatement ps = c.prepareStatement("select count(*) from car_model");
                return ps;
            }
        };
        this.jdbcContext.workWithStatementStrategy(st);
        return 0;
    }

위 구간입니다. 여기에서는 우리가 직접 만든 JdbcContext를 쓰고 있습니다. 하지만 다음 내용은 Spring에서 제공하는 JdbcTemplate을 쓰라는 예제가 나옵니다.

 

여기에서 잘 안되기 때문에 멘붕이 올 수 있습니다. 왜냐하면 queryForInt를 쓰라고 하기 때문입니다.

 

public int getCount() throws SQLException {
    int rr = this.jdbcTemplate.queryForObject("select count(*) from car_model", Integer.class);

    return rr;
}

queryForInt는 아주 오래전에 Depreciated 되었기 때문에 queryForObject를 쓰면 됩니다. 간단하게 쿼리와, 리턴받을 Class를 넘기면 됩니다. count(*)쿼리이기 때문에 Integer.class를 넘기면 되겠습니다.

 

 

get

한가지 더 바뀐게 있습니다. get을 고칠 때는 조금 더 복잡합니다. RowMapping을 넣는 부분에서 new Object[]{id}를 이용해 파라메터를 전달 하는 부분이 있습니다. 이 부분이 불편해서 depreciated되었습니다.

 

기존

public CarModel getDepreciated(int id) {
        String sql = "select * from car_model where id = ?";
        RowMapper<CarModel> rowMapper = new RowMapper<CarModel>() {
            @Override
            public CarModel mapRow(ResultSet rs, int rowNum) throws SQLException {
                CarModel carModel = new CarModel();
                carModel.setId(rs.getInt("id"));
                carModel.setName(rs.getString("name"));
                return carModel;
            }
        };
        return this.jdbcTemplate.queryForObject(sql, new Object[]{id}, rowMapper);
}

 

기존에는 new Object[]{id} 를 써서 id를 넘겨 주었습니다. 하지만 바뀐 부분에서는 new Object[]{}로 감싸주지 않고도 넘길 수 있게 바뀌었습니다.

 

바뀐것

public CarModel get(int id) throws SQLException, ClassNotFoundException {
        String sql = "select * from car_model where id = ?";
        RowMapper<CarModel> rowMapper = new RowMapper<CarModel>() {
            @Override
            public CarModel mapRow(ResultSet rs, int rowNum) throws SQLException {
                CarModel carModel = new CarModel();
                carModel.setId(rs.getInt("id"));
                carModel.setName(rs.getString("name"));
                return carModel;
            }
        };
        return this.jdbcTemplate.queryForObject(sql, rowMapper, id);
}

이렇게해서 return this.jdbcTemplate.queryForObject(sql, rowMapper, id); 에 맨 뒤에 id를 넣어서 파라메터를 전달하게 바뀌었습니다.

 

 

JdbcTemplate --> NamedParameterJdbcTemplate

https://velog.io/@gisung/Spring.-Spring-JDBC-%EC%82%AC%EC%9A%A9%EB%B2%95

 

end.

 

728x90
블로그 주인장입니다. 원하시는 정보는 얻으셨나요? 이 포스트에서 추가로 필요한 정보가 있으시면 여기에 남겨주세요.