ddit/Java

ibatis

ssong2ku 2022. 7. 29. 08:20
728x90

ibatis란?

 

iBATIS(아이바티스)는 SQL에 기반한 데이터베이스 자바, 닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 

영속성 프레임워크(Java에서 DB를 편하게 핸들링 할 수있게 해주는 프레임워크).

이러한 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동.

 

간단히 정리하자면

쿼리문을 자바소스에서 빼내어  XML문서에 넣어서 실행할 수 있게하는 것

DB연결까지 가능한 프레임워크(MVC패턴의 DAO부분같은..)

 

- SQL문과 Java의 소스코드를 분리하고, 파라미터 값이 변경되지 않으면
  Java의 소스 변경없이 SQL문만 변경해서 사용가능

 

- iBatis 데이터매퍼(iBatis에 자동으로 값을 매핑) API를 이용해서 자바빈즈(보통VO객체) 혹은 Map객체를
PreparedStatement의 파라미터에 매핑해 주고, SQL문의 실행 결과를
자바빈즈 혹은 Map객체에 자동으로 매핑해 준다.
  

예제)

1. 자바프로젝트 생성 후 소스폴더 추가하기

2. 소스폴더에 config, mapper/mapping 프로젝트 생성

 2-1. config에 JDBC에 필요한 정보가 들어 있는 text파일생성

#dbinfo.properties

# 이 줄은 주석 처리 줄입니다...
# Properties문서를 작성하는 방법
# 'key값 = value값' 같은 형식으로 작성
# 공백주의하기

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=ddit
pass=java

 2-2. DB연결과 실행할 쿼리문등록을 위한 Ibatis설정문서(sqlMapConfig.xml)만들기

<?xml version="1.0" encoding="UTF-8"?>
<!-- iBatis 설정 문서 굉장히 중요******!-->
<!DOCTYPE sqlMapConfig
	PUBLIC "-//ibatis.apache.org//DTD SQL 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파일(SQL문이 작성된 파일)의 Namespace값과 id속성값을
		이용해서 실행할 쿼리문을 찾도록 설정.	
	 -->
	 <settings useStatementNamespaces="true"/>
	 
	 <!-- 
	 	쿼리문에 사용할 VO객체를 지정할 때 패키지 이름을 포함한 전체 이름을 
	 	사용해야 하는데 그렇게 되면 문장이 너무 길어질 수 있음.
	 	이 때 전체 이름을 대신해서 사용할 alias 설정가능.
	 	
	 	형식) <typeAlias alias ="alias명" type="클래스의 전체이름"/>
	 	
	  -->
	  <typeAlias alias="lprodVo" type ="kr.or.ddit.vo.LprodVO"/>
	  
	  <!-- 
	  	DB와 연결하는 부분 설정
	  
	   -->
		<transactionManager type="JDBC">
			<dataSource type="SIMPLE">
				<property name = "JDBC.Driver" value ="${driver}"/>
			<!-- property name = "JDBC.Driver" value ="oracle.jdbc.driver.OracleDriver"/ -->
				<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/mapping/LprodTest.xml"/>
		 
</sqlMapConfig>

 2-3. 위의 정보를  Dao에 전달해주기 위한 class생성

package kr.or.ddit.ibatis.config;

import java.io.IOException;
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 {
	//DAO에서 공유해서 사용하기 위해 static으로 선언
	private static SqlMapClientFactory smc;

	static {
		
		Charset charset = Charset.forName("utf-8");
		Resources.setCharset(charset);

		Reader rd = null;
		try {
			rd = Resources.getResourceAsReader("kr/or/ddit/ibatis/config/sqlMapConfig.xml");
			smc = SqlMapClientBuilder.buildSqlMapClient(rd);
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(rd!=null) try{rd.close();}catch(IOException e){}

		}
	}
	
	//DAO에서 호출되는 메서드.
	public static SqlMapClient getSqlMapClient() {
		return smc;
	}
}

  

