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;
}
}