본문 바로가기
Spring

2022-11-29 스프링 jdbc(DB연결) - CRUD

by HTT 2022. 11. 29.

앞서 했던 insert, update, delete와 다르게 select는 객체를 리턴하고, ResultSet클래스를 이용하므로 따로 작업하였다.

 

ResultSet

 

DeptSystem(메인 메소드), MenuUI(인터페이스 AbstractUI상속), DeptDAOImpl(인터페이스 DeptDAO상속)

이 구성에서 추가로 인터페이스 RowMapper를 상속받는 클래스를 만들어 mapRow메소드를 이용해 값을 읽어줘야 한다.

 

RowMapper란?
Jdbc Template에서 행 단위로 ResultSet의 행을 매핑하는 데 사용하는 인터페이스로, 각 행을 결과 객체에 매핑하는 실제 작업을 수행한다.

 

 

- 부서 이름으로 해당하는 부서의 정보 찾기

우선 CustomerRowMapper클래스의 mapRow호출하기 위해 query(여러 개 리턴), queryForObject(하나만 리턴) 메소드를 이용한다.

@Component
public class DeptDAOImpl implements DeptDAO{
	private JdbcTemplate mytemplate;
	@Autowired
	public DeptDAOImpl(JdbcTemplate mytemplate) {
		super();
		this.mytemplate = mytemplate;
	}
    @Override
	public List<DeptDTO> findByDept(String deptname) {
		return mytemplate.query("select * from mydept where deptname like ?", new Object[] {"%"+deptname+"%"}, new DeptRowMapper());
	}
}

=> new DeptRowMapper() → DeptRowMapper클래스의 mapRow메소드 호출

new Object[] {id} 어떤 값이 들어올지 모르기 때문에 Object타입으로 해둠, 파라미터로 받는 ?값 세팅

 

package dept;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class DeptRowMapper implements RowMapper<DeptDTO>{

	@Override
	public DeptDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
		DeptDTO user = new DeptDTO(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5));
		return user;
	}

}

=> RowMapper의 추상메소드인 mapRow를 오버라이딩하여 ResultSet으로 데이터 읽고 담아서 리턴하기. 

 

 

findByDept() 메소드를 호출한 곳으로 돌아가서 리턴받은 값 출력하기

@Override
public void findByDept() {
	System.out.println("*******부서검색(부서명)*******");
	System.out.println("부서명:");
	String deptname = key.next();
	List<DeptDTO> list = dao.findByDept(deptname);
	for(DeptDTO user:list) {
		System.out.println(user);
	}
}

=> 여러 개의 정보를 담아야 하므로 DeptDTO타입 List클래스로 리턴 값을 받아준다.

 

 

***********주의할 점***********

 

1) 쿼리문 리턴할 때  query(단일 행)메소드와, queryForObject(객체)메소드 사용 잘 구분하기

2) ?값 셋팅할 때 변수이름, 갯수 잘 지키기

댓글