3. SQL문을 갖고있는 XML등록(mapper) 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
	PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
			"http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="lprod">
	<!-- 
		이 영역에는 처리할 SQL문에 맞는 태그를 사용하여 SQL문을 작성
		
		사용할 수 있는 기본적인 태그들..
		<select> select문장~~</select>
		<insert> insert문장~~</insert>
		<update> update문장~~</update>
		<delete> delete문장~~</delete>
	 -->
	
	<!-- 
		id속성 => 실행할 태그를 Java소스에서 호출할 때 사용하는 이름으로
			<sqlMap>태그의 namespace속성값과 연결해서 사용.
			
			형식)namespace속성값.실행할태그의 id속성값
			예) "lprod.insertlprod" 	
			
		parameterClass속성 ==> SQL문에 사용할 데이터가 들어있는 객체를 기술.
			(보통 VO클래스, Map객체, 자바의 기본자료형이름 등이 사용됨.)
			(VO클래스등을 기술할 때는 해당 클래스의 패키지명을 포함한 전체 이름을 기술.)
	 -->
	<!--<insert id="insertlprod" parameterClass="kr.or.ddit.vo.LprodVO">  -->
	<insert id="insertLprod" parameterClass="lprodVo">
		insert into lprod (lprod_id, lprod_gu, lprod_nm)
		values(#lprod_id#, #lprod_gu#, #lprod_nm#)
	</insert>
	
	<update id ="updateLprod" parameterClass="kr.or.ddit.vo.LprodVO">
		update lprod set lprod_id=#lprod_id#, lprod_nm=#lprod_nm#
		where lprod_gu=#lprod_gu#
	</update>
	<!-- 값이 하나만 있을 때는 파라미터클래스의 그것의 자료형으로 써도됨, String 소문자로도 기입가능 -->
	<delete id ="deleteLprod" parameterClass ="string">
		delete from lprod where lprod_gu =#lprod_gu#
	
	</delete>
	
		<!-- 
			resultClass속성 ==> select문을 처리한 결과를 저장할 VO클래스나 Map객체 또는 
				자바의 기본자료형이름을 지정.
				select한 결과가 여러개이면 List에 자동으로 담아 줌.
				그래서 결과가 여러개 일 경우에도 이 속성에는 1개의 레코드가 저장될 
				클래스나 자료형 이름을 지정.
		 -->
	
	
	<select id="getAllprod" resultClass="lprodVo">
		select * from lprod
	</select>
	
	<select id="getLprod" parameterClass="String" resultClass="lprodVo">
		select * from lprod where lprod_gu = #lprod_gu#
	</select>
	
</sqlMap>

※ibatis - 설정파일(에러시  type alias나 sqlMap부분의 파일 다 열어서 확인하기 )
sqlMapConfig.xml(굉장히 중요!!!!!!*******) => factory에서 smc객체생성
: 1. DB연결 : dbinfo.properties
  2. VO파일의 alias설정(필수아님) :

      예)

    <typeAlias alias="lprodVo" type ="kr.or.ddit.vo.LprodVO"/>

 

 

4. VO프로젝트 및 class만들기

package kr.or.ddit.vo;

public class LprodVO {
	private int lprod_id;
	private String lprod_gu;
	private String lprod_nm;
	
	//다른 생성자 만들 때 기본 생성자 필히 생성!
	/*
	 * public LprodVO() { }
	 * 
	 * 
	 * public LprodVO(String lprod_id, String lprod_gu, String lprod_nm) { super();
	 * this.lprod_id = lprod_id; this.lprod_gu = lprod_gu; this.lprod_nm = lprod_nm;
	 * }
	 */
	public int getLprod_id() {
		return lprod_id;
	}
	public void setLprod_id(int lprod_id) {
		this.lprod_id = lprod_id;
	}
	public String getLprod_gu() {
		return lprod_gu;
	}
	public void setLprod_gu(String lprod_gu) {
		this.lprod_gu = lprod_gu;
	}
	public String getLprod_nm() {
		return lprod_nm;
	}
	public void setLprod_nm(String lprod_nm) {
		this.lprod_nm = lprod_nm;
	}


	

}

5.DAO프로젝트 및 interface, class만들기

package kr.or.mvc.dao;

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

import kr.or.mvc.vo.MemberVO;

/**
 * 실제 DB와 연결해서 SQL문을 수행하여 결과를 작성해서 Service에게 전달하는 DAO의 interface
 * 
 * 각 메서드 하나가 DB와 관련된 직업 1개를 수행하도록 작성
 * 
 * 
 * 
 * @author PC-06
 *
 */



public interface IMemberDao {
	/**
	 * MemberVO에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param memVo DB에 insert할 자료가 저장된 MemeberVO객체
	 * @return insert성공 : 1, insert 실패 : 0
	 */
	
