JAVA/개념정리

Ibatis(2)

inderrom 2022. 12. 6. 01:41

1. SqlMapClientFactory

 

package kr.or.ddit.util;

import java.io.Reader;
import java.nio.charset.Charset;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class SqlMapClientFactory {

	private static SqlMapClient smc = null;
	
	// new를 하지 않아도 메모리에 먼저 올라감
	static {
		try {
			// 1-1 문자 인코딩 캐릭터셋 설정
			Charset charset = Charset.forName("UTF-8");
			Resources.setCharset(charset);
			
			// 1-2. 환경 설정 파일 읽기
			Reader rd = 
				Resources.getResourceAsReader("kr/or/ddit/ibatis/config/sqlMapConfig.xml");
			
			// 1-3. 위에서 읽어온 Reader객체를 이용하여 실제 환경 설정을 완성한 후에
			// 		SQL문을 호출해서 실행할 수 있는 객체를 생성한다.
			smc = SqlMapClientBuilder.buildSqlMapClient(rd);
			
			rd.close(); // Reader객체 닫기
			
		} catch (Exception e) {
			System.out.println("iBatis 환경 설정 오류 ....");
			e.printStackTrace();
		}
		
		
	}
	
	public static SqlMapClient getSqlMapClient() {
		return smc;
	}
	
	// SqlMapClient 객체가 필요한 곳에서 
	// SqlMapClient aa = SqlMapClientFactory.getSqlMapClient()
	// aa.queryForList()
	// aa.queryForobject()
}

 

2. 1을 이용해 기존 member테이블을 가져와 회원관리프로그램 연습하기

 

- member vo, dao, service , controller 패키지 생성, mapper, config 설정

 

(1) sqlmapconfig

<?xml version="1.0" encoding="UTF-8"?>

<!--  이 문서는 iBatis의 환경 설정 내용을 가지고 있는 xml문서 -->

<!DOCTYPE sqlMapConfig
	PUBLIC "-//ibatis.apache.org//DTD DQL Map Config 2.0//EN"
	"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<!-- 
		DB와 연결하는 정보를 .properties파일에 저장해 놓고
		이 .properties파일의 내용을 읽어 올 수 있도록 설정한다.
	-->
		 <properties resource="kr/or/ddit/ibatis/config/dbinfo.properties"/>
		 
	<!-- 
		각각의 sqlMap파일의 namespace 속성값과 id 속성값을 연결해서
		실행할 SQL문을 선택할 수 있게 한다.	 
	 -->
	 <settings useStatementNamespaces="true"/>

	<!-- 
		SQL문에 사용할 VO객체는 패키지 이름을 포함한 전체 이름을 사용해야 한다.
		그렇게 되면 문장이 너무 길어질 수 있기 때문에 이 전체 이름을 대신해서 사용할
		alias를 설정할 수 있다.
		
		형식) <typeAlias alias="사용할alias명" type="사용할 클래스의 전체이름"/>
	 -->
	 	<typeAlias alias="memberVo" type="kr.or.ddit.mvc.vo.MemberVO"/>
	 
	 <!-- 
	 	DB와의 연결을 처리하는 부분
	  -->
	  <transactionManager type="JDBC">
	  	<dataSource type="SIMPLE">
	  		<property name="JDBC.Driver" value="${driver}"/>
	  		<property name="JDBC.ConnectionURL" value="${url}"/>
	  		<property name="JDBC.Username" value="${user}"/>
	  		<property name="JDBC.Password" value="${pass}"/>
	  	</dataSource>
	  </transactionManager>
	
	 <!-- 
		실행할 SQL문 등록하기
		==> 실행할 SQL문은 xml문서로 따로 만든 후 그 xml문서를 아래와 같이 등록하면 된다.
		
		형식) <sqlMap resource="경로명/파일명.xml"/>
	  -->
	  <sqlMap resource="kr/or/ddit/ibatis/mapper/member-mapper.xml"/>

</sqlMapConfig>

 

