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;
}
}
내부에서 이런코드가 실행되는거다, 그래서 리스트로 반환된다

이전방법
@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의 select기능들을 구현하세요
DeptRowMapper를 만들고 작업하세요
getDeptInfo, getDeptList,getDeptSearch메소드를 작성하세요
DeptDAOImpl과 실행화면을 캡쳐해서 제출해주세요
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();
}
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();
}
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 + "]";
}
}
위에는 간단하게 메소드 상속할수있게만 변경
여기부터 바뀐 것
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));
}
}
@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");
}
}
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)의 교육을 수강하고 작성되었습니다.