	public int insertMember(MemberVO memVo);
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
	 * 
	 * @param id 삭제할 회원ID
	 * @return 삭제성공 : 1, 삭제실패 : 0
	 */
	
	public int deleteMember(String id);

	/**
	 * MemberVO 자료를 이용하여 회원정보를 수정하는 메서드
	 * 
	 * @param memVo update할 회원 정보가 저장된 MemberVO객체
	 * @return 수정성공 : 1, 수정실패 : 0
	 */
	
	public int updateMember(MemberVO memVo);	

	/**
	 * 전체 회원의 정보를 가져와서 List에 담아서 반환하는 메서드
	 * 
	 * 
	 * @return MemberVO객체가 저장된 List객체
	 * 
	 * 
	 */
	
	public List<MemberVO> getAllMember();
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원ID의 개수를 반환하는 메서드
	 * 
	 * @param id 검색할 회원ID
	 * @return 검색된 회원ID의 개수
	 */
	
	public int getMemberIdCount(String id);
	
	//public int updateMember2(String field, String data, String id); 
	//나쁘지않은 방법이지만 나중에 쓸 프로그램에서는 변수를 한개로 만들어주는것이 좋음.(Map이용)
	/**
	 * Map에 저장된 정보를 이용하여 원하는 항목을 수정하는 메서드
	 * 	==> key값 정보 : 회원ID(memid), 수정할 컬럼명(field), 수정할 데이터(data)
	 * 
	 * @param paraMap 회원ID,수정할 컬렴명, 수정할 데이터가 저장될 Map객체
	 * @return 수정성공 : 1, 수정실패 : 0
	 */
	public int updateMember2(Map<String, String> paraMap);
	
	
	


}
package kr.or.mvc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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

public class MemberDaoImpl implements IMemberDao{
	//1번
	private static MemberDaoImpl dao;
	
	//2번
	private MemberDaoImpl() {}
	
	//3번
	public static MemberDaoImpl getInstance() {
		if(dao==null) dao = new MemberDaoImpl();
		
		return dao;
	}

	@Override
	public int insertMember(MemberVO memVo) {
		Connection conn=null;
		PreparedStatement pstmt=null;
		int cnt=0; //반환값이 저장될 변수 선언
		
		try {
			//DB에 insert
			conn = DBUtil3.getConnection();
			
			String sql = "insert into mymember"
					+"(mem_id, mem_pass, mem_name, mem_tel, mem_addr)"
					+" values(?,?,?,?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memVo.getMem_id());
			pstmt.setString(2, memVo.getMem_pass());
			pstmt.setString(3, memVo.getMem_name());
			pstmt.setString(4, memVo.getMem_tel());
			pstmt.setString(5, memVo.getMem_addr());
			
			cnt = pstmt.executeUpdate();
			
			
		} catch (SQLException e) {
			cnt=0;
			e.printStackTrace();
		}finally {
			if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {};
			if(conn!=null)try {conn.close();}catch(SQLException e) {};
		}
		
		return cnt;
	}