(2) member vo

 

package kr.or.ddit.mvc.vo;

/*
	DB테이블에 있는 컬럼을 기준으로 데이터를 객체화 할 클래스
	
	DB 테이블의 '컬럼명'이 이 클래스의 '멤버변수'가 된다.
	DB 테이블의 컬럼과 클래스의 멤버변수를 매핑하는 역할을 수행한다.
  	
  	오라클에서 컬럼명이 대문자여도 자바에서 소문자로 써도 됨
 
 */


public class MemberVO {
	private String mem_id; 
	private String mem_pass; 
	private String mem_name; 
	private String mem_tel; 
	private String mem_addr;
	
	// VO클래스에서 별도의 생성자를 만들 때에는 기본생성자도 반드시 같이 만들어 준다.
	// (아무일 안해도 기본생성자는 필수임)


	// getter, setter
	public String getMem_id() {
		return mem_id;
	}

	public void setMem_id(String mem_id) {
		this.mem_id = mem_id;
	}

	public String getMem_pass() {
		return mem_pass;
	}

	public void setMem_pass(String mem_pass) {
		this.mem_pass = mem_pass;
	}

	public String getMem_name() {
		return mem_name;
	}

	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}

	public String getMem_tel() {
		return mem_tel;
	}

	public void setMem_tel(String mem_tel) {
		this.mem_tel = mem_tel;
	}

	public String getMem_addr() {
		return mem_addr;
	}

	public void setMem_addr(String mem_addr) {
		this.mem_addr = mem_addr;
	}
	@Override
	public String toString() {
		return "MemberVO [mem_id=" + mem_id + ", mem_pass=" + mem_pass + ", mem_name=" + mem_name + ", mem_tel="
				+ mem_tel + ", mem_addr=" + mem_addr + "]";
	}
	
	
	
}

 

(3) member dao

 - IMemberDao ( 인터페이스)

package kr.or.ddit.mvc.dao;

import java.util.List;
import java.util.Map;

import kr.or.ddit.mvc.vo.MemberVO;

/**
 * 실제 DB와 연결해서 SQL문을 수행하여 결과를 작성해서
 * Service에게 전달하는 DAO의 interface<br><br>
 * 
 * 메서드 하나가 DB와 관련된 작업 1개를 수행하도록 작성한다.
 * 
 * MVC패턴에서는 데이터를 여러개로 보내는 것을 추천하지 않음!!!
 * 
 * @author PC-22
 *
 */


public interface IMemberDao {
	/**
	 * MemberVO객체에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param memVo DB에 insert할 자료가 저장된 MemberVO객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int insertMember(MemberVO memVo);
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
	 * 
	 * @param memId 삭제할 회원ID
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int deleteMember(String memId);
	
	/**
	 * MemberVO자료를 이용하여 DB에 update하는 메서드
	 * 
	 * @param memVo update할 회원 정보가 저장된 MemberVO객체
	 * @return 작업 성공: 1, 작업 실패 : 0
	 */
	
	public int updateMember(MemberVO memVo);
	
	/**
	 * DB의 전체 회원 정보를 가져와서 List에 담아서 반환하는 메서드
	 * @return MemberVO객체가 저장된 List객체
	 */
	
	public List<MemberVO> getAllMember();
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원ID의 개수를 반환하는 메서드
	 * @param memId 검색할 회원ID
	 * @return 검색된 회원ID의 개수
	 */
	public int getMemberCount(String memId);
	
