스프링 JDBC 프로그래밍 - JdbcTemplate

2021. 4. 22. 03:44 JAVA/DBCP,JNDI,JDBC

스프링 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();
}

 

관련 글

스프링 JDBC 프로그래밍 - MyBatis 연동

 

출처 : atoz-develop.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-JDBC-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-JdbcTemplate?category=869245