	@Override
	public int deleteMember(String id) {
		Connection conn=null;
		PreparedStatement pstmt=null;
		
		int cnt=0; //반환값이 저장될 변수 선언
		
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "delete from mymember where mem_id=?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt=0;
			e.printStackTrace();
			
		}finally {
			if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {};
			if(conn!=null)try {conn.close();}catch(SQLException e) {};
			
		}
		return cnt;
	}

	@Override
	public int updateMember(MemberVO memVo) {
		Connection conn=null;
		PreparedStatement pstmt=null;
		
		int cnt=0; 
		
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "update mymember set "
					+" mem_pass = ? , mem_name = ? , mem_tel = ?, mem_addr = ? where mem_id = ?" ;
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memVo.getMem_pass());
			pstmt.setString(2, memVo.getMem_name());
			pstmt.setString(3, memVo.getMem_tel());
			pstmt.setString(4, memVo.getMem_addr());
			pstmt.setString(5, memVo.getMem_id());
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt=0;
			e.printStackTrace();
			
		}finally {
			if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {};
			if(conn!=null)try {conn.close();}catch(SQLException e) {};
			
		}
		return cnt;
	}

	@Override
	public List<MemberVO> getAllMember() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		List<MemberVO> memList = null; //반환값이 저장될 변수선언
		
		try {
			conn = DBUtil3.getConnection();
			String sql = "select * from mymember";
			stmt = conn.createStatement();
			rs=stmt.executeQuery(sql);
			
			memList = new ArrayList<MemberVO>(); //List객체 생성
			while(rs.next()) {//레코드 개수만큼 반복
				MemberVO memVo = new MemberVO(); //1개의 레코드가 저장될 변수 선언
				
				//VO객체에 DB에서 가져온 컬럼값들을 저장한다.
				memVo.setMem_id(rs.getString("mem_id"));
				memVo.setMem_pass(rs.getString("mem_pass"));
				memVo.setMem_name(rs.getString("mem_name"));
				memVo.setMem_tel(rs.getString("mem_tel"));
				memVo.setMem_addr(rs.getString("mem_addr"));
				
				memList.add(memVo); //1개의 레코드가 저장된 MemberVO객체를 List에 추가
			}
		} catch (SQLException e) {
			memList = null;
			e.printStackTrace();
		}finally {
		if(rs!=null)try {rs.close();}catch(SQLException e) {};
		if(stmt!=null)try {stmt.close();}catch(SQLException e) {};
		if(conn!=null)try {conn.close();}catch(SQLException e) {};
		}
		return memList;
	}
	@Override
	public int getMemberIdCount(String id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		int cnt=0;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql ="select count(*) cnt from mymember "
					+"where mem_id = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				cnt = rs.getInt("cnt");
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs!=null)try {rs.close();}catch(SQLException e) {};
			if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {};
			if(conn!=null)try {conn.close();}catch(SQLException e) {};
		}
		return cnt;
	
	}

	@Override
	public int updateMember2(Map<String, String> paraMap) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int cnt =0;
		
		
		//key값 정보 : 회원ID(memid), 수정할 컬럼명(field), 수정할 데이터(data)
		
		try {
			conn=DBUtil3.getConnection();
			
			
			//paraMap에 저장된 key값을 이용하여 쿼리문을 작성하고
			//쿼리문에 들어갈 데이터를 셋팅하는 작업진행
			String sql = "update mymember set "+paraMap.get("field")+ " =? where mem_id=? ";
			
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, paraMap.get("data"));
			pstmt.setString(2, paraMap.get("memid"));
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		}
		
		return cnt;
	}
	
	

}

5.Service프로젝트 및 interface, class만들기

-interface는 Dao에서 복사하기!

package kr.or.mvc.service;

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

import kr.or.mvc.vo.MemberVO;

/**
 * Service객체는 DAO에 만들어진 메서들르 원하는 작업에 맞게 호출하여 실행하고 그 결과를 받아오고, 
 * 받아온 결과를 Controller에게 보내주는 역할
 * 그래서 보통 DAO의 메서드 구조와 같게 만듦.(자바고급단계에서는...스프링, JSP등에서는 달라짐.)
 * 
 * 
 * 
 * 
 * @author PC-06
 *
 */

public interface IMemberService {
	
	/**
	 * MemberVO에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param memVo DB에 insert할 자료가 저장된 MemeberVO객체
	 * @return insert성공 : 1, insert 실패 : 0
	 */
	
	public int insertMember(MemberVO memVo);
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
	 * 
	 * @param id 삭제할 회원ID
	 * @return 삭제성공 : 1, 삭제실패 : 0
	 */
	
	public int deleteMember(String id);

	/**
	 * MemberVO 자료를 이용하여 회원정보를 수정하는 메서드
	 * 
	 * @param memVo update할 회원 정보가 저장된 MemberVO객체
	 * @return 수정성공 : 1, 수정실패 : 0
	 */
	
	public int updateMember(MemberVO memVo);	

	/**
	 * 전체 회원의 정보를 가져와서 List에 담아서 반환하는 메서드
	 * 
	 * 
	 * @return MemberVO객체가 저장된 List객체
	 * 
	 * 
	 */
	
	public List<MemberVO> getAllMember();
	
	/**
	 * 회원ID를 인수값으로 받아서 해당 회원ID의 개수를 반환하는 메서드
	 * 
	 * @param id 검색할 회원ID
	 * @return 검색된 회원ID의 개수
	 */
	
	public int getMemberIdCount(String id);