	/**
	 * Map의 정보를 이용하여 회원 정보 중 원하는 컬럼을 수정하는 메서드
	 *	key값 정보 : 수정할컬럼명 : field, 수정할데이터: data, 회원ID: memid
	 * 
	 * 
	 * @param paramMap 수정할 컬럼명, 수정할 데이터, 수정할 회원ID가 저장된 Map객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	
	public int updateMember2(Map<String,String> paramMap);
	
}

 

 

 

-MemberDaoImpl

 

package kr.or.ddit.mvc.dao;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;

import kr.or.ddit.mvc.vo.MemberVO;
import kr.or.ddit.util.SqlMapClientFactory;

public class MemberDaoImpl implements IMemberDao {
	
	private SqlMapClient smc; // iBatis 처리용 객체 변수 선언
	
	//싱글톤 만들기 과정 1 ~ 3
	
	// 1번
	private static MemberDaoImpl dao;
	
	// 2번 - 생성자
	private MemberDaoImpl() { 
		smc = SqlMapClientFactory.getSqlMapClient();  //iBatis 처리용 객체 생성
	}
	
	// 3번 
	public static MemberDaoImpl getInstance() {
		if(dao == null) dao = new MemberDaoImpl();
		
		return dao;
	}
	
	@Override
	public int insertMember(MemberVO memVo) {
		
		int cnt = 0; // 반환값이 저장될 변수 선언
		
		try {
			Object obj = smc.insert("member.insertMember",memVo);
			if(obj==null) cnt = 1;
			
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		}
		
		return cnt;
	}

	@Override
	public int deleteMember(String memId) {

		int cnt = 0; // 반환값이 저장될 변수 선언
		
		try {
			cnt = smc.delete("member.deleteMember",memId);
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		}
		return cnt;
	}

	@Override
	public int updateMember(MemberVO memVo) {
		
		int cnt = 0;

		try {
			cnt = smc.update("member.updateMember",memVo);
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		}
		return cnt;
	}

	@Override
	public List<MemberVO> getAllMember() {
		
		List<MemberVO> memList = null;

		try {
			memList = smc.queryForList("member.getAllMember");
		} catch (SQLException e) {
			memList = null;
			e.printStackTrace();
		}
		return memList;
	}

	@Override
	public int getMemberCount(String memId) {
		
		int count = 0;
		
		try {
			
			count = (int)smc.queryForObject("member.getMemberCount", memId);
		} catch (SQLException e) {
			count = 0;
			e.printStackTrace();
		}
		return count;
	}

	@Override
	public int updateMember2(Map<String, String> paramMap) {
		
		int cnt = 0;

		try {
	 // key값 정보 수정할컬럼명 : field, 수정할데이터 : data, 회원ID : memid 
			cnt = smc.update("member.updateMember2",paramMap);
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		}
		return cnt;
	}


}

 

 

(4) member service

 -IMemberService (인터페이스)   // 인터페이스는 dao와 똑같이 작성해주면 된다.

package kr.or.ddit.mvc.service;

import java.util.List;
import java.util.Map;

import kr.or.ddit.mvc.vo.MemberVO;

/**
 * Service객체는 DAO에 작성된 메서드를 원하는 작업에 맞게 호출하여 실행하고
 * 그 결과를 받아서 Controller에게 전달하는 역할을 한다.
 * 보통은 DAO의 메서드 구조와 같게 만든다.
 * 
 * @author PC-22
 *
 */
public interface IMemberService {
	
	/**
	 * MemberVO객체에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param memVo DB에 insert할 자료가 저장된 MemberVO객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int insertMember(MemberVO memVo);
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
	 * 
	 * @param memId 삭제할 회원ID
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	public int deleteMember(String memId);
	
	/**
	 * MemberVO자료를 이용하여 DB에 update하는 메서드
	 * 
	 * @param memVo update할 회원 정보가 저장된 MemberVO객체
	 * @return 작업 성공: 1, 작업 실패 : 0
	 */
	
	public int updateMember(MemberVO memVo);
	
	/**
	 * DB의 전체 회원 정보를 가져와서 List에 담아서 반환하는 메서드
	 * @return MemberVO객체가 저장된 List객체
	 */
	
	public List<MemberVO> getAllMember();
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원ID의 개수를 반환하는 메서드
	 * @param memId 검색할 회원ID
	 * @return 검색된 회원ID의 개수
	 */
	public int getMemberCount(String memId);
	
