Srpring JDBC-RowMapper

brave_chicken·2024년 4월 30일

잇(IT)생 챌린지

목록 보기
39/90

2) JdbcTemplate메소드

(1) update - insert, delete, update를 처리하기 위한 jdbcTemplate의 메소드

(2) 조회하기

  • 조회된 레코드를 어떻게 처리해야 하는지 정의
  • RowMapper객체를 정의 : 조회된 레코드 한 개를 객체로 변환할 수 있도록 정의
  • queryForObject - select의 결과가 객체 하나로 매핑될 수 있는 경우
  • query : select의 결과가 레코드 한 개 이상을 리턴하는 경우
    => List로 반환

실습

RowMapper 실습

저번 수업 파일 활용, 중복되는 부분은 포함하지 않음

member implements RowMapper< MemberDTO>

MemberRowMapper

RowMapper
: JdbcTemplate에서 select를 처리하는 query 메소드 내부에서, DB에서 조회한 레코드를 어떻게 매핑을 시켜야하는지 정보를 담고있는 객체

public class MemberRowMapper implements RowMapper<MemberDTO> {

	@Override
	public MemberDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
		System.out.println("mapRow=>"+ rowNum);
		//while문 안에 정의했던 내용
		MemberDTO user = new MemberDTO(rs.getString(1),rs.getString(2),rs.getString(3),
				rs.getString(4),rs.getDate(5),rs.getInt(6),rs.getString(7));
		return user;
	}
}

내부에서 이런코드가 실행되는거다, 그래서 리스트로 반환된다

MemberDAOImpl

이전방법

@Repository
public class MemberDAOImpl implements MemberDAO {
	private JdbcTemplate template;
	
	@Autowired
	public MemberDAOImpl(JdbcTemplate template) {
		super();
		this.template = template;
	}
	
	@Override	
	public int count() {
		return template.queryForObject("select count (*) from member", Integer.class);
	}

	@Override
	public int insert(MemberDTO user) {
		String sql = "insert into member values(?,?,?,?,sysdate,10000,?)";
		//JdbcTemplate의 update메소드를 호출해서 db에 insert하는 작업을 수행
		//sql문과 ?에 대한 값을 매개변수로 전달
		//sql문을 정의하고 ?에 셋팅할 값을 순서대로 지정
		//id,pass,name,addr,,,info
		return template.update(sql, user.getId(), user.getPass(), user.getName(), user.getAddr(), user.getInfo());
	}

	@Override
	public int update(MemberDTO updateUserInfo) {
		// id가 만족하는 데이터의 주소와 정보를 수정할 수 있도록 처리
		String sql = "update member set addr=?,info=? where id=? ";
		return template.update(sql, updateUserInfo.getAddr(), updateUserInfo.getInfo(), updateUserInfo.getId());
	}

	@Override
	public int delete(String id) {
		// 입력받은 아이디에 해당하는 레코드를 삭제
		String sql = "delete from member where id=?";
		return template.update(sql, id);
	}

RowMapper 적용 방법

	@Override
	public MemberDTO login(String id, String pass) {
		MemberDTO loginUser = null;
		try {
			loginUser = template.queryForObject("select * from member where id=? and pass=?", 
					new Object[] {id, pass}, new MemberRowMapper());
		}catch (EmptyResultDataAccessException e) {
			
		}
		return loginUser;
	}

	@Override
	public List<MemberDTO> select() {
		return template.query("select * from member", new MemberRowMapper());
	}

	@Override
	public MemberDTO findById(String id) {
		MemberDTO user = null;
		try {
			user = template.queryForObject("select * from member where id=?", 
					new Object[] {id}, new MemberRowMapper());
		}catch (EmptyResultDataAccessException e) {
			
		}
		
		return user;
	}

	@Override
	public List<MemberDTO> findByAddr(String addr) {
		return template.query("select * from member where addr like ?", 
				new Object[] {"%"+addr+"%"}, new MemberRowMapper());
	}
	
}

dept

dept의 select기능들을 구현하세요
DeptRowMapper를 만들고 작업하세요
getDeptInfo, getDeptList,getDeptSearch메소드를 작성하세요
DeptDAOImpl과 실행화면을 캡쳐해서 제출해주세요

interface AbstractUI