	//public int updateMember2(String field, String data, String id); 
	//나쁘지않은 방법이지만 나중에 쓸 프로그램에서는 변수를 한개로 만들어주는것이 좋음.(Map이용)
	/**
	 * Map에 저장된 정보를 이용하여 원하는 항목을 수정하는 메서드
	 * 	==> key값 정보 : 회원ID(memid), 수정할 컬럼명(field), 수정할 데이터(data)
	 * 
	 * @param paraMap 회원ID,수정할 컬렴명, 수정할 데이터가 저장될 Map객체
	 * @return 수정성공 : 1, 수정실패 : 0
	 */
	public int updateMember2(Map<String, String> paraMap);
	
	
	
	
}
package kr.or.mvc.service;

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

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

public class MemberServiceImpl implements IMemberService {
	private IMemberDao dao; // DAO객체가 저장될 변수 선언

	private static MemberServiceImpl service;   //1번
	   
	   
	   //생성자
	   //public MemberServiceImpl () {
	   private MemberServiceImpl () {            //2번
	      //dao = new MemberDaoImpl();   //DAO객체 생성
	      dao = MemberDaoImpl.getInstance();
	   }
	   
	   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 id) {
		return dao.deleteMember(id);
	}

	@Override
	public int updateMember(MemberVO memVo) {
		return dao.updateMember(memVo);
	}

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

	@Override
	public int getMemberIdCount(String id) {
		return dao.getMemberIdCount(id);
	}

	@Override
	public int updateMember2(Map<String, String> paraMap) {
		// TODO Auto-generated method stub
		return dao.updateMember2(paraMap);
	}

}

6.controller class만들기

package kr.or.mvc.controller;

import java.security.Provider.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

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

public class MemberController {

	
	   private IMemberService service; // Service객체가 저장될 변수 선언
	   
	   private Scanner sc =  new Scanner(System.in);
	   
	   
	   
	   
	   public MemberController() {
	   //service = new MemberServiceImpl();
		   service = MemberServiceImpl.getInstance();
	}


	   public static void main(String[] args) {
	      new MemberController().memberStart();

	   }
 
	private void memberStart() {
	      
	      
	      
	      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.println("회원ID>> ");
		String id = sc.next();
		
		int count = service.getMemberIdCount(id);
		
		if(count==0) {//없는 회원...
			System.out.println(id+"은(는) 없는 회원ID입니다.");
			System.out.println("수정 작업을 종료합니다.");
			return;
		}	
		int num;
		
		String field = null; //수정항목의 컬럼명이 저장
		String title = null;//수정항목을 입력 받을 때 사용할 메세지(항목명)
		
		do {
			System.out.println();
			System.out.println("수정할 항목을 선택하세요.");
			System.out.println("---------------------------------------");
			System.out.println("1. 비밀번호 2. 회원이름 3. 전화번호 4. 회원주소");
			System.out.println("---------------------------------------");
			System.out.println("수정할 항목 선택>> ");
			
			num=sc.nextInt();
			
			
			switch(num) {
			case 1: 
				field = "mem_pass"; title ="비밀번호";
				break;
			case 2: 
				field = "mem_name"; title ="회원이름";
				break;
			case 3: 
				field = "mem_tel"; title ="전화번호";
				break;
			case 4: 
				field = "mem_addr"; title ="회원주소";
				break;
			default :
				System.out.println("수정할 항목 번호를 잘못입력했습니다.");
				System.out.println("다시 선택해주세요.");
				break;
			}
			
		}while(num<1||num>4);
		
		System.out.println();
		
		sc.nextLine();//입력버퍼 비우기
		System.out.println("새로운"+title+">>");
		String data = sc.nextLine();
		
		//선택한 컬럼명과 수정할 데이터 그리고 회원ID를 Map에 추가한다.
		//key값 정보 : 회원ID(memid), 수정할 컬럼명(field), 수정할 데이터(data)
			Map<String, String> paraMap = new HashMap<String,String>();
			paraMap.put("memid", id);
			paraMap.put("field", field);
			paraMap.put("data", data);
			
			int cnt = service.updateMember2(paraMap);
			
			if(cnt>0) {
				System.out.println(" 수정 완료!!!");
			}else {
				System.out.println(" 수정 실패ㅜㅜ");
			}
		
	}
	