	/**
	 * Map의 정보를 이용하여 회원 정보 중 원하는 컬럼을 수정하는 메서드
	 *	key값 정보 : 수정할컬럼명 : field, 수정할데이터: data, 회원ID: memid
	 * 
	 * 
	 * @param paramMap 수정할 컬럼명, 수정할 데이터, 수정할 회원ID가 저장된 Map객체
	 * @return 작업 성공 : 1, 작업 실패 : 0
	 */
	
	public int updateMember2(Map<String,String> paramMap);
}

- MemberServiceImpl

package kr.or.ddit.mvc.service;

import java.util.List;
import java.util.Map;

import kr.or.ddit.mvc.dao.IMemberDao;
import kr.or.ddit.mvc.dao.MemberDaoImpl;
import kr.or.ddit.mvc.vo.MemberVO;

public class MemberServiceImpl implements IMemberService {
	// 1번
	
	private static MemberServiceImpl service;
	
	private IMemberDao dao;  //DAO객체 변수 선언
	
	// 생성자 ==> 번
//	public MemberServiceImpl() {
	private MemberServiceImpl() {
//		dao = new MemberDaoImpl();  //DAO객체 생성
		dao = MemberDaoImpl.getInstance(); // DAO객체 생성 (싱글톤 적용된거
	}
	
	//3번
	public static MemberServiceImpl getInstance() {
		if(service == null) service = new MemberServiceImpl();
		return service;
	}
	
	@Override
	public int insertMember(MemberVO memVo) {
		
		return dao.insertMember(memVo);
	}

	@Override
	public int deleteMember(String memId) {
		return dao.deleteMember(memId);
	}

	@Override
	public int updateMember(MemberVO memVo) {
		// TODO Auto-generated method stub
		return dao.updateMember(memVo);
	}

	@Override
	public List<MemberVO> getAllMember() {
		
		return dao.getAllMember();
	}

	@Override
	public int getMemberCount(String memId) {
		return dao.getMemberCount(memId);
	}

	@Override
	public int updateMember2(Map<String, String> paramMap) {
		
		return dao.updateMember2(paramMap);
	}
	
}

 

(5) MemberController (실행)

package kr.or.ddit.mvc.controller;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import kr.or.ddit.mvc.service.IMemberService;
import kr.or.ddit.mvc.service.MemberServiceImpl;
import kr.or.ddit.mvc.vo.MemberVO;
import kr.or.ddit.util.DBUtil3;

public class MemberController {
   private IMemberService service;   
   Scanner scan;
   
   // 생성자
   public MemberController() {
      service = MemberServiceImpl.getInstance();
      scan = new Scanner(System.in);
   }
   
   
   public static void main(String[] args) {
      new MemberController().startMember();
   }
   
