Java Database Connectivity
Java 어플리케이션에서 DB에 연결, SQL 쿼리를 실행과 결과를 가져오기, 트랙잰션 관리를 하게 해주는 표준 인터페이스(java.sql)
예 ) java.sql.Connection 인터페이스의 - DB연결 메서드 시그니처
public interface Connection {
Statement() throws SQLException;
PreparedStatement preapreStatement (String sql) throws SQLException;
void close() throws SQLException;
void commint() throws SQLException;
void rollback() throws SQLException;
boolean isClosed() throws SQLException;
}
JDBC 인터페이스를 각 SQL vendor에 맞게 구현한 클래스 집합.
전용 프로토콜에 맞게 DB로 쿼리를 전송하고 DB의 응답을 Java 객체로 변환하는 역할을 한다.
템플릿 메서드 패턴을 적용해 복잡하고 반복되는 알고리즘을 캡슐화해서 재사용한다.
반복되는 DB 연동 로직을 제공해 개발자는 DB Driver와 JDBC API 사용법과 상관 없이 달라지는 SQL구문과 설정 값만 신경쓰며 DAO 클래스에서 JdbcTemplate메서드를 호출하여 간단하게 DB 연동 로직을 처리할 수 있다.
DB 연결을 미리 만들어두고 필요할 때 새로 만들지 않고 풀에 보관해 둔 연결을 가져다 쓰도록 하는 도구
최대/최소 연결 수, 유휴연결 관리, 타임아웃 등을 관리한다.
Apache에서 제공하는 DB커넥션 pool java 라이브러리
<!-- DBCP -->
<dpendency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
JdbcTemplate이 사용할 연결 관련 설정 정보를 가지도록 하는 인터페이스
구현체로 Apache의 BasicDataSource를 사용했다.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" vlaue="org.h2.Driver"/>
<property name="url" vlaue="jdbc:h2:tcp://localhost/~/test" />
<property name="username" vlaue=" sa" />
<property name="password" value="" />
</bean>
연결에 필요한 프로퍼티를 Setter 인젝션으로 설정하고 객체가 삭제되기 전 알아서 close() 메서드를 실행한다.
#databas.properties
jdbc.driver=org.h2.Driver
jdbc.url=jdbc:h2:tcp://localhost/~/test
jdbc.username=sa
jdbc.password=
<context:property-placeholder location="classpath:config/database.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" vlaue="${jdbc.driver}"/>
<property name="url" vlaue="${jdbc.url}" />
<property name="username" vlaue="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
INSERT, UPDATE, DLEETE 구문을 처리
String BOARD_UPDATE = "update board set title=?, content=?, where seq=?";
int cnt = jdbcTemplate.update(BOARD_UPDATE, "글 제목", "글 내용입니다.", "");
System.out.println(cnt + "개의 데이터 수정");
String BOARD_UPDATE = "update board set title=?, content=?, where seq=?";
Object[] args = {vo.getTitle(), vo.getContent(), vo.getSeq()};
jdbcTemplate.update(BOARD_UPDATE, args);
NamedParameterJdbcTemplate 사용하면 물음표와 값을 매칭 할 필요 없이 update()메서드가 알아서 vo의 getter 메서드를 사용한다.
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
String BOARD_UPDATE = "update board set title=:title, content=:content where seq=:seq";
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(vo);
namedParameterJdbcTemplate.update(BOARD_UPDATE, paramSource);
SELECT 구문으로 검색된 정숫값을 리턴받는다.
int queryForInt(String args)
int queryForInt(String sql, Object... args)
int queryForInt(String sql, Object[] args)
SELECT 구문의 실행 결과를 특정 자바객체로 매핑하여 리턴받는다.
검색 결과가 없거나 결과가 두 개 이상일 때 IncorrectResultSizeDataAccessException예외을 발생한다.
Objcet qeuryForObject(Stirng sql)
Objcet qeuryForObject(String sql, RowMapper rowMapper)
Objcet qeuryForObject(Stirng sql, Object[] args, RowMapper rowMapper)
import org.springframework.jdbc.core.RowMapper;
public class BoardRowMapper implements RowMapper<BoardVO> {
public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
BoardVO board = new BoardVO();
board.setSeq(rs.getInt("SEQ"));
...
board.setCnt(rs.getInt("CNT"));
return board;
}
}
RowMapper 객체를 queryForObject() 메서드로 넘겨주면, 스프링 컨테이너는 SQL 구문을 수행한 후 자동으로 RowMapper 객체의 mapRow() 메서드를 호출한다.
SELECT 구문의 실행 결과 리스트를 자바객체로 매핑하여 리턴받는다.
List qeury(String sql)
List qeury(String sql, RowMapper rowMapper)
List qeury(Stirng sql, Object args, , RowMapper rowMapper)
여러건의 데이터 ROW 수만큼 RowMapper 객체의 mapRow() 메서드가 실행되어 List<VO> 로 저장되어 리턴된다.
import org.springframework.jdbc.core.support.JdbcDaoSupport;
@Repository
public class BoardDAOSpring extends JdbcDaoSupport {
@Autowired // DataSource 객체 의존성 주입
public void setSuperDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
}
...
getJdbcTemplate().update();
}
<!-- DataSource 설정 -->
...
<!-- Spring JDBC -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- dataSource 의존성 주입 -->
<property name="dataSource" ref="dataSource"/>
</bean>
@Repository
public class BoardDAOSpring {
@Autowired
private JdbcTemplate jdbcTemplate;
...
jdbcTemplate.update();
}