public interface AbstractUI {
	//프로그램의 시작을 나타내는 메소드
	void show();
	//count와 관련된 메소드(dao의 count를 호출하는 메소드)
	void countMenu();
	//insert와 관련된 메소드(dao의 insert를 호출하는 메소드)
	void insertMenu();
	//update와 관련된 메소드(dao의 update를 호출하는 메소드)
	void updateMenu();
	//delete와 관련된 메소드(dao의 delete를 호출하는 메소드)
	void deleteMenu();
	//전체목록보기와 관련된 메소드(dao의 전체목록보기 메소드를 호출하는 메소드)
	void showAllMenu();
	//login와 관련된 메소드(dao의 login를 호출하는 메소드)
	void showDeptInfo();
	//검색과 관련된 메소드(dao의 검색기능 메소드를 호출하는 메소드)
	void findByDept();
	//각 부서별 근무 직원을 검색하는 메소드
	void getMemberList();
	
}

interface DeptDAO

public interface DeptDAO {
	//부서상세보기 - 부서번호로 부서의 정보를 조회 - 필수
	DeptDTO getDeptInfo(String deptno);
	//전체 부서의 목록 보기 - 필수
	List<DeptDTO> getDeptList();
	//부서검색 - 필수
	List<DeptDTO> getDeptSearch(String deptname);
	//부서등록
	int insert(DeptDTO dept);
	//부서업데이트 - 부서의 전화번호와 주소를 수정하도록
	int update(DeptDTO dept);
	
	//총부서갯수
	int count();
	
}

DeptDTO

public class DeptDTO {
	String deptCode;
	String deptName;
	String tel;
	String addr;
	public DeptDTO(){
		
	}
	public DeptDTO(String deptCode, String deptName, String tel, String addr) {
		super();
		this.deptCode = deptCode;
		this.deptName = deptName;
		this.tel = tel;
		this.addr = addr;
	}
	public String getDeptCode() {
		return deptCode;
	}
	public void setDeptCode(String deptCode) {
		this.deptCode = deptCode;
	}
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	@Override
	public String toString() {
		return "DeptDTO [deptCode=" + deptCode + ", deptName=" + deptName + ", tel=" + tel + ", addr=" + addr + "]";
	}
}

위에는 간단하게 메소드 상속할수있게만 변경
여기부터 바뀐 것

DeptRowMapper

public class DeptRowMapper implements RowMapper<DeptDTO>{
	@Override
	public DeptDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
		return new DeptDTO(rs.getString(1),rs.getString(2),
       					 rs.getString(3),rs.getString(4));
	}
}

DeptDAOImpl

@Repository
public class DeptDAOImpl implements DeptDAO {
	private JdbcTemplate template;
	
	@Autowired
	public DeptDAOImpl(JdbcTemplate template) {
		super();
		this.template = template;
	}

	@Override
	public int insert(DeptDTO dept) {
		//부서등록
		System.out.println("insert : "+dept);
		String sql = "insert into mydept values(?,?,?,?)";
		return template.update(sql, dept.getDeptCode(),dept.getDeptName(),dept.getTel(),dept.getAddr());
	}

	@Override
	public int update(DeptDTO dept) {
		//부서업데이트 - 부서의 전화번호와 주소를 수정하도록
		String sql = "update mydept set tel=? ,addr=? where deptcode=?";
		return template.update(sql, dept.getTel(), dept.getAddr(), dept.getDeptCode());
	}

	@Override
	public int count() {
		//총부서갯수
		return template.queryForObject("select count (*) from mydept", Integer.class);
	}

여기부터 적용

	@Override
	public DeptDTO getDeptInfo(String deptno) {
		// 부서상세보기 - 부서번호로 부서의 정보를 조회 - 필수
		DeptDTO deptInfo = null;
		try{
			deptInfo = template.queryForObject("select * from mydept where deptcode = ?",
					new Object[] {deptno},new DeptRowMapper());
		}catch (EmptyResultDataAccessException e) {
		}
		return deptInfo;
	}

	@Override
	public List<DeptDTO> getDeptList() {
		// 전체 부서의 목록 보기 - 필수
		return template.query("select * from mydept", new DeptRowMapper());
	}

	@Override
	public List<DeptDTO> getDeptSearch(String deptname) {
		//부서검색 - 필수
		List<DeptDTO> searchDept = null;
		try{
			searchDept = template.query("select * from mydept where deptname like ?", 
					new Object[] {"%"+deptname+"%"}, new DeptRowMapper());
		}catch (EmptyResultDataAccessException e) {
		}
		
		return searchDept;
	}
}
@Service("deptservice")
public class MenuUI implements AbstractUI {
	Scanner key = new Scanner(System.in);
	DeptDAOImpl dao;
	
