스프링 JDBC 프로그래밍 - JdbcTemplate
스프링 JDBC 프로그래밍 - JdbcTemplate
Spring Framework는 JDBC 프로그래밍을 위해 JdbcTemplate 클래스를 제공하며 JdbcTemplate 클래스는 손쉽게 DB와 연동할 수 있도록 구현되어 있다.
이 글에서는 Oracle DB 11g를 사용한다고 가정한다.
다른 DB를 사용해도 무방하다.
의존성 추가
Spring JDBC, Oracle JDBC 드라이버, Apache Commons DBCP 라이브러리 의존성을 추가한다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
Oracle JDBC 드라이버를 관리하는 레파지토리를 추가한다.
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://code.lds.org/nexus/content/groups/main-repo</url>
</repository>
테이블 구조
대상 테이블은 다음과 같다.
create table jdbc_table(
int_data number not null,
str_data varchar2(500) not null
);
DataSource, JdbcTemplate 빈 정의
스프링 빈 설정 클래스에서 DataSource, JdbcTemplate 빈을 정의한다.
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
@ComponentScan
public class BeanConfigClass {
// DataSource
@Bean
public BasicDataSource source() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("oracle.jdbc.OracleDriver");
source.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
source.setUsername("scott");
source.setPassword("1234");
return source;
}
// JdbcTemplate
@Bean
public JdbcTemplate db(BasicDataSource source) {
JdbcTemplate db = new JdbcTemplate(source);
return db;
}
}
JdbcTemplate 빈을 정의하는 메소드에서는 파라미터로 BasicDataSource를 받아 JdbcTemplate 객체를 생성할때 사용한다.
VO 클래스
@Component
@Scope("prototype")
public class JdbcBean {
private int int_data;
private String str_data;
public int getInt_data() {
return int_data;
}
public void setInt_data(int int_data) {
this.int_data = int_data;
}
public String getStr_data() {
return str_data;
}
public void setStr_data(String str_data) {
this.str_data = str_data;
}
}
테이블 구조와 동일한 VO 클래스를 생성한다.
Component를 붙여 VO클래스를 빈으로 등록하고 scope는 prototype으로 한다.
컬럼과 매핑되는 필드를 선언하는데, 컬럼명과 달라도 무관하다.
DAO 클래스
import org.springframework.jdbc.core.JdbcTemplate;
@Component
public class JdbcDAO {
@Autowired
private JdbcTemplate db;
}
DAO 클래스를 생성하고 JdbcTemplate 빈을 주입받는다.
JdbcTemplate의 메소드를 사용해서 insert, select, update, delete를 구현할 수 있다.
Insert, Select, Update, Delete 구현
1) Insert
insert는 update()를 사용해서 구현한다.
import org.springframework.jdbc.core.JdbcTemplate;
@Component
public class JdbcDAO {
@Autowired
private JdbcTemplate db;
// insert
public void insert_data(JdbcBean bean) {
String sql = "insert into jdbc_table (int_data, str_data) values (?, ?)";
db.update(sql, bean.getInt_data(), bean.getStr_data());
}
}
update() 호출 시 SQL과 '?'에 바인딩될 값을 순서대로 넘겨준다.
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfigClass.class);
// dao를 가져온다.
JdbcDAO dao = ctx.getBean(JdbcDAO.class);
// insert
JdbcBean bean1 = ctx.getBean(JdbcBean.class);
bean1.setInt_data(1);
bean1.setStr_data("문자열1");
dao.insert_data(bean1);
JdbcBean bean2 = ctx.getBean(JdbcBean.class);
bean2.setInt_data(2);
bean2.setStr_data("문자열2");
dao.insert_data(bean2);
ctx.close();
}
위는 구현한 DAO를 사용해서 두 개의 row를 insert하는 코드이다.
2) Select
JdbcTemplate로 select를 구현하려면 먼저 Mapper 클래스를 정의해야한다.
Select문을 사용해 데이터를 가져올 때 DB 테이블의 컬럼과 빈의 프로퍼티를 매핑하는 역할을 한다.
Mapper 클래스
import org.springframework.jdbc.core.RowMapper;
@Component
public class MapperClass implements RowMapper<JdbcBean> {
public JdbcBean mapRow(ResultSet rs, int rowNum) throws SQLException {
JdbcBean bean = new JdbcBean();
bean.setInt_data(rs.getInt("int_data"));
bean.setStr_data(rs.getString("str_data"));
return bean;
}
}
스프링에서 제공하는 RowMapper 인터페이스를 구현하여 Mapper 클래스를 정의한다.
RowMapper의 제네릭 타입으로 위에서 만든 VO 클래스를 지정한다.
mapRow에서 받는 ResultSet 객체를 사용해 빈의 프로퍼티와 컬럼을 어떻게 매핑할 것인지 정의한다.
DAO 클래스
DAO 클래스에서 위에서 만든 Mapper 클래스를 주입받는다.
import org.springframework.jdbc.core.JdbcTemplate;
@Component
public class JdbcDAO {
@Autowired
private JdbcTemplate db;
@Autowired
private MapperClass mapper;
// insert
public void insert_data(JdbcBean bean) {
String sql = "insert into jdbc_table (int_data, str_data) values (?, ?)";
db.update(sql, bean.getInt_data(), bean.getStr_data());
}
// select
public List<JdbcBean> select_data(){
String sql = "select int_data, str_data from jdbc_table";
List<JdbcBean> list = db.query(sql, mapper);
return list;
}
}
JdbcTemplate의 query()를 사용해서 select를 구현한다.
query() 호출 시 SQL과 Mapper 클래스의 객체를 전달한다.
Select 결과는 List 타입으로 받을 수 있다.
Main 메소드
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfigClass.class);
// dao를 가져온다.
JdbcDAO dao = ctx.getBean(JdbcDAO.class);
// insert
JdbcBean bean1 = ctx.getBean(JdbcBean.class);
bean1.setInt_data(1);
bean1.setStr_data("문자열1");
dao.insert_data(bean1);
JdbcBean bean2 = ctx.getBean(JdbcBean.class);
bean2.setInt_data(2);
bean2.setStr_data("문자열2");
dao.insert_data(bean2);
// select
List<JdbcBean> list = dao.select_data();
for(JdbcBean bean3 : list) {
System.out.printf("int_data : %d\n", bean3.getInt_data());
System.out.printf("str_data : %s\n", bean3.getStr_data());
System.out.println("----------------------------------------");
}
ctx.close();
}
3) Update
update도 insert와 마찬가지로 JdbcTemplate의 update()를 사용해서 구현한다.
import org.springframework.jdbc.core.JdbcTemplate;
@Component
public class JdbcDAO {
@Autowired
private JdbcTemplate db;
@Autowired
private MapperClass mapper;
// insert
public void insert_data(JdbcBean bean) {
String sql = "insert into jdbc_table (int_data, str_data) values (?, ?)";
db.update(sql, bean.getInt_data(), bean.getStr_data());
}
// select
public List<JdbcBean> select_data(){
String sql = "select int_data, str_data from jdbc_table";
List<JdbcBean> list = db.query(sql, mapper);
return list;
}
// update
public void update_data(JdbcBean bean) {
String sql = "update jdbc_table set str_data = ? where int_data = ?";
db.update(sql, bean.getStr_data(), bean.getInt_data());
}
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfigClass.class);
// dao를 가져온다.
JdbcDAO dao = ctx.getBean(JdbcDAO.class);
// insert
JdbcBean bean1 = ctx.getBean(JdbcBean.class);
bean1.setInt_data(1);
bean1.setStr_data("문자열1");
dao.insert_data(bean1);
JdbcBean bean2 = ctx.getBean(JdbcBean.class);
bean2.setInt_data(2);
bean2.setStr_data("문자열2");
dao.insert_data(bean2);
// select
List<JdbcBean> list = dao.select_data();
for(JdbcBean bean3 : list) {
System.out.printf("int_data : %d\n", bean3.getInt_data());
System.out.printf("str_data : %s\n", bean3.getStr_data());
System.out.println("----------------------------------------");
}
// update
JdbcBean bean4 = ctx.getBean(JdbcBean.class);
bean4.setInt_data(1);
bean4.setStr_data("문자열3");
dao.update_data(bean4);
ctx.close();
}
4) Delete
delete도 insert, update와 마찬가지로 JdbcTemplate의 update()를 사용해서 구현한다.
import org.springframework.jdbc.core.JdbcTemplate;
@Component
public class JdbcDAO {
@Autowired
private JdbcTemplate db;
@Autowired
private MapperClass mapper;
// insert
public void insert_data(JdbcBean bean) {
String sql = "insert into jdbc_table (int_data, str_data) values (?, ?)";
db.update(sql, bean.getInt_data(), bean.getStr_data());
}
// select
public List<JdbcBean> select_data(){
String sql = "select int_data, str_data from jdbc_table";
List<JdbcBean> list = db.query(sql, mapper);
return list;
}
// update
public void update_data(JdbcBean bean) {
String sql = "update jdbc_table set str_data = ? where int_data = ?";
db.update(sql, bean.getStr_data(), bean.getInt_data());
}
// delete
public void delete_data(int int_data) {
String sql = "delete from jdbc_table where int_data = ?";
db.update(sql, int_data);
}
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfigClass.class);
// dao를 가져온다.
JdbcDAO dao = ctx.getBean(JdbcDAO.class);
// insert
JdbcBean bean1 = ctx.getBean(JdbcBean.class);
bean1.setInt_data(1);
bean1.setStr_data("문자열1");
dao.insert_data(bean1);
JdbcBean bean2 = ctx.getBean(JdbcBean.class);
bean2.setInt_data(2);
bean2.setStr_data("문자열2");
dao.insert_data(bean2);
// select
List<JdbcBean> list = dao.select_data();
for(JdbcBean bean3 : list) {
System.out.printf("int_data : %d\n", bean3.getInt_data());
System.out.printf("str_data : %s\n", bean3.getStr_data());
System.out.println("----------------------------------------");
}
// update
JdbcBean bean4 = ctx.getBean(JdbcBean.class);
bean4.setInt_data(1);
bean4.setStr_data("문자열3");
dao.update_data(bean4);
// delete
dao.delete_data(1);
ctx.close();
}
관련 글
'JAVA > DBCP,JNDI,JDBC' 카테고리의 다른 글
JDBC, DBCP, JNDI 에 대한 이해 (0) | 2021.11.22 |
---|---|
JDBC (ODBC와 차이, 아키텍처, JdbcTemplate) (0) | 2021.03.21 |
DBCP validationQuery 설정 (0) | 2018.07.11 |
dbcp pooling설정에 validationQuery적용 (0) | 2018.07.11 |
DBCP JDBC Connection Pool의 커넥션 끊어질때 (0) | 2018.07.11 |