JDBC Template
- JDBC의 반복적인 코드제거와 DB 연동 로직을 JDBC Template 클래스에서 제공하여주는 장점이 있다.
- 개발자는 SQL문에 집중
- root-context.xml에 저장된 것을 사용
DBCP : 자바 웹 애플리케이션 DB 접속과 관련된 라이브러리
JDBC : Java DataBase Connectivity DB연결 인터페이스, 각 DB Driver를 통해 접속
- DB 접속을 위해 JDBC Driver Load
- getConnection Method로 DB Connection 객체 가져옴
- PreparedStatement 객체 생성
- excuteQeury를 실행하여 결과를 가져옴
- close
DBCP : DataBase Connection Pool DB와 Connection하고 있는 객체를 관리
- WAS(Web Application Server) 실행 시 일정량 DB Connection 객체 생성 후 Pool에 저장
- DB Connection 요청 후 Pool에서 가져다 사용 후 반환
- DBCP 옵션
- maxActive :동시 최대 Connection할 수 있는 수
- maxIdle : Connection Pool에 반납할 때 최대 유지 Connection 수
- minIdle : 최소 유지할 Conenction 수
- initialSize : gertConnection() 메소드를 통해 Connection Pool에 채워 넣을 최소 Connection 수
라이브러리 추가
DBCP 라이브러리 추가
sonatype에 접속하여 commons-dbcp 검색
버전 1.4 선택 후 오른쪽 Apache Maven 복사
pom.xml 에 <dependencies> 아래 붙여넣기
<!-- DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
pom.xml에 spring-orm, spring-jdbc 라이브러리 추가
<!-- spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
DB Server와 관련된 정보를 따로 만들어 관리한다
/resource/config/database.properties 파일 생성 후 다음 코드 추가
jdbc.driver=org.sqlite.JDBC
jdbc.url=jdbc:sqlite:DB명
jdbc.username=
jdbc.password=
/webapp/WEB-INF/spring/root-context.xm,l에 다음 코드 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- Sqlite -->
<context:property-placeholder location="classpath:config/database.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
properties파일을 place holder를 통해 DataSource의 속성 설정을 BasicDataSource(DataSource Interface 중 하나)를 통해 bean으로 등록한다
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- Sqlite -->
<context:property-placeholder location="classpath:config/database.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- Spring JDBC 설정 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
JdbcTemplate Class 생성
@Repository
public class BoardDAOTemplate implements BoardDAO{
@Autowired
private JdbcTemplate jdbcTemplate;
private final static String BOARD_INSERT = "INSERT INTO board(subject,content,writer) VALUES(?,?,?);";
private final static String BOARD_DELETE = "DELETE FROM board WHERE _id = ?;";
private final static String BOARD_UPDATE = "UPDATE board SET subject=?, content = ?,writer =? WHERE _id = ?;";
private final static String BOARD_SELECTE_ONE = "SELECT * FROM board WHERE _id = ?;";
private final static String BOARD_SELECTE_ALL = "SELECT * FROM board ORDER BY _id DESC;";
@Override
public int insert(Board vo) {
System.out.println("===> Jdbc Template Insert ");
return jdbcTemplate.update(BOARD_INSERT,vo.getSubject(),vo.getContent(),vo.getWriter());
}
@Override
public int delete(Board vo) {
System.out.println("===> Jdbc Template ");
return jdbcTemplate.update(BOARD_DELETE,vo.get_id());
}
@Override
public int update(Board vo) {
System.out.println("===> Jdbc Template ");
return jdbcTemplate.update(BOARD_UPDATE,vo.getSubject(),vo.getContent(),vo.getWriter(),vo.get_id());
}
@Override
public Board getOne(Board vo) {
System.out.println("===> Jdbc Template ");
Object[]args = {vo.get_id()};
return jdbcTemplate.queryForObject(BOARD_SELECTE_ONE, args,new BoardRowMapper());
}
@Override
public List<Board> getAll() {
System.out.println("===> Jdbc Template getAll");
return jdbcTemplate.query(BOARD_SELECTE_ALL, new BoardRowMapper());
}
class BoardRowMapper implements RowMapper<Board>{
public Board mapRow(ResultSet rs, int rowNum) throws SQLException {
Board board = new Board();
board.set_id(rs.getInt("_id"));
board.setSubject(rs.getString("subject"));
board.setContent(rs.getString("content"));
board.setWriter(rs.getString("writer"));
board.setWdate(rs.getString("wdate"));
return board;
}
}
}