	private void  updateMember() {
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요.");
		
		System.out.println("회원ID>> ");
		String id = sc.next();
		
		int count = service.getMemberIdCount(id);
		
		if(count==0) {//없는 회원...
			System.out.println(id+"은(는) 없는 회원ID입니다.");
			System.out.println("수정 작업을 종료합니다.");
			return;
		}
		
		System.out.println();
		System.out.print("새로운 비밀번호>> ");
		String newPass = sc.next();
		
		System.out.print("새로운 회원이름>> ");
		String newName = sc.next();
		
		System.out.print("새로운 전화번호>> ");
		String newTel = sc.next();
		
		sc.nextLine();
		
		System.out.print("새로운 주소>> ");
		String newAddr = sc.nextLine();
		
		//입력한 자료를 VO객체에 담는다.
		MemberVO memVo = new MemberVO();
		memVo.setMem_id(id);
		memVo.setMem_pass(newPass);
		memVo.setMem_name(newName);
		memVo.setMem_tel(newTel);
		memVo.setMem_addr(newAddr);
		
		int cnt = service.updateMember(memVo);		
		if(cnt>0) {
			System.out.println(id+"회원 정보 수정 완료!!!");
		}else {
			System.out.println(id+"회원 정보 수정 실패ㅜㅜ");
		}
		
	}
	

	private void deleteMember() {
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요.");
		System.out.println("회원ID>> ");
		String id = sc.next();
		
		int cnt = service.deleteMember(id);
		
		if(cnt>0) {
			System.out.println(id+"회원 정보 삭제 성공!!!");
		}else {
			System.out.println(id+"회원은 없는 회원이거나 삭제에 실패하였습니다....ㅠㅠ");
		}
	}
	
	
	private void displayMember() {
		 
		List<MemberVO>memList= service.getAllMember();
		System.out.println();
	    System.out.println("-----------------------------------------------");
	    System.out.println(" ID   PASSWORD   이 름       전화번호        주  소");
	    System.out.println("-----------------------------------------------");
	    if(memList==null||memList.size()==0) {
	    	System.out.println("등록된 회원이 하나도 없습니다.");
	    }else {
	    	for(MemberVO memVo : memList) {
	    		String id = memVo.getMem_id();
	    		String pass = memVo.getMem_pass();
	    		String name = memVo.getMem_name();
	    		String tel = memVo.getMem_tel();
	    		String addr = memVo.getMem_addr();
	    		
	    		System.out.println(id+"\t"+pass+"\t"+name+"\t"+tel+"\t"+addr);
	    	}
	    }
	    System.out.println("-----------------------------------------------");
	    System.out.println("출력 끝...");
	     
	     
	}
	   
	   
	private void insertMember() {
	   System.out.println();
	   System.out.println("추가할 회원 정보를 입력하세요.");

	   int count = 0;
	   String memId = null;
	   
	   do {
	      System.out.print("회원ID >> ");
	      memId = sc.next();
	      
	      count = service.getMemberIdCount(memId);
	      
	      if(count>0) {
	         System.out.println(memId + "은(는) 이미 등록된 회원ID 입니다.");
	         System.out.println("다른 회원ID를 입력하세요.");
	         
	      }
	      
	   }while(count>0);
	   System.out.print("비밀번호 >> ");
	   String pass = sc.next();
	   
	   System.out.print("회원이름 >> ");
	   String name = sc.next();
	   
	   System.out.print("전화번호 >> ");
	   String tel = sc.next();
	   
	   sc.nextLine(); // 입력버퍼 비우기
	   System.out.print("회원주소 >> ");
	   String addr = sc.nextLine();
	   
	    // 입력한 데이터를 MemberVO객체에 저장한다.
	   MemberVO memVo = new MemberVO();
	   
	   memVo.setMem_id(memId);
	   memVo.setMem_pass(pass);
	   memVo.setMem_name(name);
	   memVo.setMem_tel(tel);
	   memVo.setMem_addr(addr);
	   
	   //Service의 insert메서드 호출
	   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 sc.nextInt();
	      
	      
	}

	}
728x90

'ddit > Java' 카테고리의 다른 글

Swing  (0) 2022.09.05
싱글톤패턴(Singleton)  (0) 2022.07.27
MVC패턴(model-view-controller)< VO,DAO,Service,Controller>  (0) 2022.07.26
Stack, Queue, Sort  (0) 2022.06.22
Collection Framework(Array List, Vector...), generic / 문제풀기  (0) 2022.06.22