티스토리 뷰

Spring JDBC 6-3 JdbcTemplate API 사용

queryForInt() 메서드

Select 문을 실행하여 하나의 정수값을 받아내기 위해 사용

int count = getJdbcTemplate().queryForInt("select count(*) from users");

int boardCount = getJdbcTemplate().queryForInt(

"select count(*) from board where category_no = ?", "CATEGORY-00001");

queryForObject() 메서드

SQL 문 수행결과가 하나의 Object로 리턴되는 경우 이용

전달하는 파라미터는 Object의 배열형 -> 순서대로 ?에 삽입됨

리턴받고자하는 타입명을 명시해야 함.

String name = getJdbcTemplate().queryForObject(

"select name from users where id = ?", new Object[]{"test"}, String.class);

query() 메서드

select의 실행 결과가 여려목록으로 리턴되는 경우 사용

sql 문 수행 결과는 Collection 으로 리턴

3개의 매개변수

sql(String), 필요 파라미터(Object 배열), 실행 결과를 매핑할 RowMapper

Object[] args = {"%"+searchKeyword+"%"};

ArrayList list = getJdbcTemplate().query("select * from users where user_name like ?",

args, new UserRowMapper());

RowMapper

select 수행 결과를 단순한 정수나 문자열로 담지 않고 VO(Value Object)에 담고자 하는 경우, select한 결과와 VO객체의 속성을 매핑함.

RowMapper 인터페이스를 구현한 클래스를 작성한 후 매핑정보를 담고, 그것을 JdbcTemplate 메서드의 인자로 전달함.

Anonymous Inner Class 형태

private final String USER_GET = "select * from users where id=?";

public UserVO getUser(UserVO vo) {

Object[] args = {vo.getId()};

return (UserVO)getJdbcTemplate().queryForObject(USER_GET, args,

new RowMapper<UserVO>(){

public UserVO mapRow(ResultSet rs, int rowNum) throws SQLException {

UserVO user = new UserVO();

user.setId(rs.getString("USER_ID"));

user.setPassword(rs.getString("PASSWORD"));

user.setName(rs.getString("NAME"));

user.setRole(rs.getString("ROLE"));

return user;

}

}

);

}

RowMapper - 이어서

query() 메서드에서도 RowMapper사용

private final String USER_LIST = "select * from users order by name desc";

public ArrayList<UserVO> getUserList(UserVO vo) {

Object[] args = new Object[0];

return (ArrayList<UserVO>)getJdbcTemplate().query(USER_LIST, args,

new RowMapper<UserVO>(){

public UserVO mapRow(ResultSet rs, int rowNum) throws SQLException {

UserVO user = new UserVO();

user.setId(rs.getString("USER_ID"));

user.setPassword(rs.getString("PASSWORD"));

user.setName(rs.getString("NAME"));

user.setRole(rs.getString("ROLE"));

return user;

}

}

);

}

RowMapper 클래스 구현

재사용성을 위해 별도의 외부 클래스를 정의하여 사용

private final String USER_GET = "select * from users where id=?";

private final String USER_LIST = "select * from users order by name desc";

public UserVO getUser(UserVO vo) {

Object[] args = {vo.getId()};

return (UserVO)getJdbcTemplate().queryForObject(

USER_GET, args, new UserRowMapper());

}

public ArrayList<UserVO> getUserList(UserVO vo) {

Object[] args = new Object[0];

return (ArrayList<UserVO>)getJdbcTemplate().query(

USER_LIST, args, new UserRowMapper());

}

class UserRowMapper implements RowMapper<UserVO> {

public UserVO mapRow(ResultSet rs, int rowNum) throws SQLException {

UserVO user = new UserVO();

user.setId(rs.getString("USER_ID"));

user.setPassword(rs.getString("PASSWORD"));

user.setName(rs.getString("NAME"));

user.setRole(rs.getString("ROLE"));

return user;

}

}

update 메서드

insert, update, delete 수행을 위해 사용

private final String USER_ADD = "insert into users(id, pass, name) values(?,?,?)";

public void addUser(UserVO vo) {

getJdbcTemplate().update(USER_ADD, vo.getId(), vo.getPass(), vo.getName());

}

매개변수값과 타입을 배열 형태로 전달 가능

private final String USER_UPDATE = "update users set name=?, role=? where id=?";

public void updateUser(UserVO vo) {

Object[] params = {vo.getName(), vo.getRole(), vo.getId()};

int[] types = {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR};

getJdbcTemplate().update(USER_UPDATE, params, types);

}

PreparedStatementSetter 이용

파라미터 값을 순서대로가 아닌 프로그램에서 직접 지정하는 방법 제공

private final String USER_ADD = "insert into users(id, pass, name) values(?,?,?)";

public void addUser(final UserVO vo) {

getJdbcTemplate().update(USER_ADD, new PreparedStatementSetter () {

public void setValues(PreparedStatement stmt) throws SQLException {

stmt.setString(1, vo.getId());

stmt.setString(2, vo.getPass());

stmt.setString(3, vo.getName());

}

});

}

댓글