   // 시작 메서드
      public void startMember() {
         System.out.println();
         System.out.println("******************************************");
         System.out.println("      회  원  관  리  프  로  그  램");
         System.out.println("******************************************");
         System.out.println();
         
         
         while(true) {
            int choice = displayMenu();
            switch(choice) {
               case 1 :             // 추가
                  insertMember(); break;
               case 2 :             // 삭제
                  deleteMember(); break;
               case 3 :             // 수정
                  updateMember(); break;
               case 4 :             // 전체 자료 출력
                  displayMember(); break;
               case 5 :             // 수정2
                  updateMember2(); break;
               case 0 :             // 작업 끝.
                  System.out.println("회원 관리 프로그램을 마칩니다...");
                  return;
               default :
                  System.out.println("작업 번호를 잘못 입력했습니다. 다시 입력하세요.");
                  System.out.println();
            }
         }
      }
      private void updateMember2() {
    	  System.out.println();
  		System.out.println("수정할 회원 정보를 입력하세요...");
  		System.out.print("회원ID >> ");
  		String memId = scan.next();
  		
  		int count = service.getMemberCount(memId);
  		if(count==0) {
  			System.out.println(memId + "은(는) 등록되지 않은 회원입니다.");
  			System.out.println("수정 작업을 마칩니다...");
  			return;
  		}
  		
  		// 수정할 항목을 선택하기
  		int num;						// 수정할 항목의 선택 번호
  		String updateField = null; 		// 수정할 컬럼명이 저장될 변수
  		String updateTitle = null;		// 입력할 때 출력할 제목이 저장될 변수
  		do {
  			System.out.println();
  			System.out.println("수정할 항목을 선택하세요...");
  			System.out.println("1.비밀번호   2.회원이름   3.전화번호   4.회원주소");
  			System.out.print("수정할 항목 선택 >> ");
  			num = scan.nextInt();
  			
  			switch (num) {
  			case 1: updateField = "mem_pass"; updateTitle="비밀번호"; break;
  			case 2: updateField = "mem_name"; updateTitle="회원이름"; break;
  			case 3: updateField = "mem_tel"; updateTitle="전화번호"; break;
  			case 4: updateField = "mem_addr"; updateTitle="회원주소"; break;
  			default : System.out.println("수정할 항목 번호를 잘못 입력했습니다.");
  			 		  System.out.println("다시 입력하세요...");
  			}
  			
  			
  		}while(num<1 || num>4);
  		scan.nextLine(); // 입력 버퍼 비우기
  		System.out.println();
  		System.out.print("새로운" + updateTitle + " >> ");
  		String updateData = scan.nextLine();
  		
  		// 만들어진 데이터를 저장할 Map객체 생성
  		Map<String, String> pMap = new HashMap<String, String>();
  		
  		// 데이터를 Map에 추가
  		pMap.put("field", updateField);
  		pMap.put("data", updateData);
  		pMap.put("memid", memId);
  		
  		int cnt = service.updateMember2(pMap);
  		
  		if(cnt >0) {
  			System.out.println("수정 작업 성공 !!!");
  		}else {
  			System.out.println("수정 작업 실패 ~~~");
  		}
  		
  		
      }
      
            
    private void displayMember() {
       List<MemberVO> memList=service.getAllMember();
       
       System.out.println();
      System.out.println("----------------------------------------------------");
      System.out.println("    ID     비밀번호            이름           전화번호           주소");
      System.out.println("----------------------------------------------------");
      if(memList==null || memList.size()==0) {
         System.out.println("등록된 회원 정보가 하나도 없습니다...");
      }else {
         for(MemberVO mvo : memList) {
        	 String memId = mvo.getMem_id();
				String memPass = mvo.getMem_pass();
				String memName = mvo.getMem_name();
				String memTel = mvo.getMem_tel();
				String memAddr = mvo.getMem_addr();
			
				System.out.println("  " + memId + "    " + memPass + "    " + memName + "     " + memTel + "    " + memAddr );
			}
         }
      System.out.println("----------------------------------------------------");
      }
      
      
   


   private void updateMember() {
      System.out.println();
      System.out.println("수정할 회원 정보를 입력하세요...");
      System.out.print("회원 아이디 >> ");
      String memId=scan.next();
      
      int count=service.getMemberCount(memId);
      
      if(count==0) {
         System.out.println(memId+"은(는) 등록되지 않은 회원입니다.");
         System.out.println("수정 작업을 마칩니다....");
         return;
      }
      
      System.out.print("새로운 비밀번호 >> ");
      String newMemPass=scan.next();
      
      System.out.print("새로운 이름 >>");
      String newMemName=scan.next();
      
      System.out.print("새로운 전화번호 >> ");
      String newMemTel=scan.next();
      
      scan.nextLine();//버퍼 비우기
      System.out.print("새로운 회원주소 >>");
      String newMemAddr=scan.nextLine();
      
      // 수정할 데이터를 VO객체에 저장한다.
      MemberVO memVo=new MemberVO();
      memVo.setMem_id(memId);
      memVo.setMem_pass(newMemPass);
      memVo.setMem_name(newMemName);
      memVo.setMem_tel(newMemTel);
      memVo.setMem_addr(newMemAddr);
      
      int cnt=service.updateMember(memVo);
      
      if(cnt>0) {
         System.out.println("회원ID가 "+memId+"인 회원 정보 수정 성공!!");
      }else {
         System.out.println(memId+" 회원은 없는 회원이거나 수정에 실패했습니다~~~");
      }
   }


