시소당
Spring JDBC에서는 JDBC에서 지원하던 기능들을 [표4-6]의 API를 이용하고 지원하고 있다. 데이터베이스와의 Connection을 관리하기 위하여 DataSource만을 이용하고 있으며, 쿼리를 실행하는 방법으로는 JdbcTemplate과 SQLObject 두 가지 방식을 지원하고 있다. 이 두 가지 방법으로 쿼리를 실행하는 쿼리를 실행하는 과정을 살펴보면서 각각의 장단점에 대해서 살펴보도록 하겠다. 또한 JDBC에서 ResultSet과 RowSet으로 반환되던 쿼리 결과는 POJO List 또는 Map으로 변환할 수 있다.
* JdbcTemplate 기반 하에서 구현
JdbcTemplate을 이용하는 방법은 모든 클래스를 JdbcTemplate클래스가 가지고 있는 메소드를 이용하여 실행하는 것이다.
[예제4-6] SpringJDBCWithTemplateBoardDAO.java
public class SpringJDBCWithTemplateBoardDAO extends MyJdbcDaoSupport implements
BoardDAO {
... 중간 생략 ...
public Board insert(Board board) throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage("board.sql.insert");
int boardNo = getIncrementer().nextIntValue();
board.setBoardNo(boardNo);
Object[] values = { new Integer(boardNo), board.getTitle(),
board.getName(), board.getEmail(), board.getPassword(),
board.getCreateDate(), board.getContent() };
getJdbcTemplate().update(sql, values);
return board;
}
public Board update(Board board) throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage("board.sql.update");
Object[] values = { board.getTitle(), board.getName(),
board.getEmail(), board.getContent(),
new Integer(board.getBoardNo()) };
getJdbcTemplate().update(sql, values);
return board;
}
... 중간 생략 ...
public Board findBoard(int boardNo) throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage(
"board.sql.select.byboardno");
RowMapper rowMapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rownum) throws SQLException {
Board board = new Board();
board.setTitle(rs.getString("title"));
board.setName(rs.getString("name"));
board.setEmail(rs.getString("email"));
board.setPassword(rs.getString("password"));
board.setCreateDate(rs.getString("createdate"));
board.setContent(rs.getString("content"));
board.setHitCount(rs.getInt("hitCount"));
return board;
}
};
Board board = (Board) getJdbcTemplate().queryForObject(sql,
new Object[] { new Integer(boardNo) }, rowMapper);
board.setBoardNo(boardNo);
return board;
}
public List findBoardList(int currentPage, int countPerPage)
throws DataAccessException {
int start = (currentPage - 1) * countPerPage;
String sql = getMessageSourceAccessor().getMessage(
"board.sql.select.list");
RowMapper rowMapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rownum) throws SQLException {
Board board = new Board();
board.setBoardNo(rs.getInt("boardNo"));
board.setTitle(rs.getString("title"));
board.setName(rs.getString("name"));
board.setEmail(rs.getString("email"));
board.setCreateDate(rs.getString("createdate"));
board.setHitCount(rs.getInt("hitCount"));
return board;
}
};
List list = getJdbcTemplate().query(sql,
new Object[] { new Integer(start), new Integer(countPerPage) },
rowMapper);
return list;
}
public int getTotalNo() throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage(
"board.sql.totalcount");
return getJdbcTemplate().queryForInt(sql);
}
}
[예제4-7]SpringJDBCWithTemplateBoardFileDAO.java
public class SpringJDBCWithTemplateBoardFileDAO extends MyJdbcDaoSupport
implements BoardFileDAO {
... 중간 생략 ...
public int insert(final int boardNo, final List boardFileList)
throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage(
"boardfile.sql.insert");
BatchPreparedStatementSetter bpsSetter = new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i)
throws SQLException {
BoardFile boardFile = (BoardFile) boardFileList.get(i);
int boardFileNo = getIncrementer().nextIntValue();
ps.setInt(1, boardFileNo);
ps.setInt(2, boardNo);
ps.setInt(3, boardFile.getFileSize());
ps.setString(4, boardFile.getFileName());
ps.setString(5, boardFile.getContentType());
ps.setString(6, boardFile.getTempFileName());
}
public int getBatchSize() {
return boardFileList.size();
}
};
int result[] = getJdbcTemplate().batchUpdate(sql, bpsSetter);
int insertResult = 0;
for (int i = 0; i < result.length; i++) {
insertResult += result[i];
}
return insertResult;
}
public int deleteByBoardFileNo(int boardFileNo) throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage(
"boardfile.sql.delete.byboardfileno");
return getJdbcTemplate().update(sql,
new Object[] { new Integer(boardFileNo) });
}
public List findBoardFileList(int boardNo) throws DataAccessException {
String sql = getMessageSourceAccessor().getMessage(
"boardfile.sql.select.byboardno");
RowMapper rowMapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rownum) throws SQLException {
BoardFile boardFile = new BoardFile();
boardFile.setFileNo(rs.getInt("fileNo"));
boardFile.setFileSize(rs.getInt("fileSize"));
boardFile.setFileName(rs.getString("fileName"));
return boardFile;
}
};
List boardFileList = getJdbcTemplate().query(sql,
new Object[] { new Integer(boardNo) }, rowMapper);
return boardFileList;
}
}
JdbcTemplate 클래스는 SQL쿼리의 CRUD를 지원하기 위하여 다양한 메소드를 지원하고 있다.
Insert, Update, Delete
JdbcTemplate 클래스는 insert, update, delete쿼리를 지원하기 위하여 update 메소드를 다음과 같이 지원하고 있다.
int update(String sql)
int update(String sql, Object[] args)
int update(String sql, Object[] args, int[] argtypes)
Select
JdbcTemplate 클래스는 select 쿼리를 지원하기 위하여 다음과 같이 지원하고 있다.
int queryFoInt(String sql)
int queryForInt(String sql, Object[] args)
long queryForLong(String sql)
long queryForLong(String sql, object[] args)
Object queryForObject(String sql, Class requiredType)
Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
List queryForList(String sql)
List queryForList(String sql, Object[] args)
JdbcTemplate 클래스는 select쿼리를 실행가히 위하여 지원하고 있는 queryXXX()메소드 외에도 많은 API를 지원하고 있다. 이 책에서 다루지 못한 queryXXX()메소드는 API 문서를 참고하기 바란다.
[예제4-6]과[예제4-7]을 보면 Resultset으로 반환되는 데이터를 POJO 또는 POJO 또는 POJO List로 변환하는 작업을 RowMapper클래스의 mapRow()메소드에서 구현하고 있다. RowMapper 클래스의 mapRow() 메소드는 JdbcTemplate에서 ResultSet데이터를 POJO로 변환할 때 호출되는 콜백(Callback)메소드이다. 만약 데이터베이스 컬럼의 이름과 도메인 모델 속성의 이름이 같다면 RowMapper클래스를 사용할 필요 없이 queryForObject(String sql, Class requiredType)메소드를 이용하여 자동적으로 데이터 바인딩을 할 수 있다. 데이터베이스 컬럼의 이름과 도메인 모델 속성의 이름이 같지 않을 경우에는 [예제4-6]과 [예제4-7]에서 보는 바와 같이 RowMapper클래스의 mapRow()메소드를 이용하여 수종적으로 데이터 바인딩을 해야 한다.
[출처] Spring JDBC - 2.구현방법 |작성자 타이거