[spring] JdbcTemplate을 이용한 쿼리 실행

Ogu·2023년 3월 23일
0

JDBC

목록 보기
3/3

Spring JDBC 사용 과정

Data Access Layer

JdbcTemplate 설정

jdbc 라이브러리 추가

Gradle의 경우 아래와 같이 build.gradle에 라이브러리를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-jdbc'

Datasource 주입

DB와의 연결을 위한 DB Server에 관한 정보(Property)를 설정한다.

  • url
  • driver
  • username
  • password

DataSource는 Bean으로 등록되어 있어야 한다.

private final JdbcTemplate jdbcTemplate;

public JdbcTemplateItemRepository(DataSource dataSource) {
	this.jdbcTemplate = new JdbcTemplate(dataSource);
}

https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

DAO에서의 처리 과정

쿼리 작성 및 실행

queryForObject()

<T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args) throws DataAccessException;
  • sql : 실행할 sql문
  • RowMapper : 조회 대상
  • args : 파라미터

queryForObject()를 이용한 단건 조회는 아래와 같다. 이때 조회 대상이 객체가 아닌 단순 데이터라면 타입을 아래와 같이 지정해줄 수 있다.

int rowCount = jdbcTemplate.queryForObject("select count(*) from t_actor",Integer.class);

preparedStatement ("?")를 이용해 파라미터 바인딩이 가능하다. ? 에 순서대로 파라미터가 들어가게 된다.

int countOfActorsNamedJoe = jdbcTemplate.queryForObject(
"select count(*) from t_actor where first_name = ?", Integer.class, "Joe");

RowMapper

public interface RowMapper<T> {
	T mapRow(ResultSet rs, int rowNum) throws SQLException;
}

RowMapper는 데이터베이스의 반환 결과인 ResultSet을 객체로 변환해주는 클래스이다.
단순 데이터 타입 조회가 아닌 객체를 조회할 수 있다.

RowMapper - mapRow() 메서드

T mapRow(ResultSet rs, int rowNum) throws SQLException;
ResultSet rs에 결괏값을 담아와 사용자가 원하는 객체에 담는다. rowNum은 반복되는 루프 중 현재 행의 번호를 나타낸다.

  • 임의 클래스나 람다식으로 RowMapper의 객체를 생성해서 query() 메서드에 전달하는 경우가 많음
public class MemberDao {

	private JdbcTemplate jdbcTemplate;

	public MemberDao(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public Member selectByEmail(String email) {
		List<Member> results = jdbcTemplate.query(
			"select * from MEMBER where EMAIL = ?",
			new RowMapper<Member>() {
				@Override
				public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
					Member member = new Member(
						rs.getString("EMAIL"),
						rs.getString("PASSWORD"),
						rs.getString("NAME"),
						rs.getTimestamp("REGDATE").toLocalDateTime());
					member.setId(rs.getLong("ID"));
					return member;
				}
			}, email);
		return results.isEmpty() ? null : results.get(0);
	}
    ...생략
}

조회 - select

JdbcTemplate 클래스는 SELECT 쿼리 실행을 위한 query() 메서드를 제공한다. query() 메서드는 sql 파라미터로 전달받은 쿼리를 실행하고 RowMapper를 이용해서 ResultSet의 결과를 자바 객체로 변환한다.

List<T> query(String sql, RowMapper<T> rowMapper)
List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)
List<T> query(String sql, RowMapper<T> rowMapper, Object... args)

변경 - INSERT, UPDATE, DELETE

update() 메서드는 쿼리 실행 결과로 변경된 행의 개수를 INT로 리턴한다.

  • int update(String sql)
  • int update(String sql, Object... args)

INSERT

jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)","Leonor", "Watling");

UPDATE

jdbcTemplate.update("update t_actor set last_name = ? where id = ?", "Banjo", 5276L);

DELETE

jdbcTemplate.update("delete from t_actor where id = ?", Long.valueOf(actorId));
public class MemberDao {

	private JdbcTemplate jdbcTemplate;

	public MemberDao(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public void update(Member member) {
		jdbcTemplate.update(
				"update MEMBER set NAME = ?, PASSWORD = ? where EMAIL = ?",
				member.getName(), member.getPassword(), member.getEmail());
	}
    // ...생략
}

execute() 메서드

이외에 임의의 SQL을 실행할 때는 execute() 메서드를 사용할 수 있다. 테이블을 생성하는 DDL 등에 사용할 수 있다.

jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");

참고

profile
Hello! I am Ogu, a developer who loves learning and sharing! 🐤🐤 <br> こんにちは!学ぶことと共有することが好きな開発者のOguです!🐤

0개의 댓글