본문 바로가기

동방프로젝트

8과 queryForObject()

Member member= jdbcTemplate.queryForObject(
	"select*from MEMBER where ID=?",
    new RowMapper<Member>() {
    @Override
    public Member mapRow(ResultSet rs, int rowNum) thorws 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;
                        }
                       },
                      100);

queryForObject 결과 칼럼이 두개 이상이면, RowMaper을 파러미터로 전달해 결과 생성이 가능.

가령, 특정 ID를 갖는 회원데이터를 queryForObject로 읽어올 경우, 위처럼

리턴타입이 List가 아닌 RowMapper로 변환해주는 타입이다.

 

결과행은, queryForObject는 무조간 1개. 따라서 그 이상이면 query()를 쓸것

 

package org.springframework.jdbc.core;

import java.sql.*;

public interface PreparedStatementCreator{
	PreparedStatement createPreparedStatement(Connection con) thorws SQLException;
    }

형식의 인터페이스를 통해, preparedstatement의 set메서드를 이용해 직접 인덱스 파라미터 값을 설정이 가능.

createPreparedStatement() 메서드는 Connection타입 파라미터를 가짐.

PreparedStatementCreator을 구혀난 클래스는 createPreparedStatement() 메서드의 파라미터로 전달받는 connection을 이용해 PreparedStatement 객체를 생성하고, 인덱스 파라미터를 잘 설정하고 리턴.

 

jdbcTemplate.update(new PreparedStatementCreator() {
	@Override
    public PreparedStatement createPreparedStatement(Connection con)
    thorws SQLException {
    //파라미터로 전달받은 Connection을 이용, PreparedStatement 생성
    PreparedStatement pstmt = con.prepareStatement(
    "insert into MEMBER(EMAIL, PASSWORD, NAME, REGDATE) values(?,?,?,?)");
    //인덱스 파라미터값 설정
    pstmt.setString(1, member.getEmail());
    pstmt.setString(2, member.getPassword());
    pstmt.setString(3, member.getName());
    pstmt.setTimestamp(4, TimeStamp.valueOf(member.getRegisterDateTime()));
    
    //생성한 PreparedStatement객체 리턴
    return pstmt;
    }
});

setString을 통해, 직접 설정

 

KeyHolder keyHolder = new GeneratedKeyHolder();
		
		//PreparedStatementCreator 임의클래스를 이용해 PreparedStatement객체를 임의생성
		jdbcTemplate.update(new PreparedStatementCreator() {
			
			public PreparedStatement createPreparedStatement(Connection con)
					throws SQLException {
				// 파라미터로 전달받은 Connection을 이용해서 PreparedStatement 생성
				//두 번째 배열은 string배열 "ID", 자동생성되는 키칼럼목록 지정에 사용
				//MEMBER테이블은 ID칼럼이 자동증가키칼럼이기에, 두번째 파라미터값으로 "ID"를 줌
				PreparedStatement pstmt = con.prepareStatement(
						"insert into MEMBER (EMAIL, PASSWORD, NAME, REGDATE) " +
						"values (?, ?, ?, ?)",
						new String[] { "ID" });
				// 인덱스 파라미터 값 설정
				pstmt.setString(1, member.getEmail());
				pstmt.setString(2, member.getPassword());
				pstmt.setString(3, member.getName());
				pstmt.setTimestamp(4,
						Timestamp.valueOf(member.getRegisterDateTime()));
				// 생성한 PreparedStatement 객체 리턴
				return pstmt;
			}
			//JdbcTemplate.update()의 두번째인자는 위에서 생성한 KeyHolder객체.
		}, keyHolder);
		//PreparedStatement를 실행후, 자동생성된 키값을 KeyHolder에 보관. 이는 getKey()통해 구하기 가능.
		
		Number keyValue = keyHolder.getKey();
		member.setId(keyValue.longValue());
	}
	/* 또다른 방식은 람다를 이용한
	 * jdbcTemplate.update((Connection con) -> {
	 * 	PreparedStatement pstmt = con.prepareStatement(
	 * 		"insert into MEMBER(EMAIL, PASSWORD, NAME, REGDATE)" +
	 * 		"values(?,?,?,?)", new String[]{"ID"});
	 * 	
	 * pstmt.setString(1, member.getEmail());
	 * pstmt.setString(2, member.getPassword());
	 * pstmt.setString(3, member.getName());
	 * pstmt.setTimestamp(4,
	 * Timestamp.valueOf(member.getRegisterDateTime()));
	
	 * return pstmt;
	 *	}
	 * }, keyHolder);
	 */

'동방프로젝트' 카테고리의 다른 글

스프링이 제공하는 폼 태그 사용이전 jsp  (1) 2021.01.31
spring의 transactional&proxy  (2) 2021.01.25
7과-2  (0) 2021.01.22
7과  (2) 2021.01.20
@Qualifier 어노테이션  (2) 2021.01.15