   private void deleteMember() {
      System.out.println();
      System.out.println("삭제할 회원 정보를 입력하세요....");
      System.out.print("삭제할 회원ID >> ");
      String memId=scan.next();
      
      int cnt=service.deleteMember(memId);
      
      if(cnt>0) {
         System.out.println("회원ID가 "+memId+"인 회원 정보 삭제 성공!!");
      }else {
         System.out.println(memId+" 회원은 없는 회원이거나 삭제에 실패했습니다~~~");
      }
   }


   private void insertMember() {
       System.out.println();
        System.out.println("추가할 회원 정보를 입력하세요...");
        
        int count=0;       //회원ID의 개수가 저장될 변수
        String memId;   //회원ID가 저장될 변수
        do {
           System.out.print("회원ID >> ");
           memId=scan.next();
           count= service.getMemberCount(memId); //처리한 결과를 가져옴
           if(count>0) {
              System.out.println(memId+"은(는) 이미 등록된 ID입니다.");
              System.out.println("다른 회원ID를 입력하세요...");
           }
        }while(count>0);
        
        System.out.print("비밀번호 >> ");
        String memPass=scan.next();
        
        System.out.print("회원이름 >> ");
        String memName=scan.next();
        
        System.out.print("전화번호 >> ");
        String memTel=scan.next();
        
        scan.nextLine();   //입력 버퍼 비우기
        
        System.out.print("회원주소 >> ");
        String memAddr=scan.nextLine();
        
        // MemberVO객체에 입력한 데이터를 저장한다.
        MemberVO memVo=new MemberVO();
        memVo.setMem_id(memId);
        memVo.setMem_pass(memPass);
        memVo.setMem_name(memName);
        memVo.setMem_tel(memTel);
        memVo.setMem_addr(memAddr);
        
        int cnt=service.insertMember(memVo);
        
        if(cnt>0) {
           System.out.println(memId+" 회원 정보 추가 완료!!!");
        }else {
           System.out.println(memId+" 회원 정보 추가 실패!!!");
        }
      }
            
// 메뉴를 출력하고 입력한 작업 번호를 반환하는 메서드
      private int displayMenu() {
         System.out.println();
         System.out.println("== 작업 선택 ==");
         System.out.println(" 1. 자료 추가");
         System.out.println(" 2. 자료 삭제");
         System.out.println(" 3. 자료 수정");
         System.out.println(" 4. 전체 자료 출력");
         System.out.println(" 5. 자료 수정2");
         System.out.println(" 0. 작업 끝.");
         System.out.println("--------------------------");
         System.out.print(" 작업 번호 입력 >> ");
         return scan.nextInt();
      }
   
      public int getMemberCount(String memId) {
	      Connection conn = null;
	      PreparedStatement pstmt = null;
	      ResultSet rs = null;
	      
	      int count = 0; 
	      
	      try {
	         conn = DBUtil3.getConnection();
	         
	         String sql = "select count(*) cnt from mymember where mem_id = ? ";
	         
	         pstmt = conn.prepareStatement(sql);
	         pstmt.setString(1, memId);
	         
	         rs = pstmt.executeQuery();
	         
	         if(rs.next()) {
	            count = rs.getInt("cnt");
	         }
	         
	      } catch (SQLException e) {
	         count = 0;
	         e.printStackTrace();
	      } finally {
	         if(conn != null) try { conn.close(); } catch(SQLException e ) {}
	         if(pstmt != null) try { pstmt.close(); } catch(SQLException e ) {}
	         if(rs != null) try { rs.close(); } catch(SQLException e ) {}
	      }
	      
	      return count;
	   }
}