	@Autowired
	public MenuUI(DeptDAOImpl dao) {
		super();
		this.dao = dao;
	}
	
	//시작을 알리는 메소드
	public void show(){
		System.out.println("**********부서관리 시스템************");
		System.out.println("1. 부서등록");
		System.out.println("2. 부서상세보기");
		System.out.println("3. 부서정보수정(부서번호)");
		System.out.println("4. 부서삭제");
		System.out.println("5. 전체 부서 목록보기");
		System.out.println("6. 부서검색(부서명)");
		System.out.println("7. 부서갯수조회");
		System.out.println("8. 각 부서별 근무직원 조회하기(부서명)");
		System.out.println("9. 종료");
		System.out.print("원하는 작업을 선택하세요:");
		int menu=key.nextInt();
		menuSelect(menu);
	}
	private void menuSelect(int menu) {
		switch(menu){
			case 1: 
				insertMenu();
				break;
			case 2: 
				showDeptInfo();
				break;
			case 3: 
				updateMenu();
				break;
			case 5: 
				showAllMenu();
				break;
			case 6: 
				findByDept();
				break;
			case 7: 
				countMenu();
				break;
			case 9:
				System.exit(0);//프로그램 정상종료
	}
		
	}
	@Override
	public void countMenu() {
		System.out.println("-----------부서갯수조회----------");
		System.out.println("조회된 부서 수:"+dao.count());
	}
	@Override
	public void insertMenu() {
		System.out.println("-----------부서등록----------");
		System.out.print("부서코드:");
		String deptcode = key.next();
		System.out.print("부서명:");
		String deptname = key.next();
		System.out.print("부서전화번호:");
		String tel = key.next();
		System.out.print("주소:");
		String addr = key.next();
		
		DeptDTO dept = new DeptDTO(deptcode,deptname,tel,addr);
		int result = dao.insert(dept);
		System.out.println(result+"개 부서 등록완료");
	}
	@Override
	public void updateMenu() {
		System.out.println("*******부서 전화번호 및 주소 수정********");
		System.out.print("정보를 변경할 부서코드:");
		String deptcode = key.next();
		System.out.print("변경할 전화번호:");
		String tel = key.next();
		System.out.print("변경할 주소:");
		String addr = key.next();
		DeptDTO dept = new DeptDTO(deptcode,null,tel,addr);
		int result = dao.update(dept);
		System.out.println(result+"개 부서 수정완료");
	}
	@Override
	public void deleteMenu() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void showAllMenu() {
		// 전체부서목록조회
		List<DeptDTO> deptlist = dao.getDeptList();
		for(DeptDTO dept:deptlist) {
			print(dept);
		}
	}
	@Override
	public void showDeptInfo() {
		// 부서상세보기 - 부서번호로 부서의 정보를 조회
		System.out.println("***********부서정보조회***********");
		System.out.print("부서번호:");
		String deptno = key.next();
		DeptDTO dept = dao.getDeptInfo(deptno);
		if(dept==null) {
			System.out.println("일치하는 부서가 없습니다.");
		}else {
		print(dept);
		}
	}
	@Override
	public void findByDept() {
		// 부서검색
		System.out.println("***********부서명으로 검색***********");
		System.out.print("부서명:");
		String deptname = key.next();
		List<DeptDTO> searchDept = dao.getDeptSearch(deptname);
		for(DeptDTO dept:searchDept) {
			print(dept);
		}
	}
	@Override
	public void getMemberList() {
		// TODO Auto-generated method stub
		
	}
	
	public void print(DeptDTO dept) {
		System.out.print(dept.getDeptCode()+"\t");
		System.out.print(dept.getDeptName()+"\t");
		System.out.print(dept.getTel()+"\t");
		System.out.println(dept.getAddr()+"\t");
	}
}

DeptSystem

public class DeptSystem {
	public static void main(String[] args) {
		ApplicationContext factory = 
			 new ClassPathXmlApplicationContext("/config/dept.xml");
		AbstractUI ui = (AbstractUI)factory.getBean("deptservice");
		while(true){
			ui.show();
		}
	}
}

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글