고급JAVA 22강 - iBatis

Whatever·2021년 11월 26일
0

고급 JAVA

목록 보기
22/32

새로운 환경설정

CMD창 열어서
java -version
javac -version

이클립스 환경설정

iBatis란?

  • Java에서 DB를 편하게 핸들링할 수 있게 해주는 프레임워크이다.
  • SQL문과 Java코드를 분리하고, 파라미터값만 변경되지 않으면 ,
    Java소스 변경없이 SQL문만 변경해서 사용할 수 있다.
  • iBatis 데이터 매퍼 API를 이용해서 자바빈즈(보통 VO객체) 혹은 Map객체를
    PreparedStatement의 파라미터에 매핑해주고, SQL문의 실행 결과를
    자바빈즈 혹은 Map객체에 자동으로 매핑해준다.

쿼리문을 따로 xml문서로 관리하는 것
VO객체를 따로 만들지 않아도 자동으로 처리해줌

키 값에 ${키값}

#컬럼명# 과같이 기술

typeAlias는 .으로 구분
sqlMap은 /으로 구분

1. XML파일 만들기 - 이름 sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
	PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
	"http://ibatis.apache.org/did/sql-map-config-2.did">
	
<sqlMapConfig>
	<!-- 
		DB와 연결하는 정보를 properties파일에 설정해 놓고
		이 properties파일의 내용을 읽어올 수 있도록 설정한다.
	 -->
	 <properties resource="kr/or/ddit/config/dbinfo.properties"/>
	 
	 <!-- 
	 	SQL문이 저장된 xml문서에서 실행할 쿼리문을 찾을 때 이 xml문서의 
	 	네임스페이스와 SQL문이 작성된 태그의 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.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/jdbcTest.xml"/>
	    
	    
	   

</sqlMapConfig>	
	

2. LprodVO 클래스 생성(테이블에 해당하는 데이터 VO클래스 생성)

package kr.or.ddit.vo;

public class LprodVO {
	private int lprod_id;
	private String lprod_gu;
	private String 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;
	}
		
}

3. XML파일에 SQL문 등록

<?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">
	
<!-- 이 문서는 ibatis에서 처리할 SQL문을 작성하는 문서입니다. -->
<sqlMap namespace="lprod">
	<!-- 
		이 부분에는 처리할 SQL문에 맞는 태그를 사용하여 SQL문을 작성한다.
		
		사용할 수 있는 기본태그들...
		<select> 처리할 SQL문 </select>
		<insert> 처리할 SQL문 </insert>
		<delete> 처리할 SQL문 </delete>
		<update> 처리할 SQL문 </update>
		...
	 -->
	 
	 <!-- 
	 	id 속성 : 실행할 태그를 Java소스에서 호출할 때 사용되는 이름으로 
	 		<sqlMap>태그의 namespace속성값과 연결해서 사용한다.
	 	(예 : "lprod.insertLprod")
	 	
	 	parameterClass속성 : SQL문 사용할 데이터가 저장된 객체를 설정한다.
	 		(보통 VO클래스, Java의 기본자료형이름, Map객체 등이 사용된다.)
	 		(VO클래스등을 기술할 때는 항상 클래스의 전체 이름을 사용하거나 
	 		 <typeAlias>에서 설정한 alias명을 사용한다.)	
	  -->
	 <insert id="insertLprod" parameterClass="kr.or.ddit.vo.LprodVO">
	 	insert into lprod(lprod_id, lprod_gu, lprod_nm)
	 	values (#lprod_id#, #lprod_gu#, #lprod_nm#)
	 </insert>
	<!-- parameterClass에 typeAlias에서 설정한 alias명을 사용할 수 있다. -->
	<update id="updateLprod" parameterClass="lprodVO">
		update lprod set lprod_id=#lprod_id#, lprod_nm=#lprod_nm#
		where lprod_gu = #lprod_gu#
	
	</update>	
	
	<!-- 
		parameterClass에 설정되는 값이 단일값이면 SQL문에 이 값을 나타내는 
		변수 이름은 사용자 임의로 지정할 수 있다.
	 -->
	<delete id="deleteLprod" parameterClass="string"> <!-- String 타입 한 개라서 VO객체에 담을 필요 없음 -->
<!-- 		delete from lprod where lprod_gu=#lprod_gu# -->
		delete from lprod where lprod_gu=#ssss#
	</delete>
	
	<!-- 
		resultClass ==> select문이 처리한 결과를 저장할 VO클래스나 Map클래스
			또는 Java의 기본자료형 이름을 지정한다.
			select한 결과가 여러개이면 자동으로 List에 담아준다.
			그래서 결과가 여러개일 경우에도 resultClass에 지정하는 것은 
			1개의 레코드가 저장될 클래스나 자료형이름을 지정하면 된다.
	 -->
	<select id="getAllLprod" resultClass="lprodVO">
		select * from lprod
	</select>
	<!-- select문은 반드시 resultClass가 필요, 조건이 있을 때는 parameterClass가 있어야 함 -->
	
	<select id="getLprod" resultClass="lprodVO" parameterClass="string">
		select * from lprod where lprod_gu = #lprod_gu#
	</select>
	
	
</sqlMap>	

4. 실행

package kr.or.ddit.basic;

import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner;

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

import kr.or.ddit.vo.LprodVO;

public class LprodIbatisTest {

	// iBatis를 이용하여 DB자료를 처리하는 순서 및 방법
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		SqlMapClient smc = null; //iBatis 실행용 객체변수 선언
		
		//1. iBtis의 환경 설정 파일을 읽어와 실행한다.
		//	 (sqlMapConfig.xml)
		try {
			// 1-1 문자 인코딩 캐릭터셋 설정
			Charset charset = Charset.forName("utf-8");
			Resources.setCharset(charset);
			
			// 1-2 환경 설정 파일(sqlMapConfig.xml)을 읽어온다.
			Reader rd = Resources.getResourceAsReader("kr/or/ddit/config/sqlMapConfig.xml");
			
			// 1-3 위에서 읽어온 Reader객체를 이용하여 실제 환경설정을 완성한 후 
			//	   SQL문을 호출해서 실행할 객체를 생성한다.
			smc = SqlMapClientBuilder.buildSqlMapClient(rd);
			
			rd.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		//-------------------------------------------------------
		
		
		// 2. 실행할 SQL문에 맞는 쿼리문을 호출해서 원하는 작업 수행하기
		try {
			/*
			// 2-1. insert연습
			System.out.println("insert작업 시작...");
			System.out.print("Lprod_id 입력 >> ");
			int lprodId = scan.nextInt();
			
			System.out.print("Lprod_gu 입력 >> ");
			String lprodGu = scan.next();
			
			System.out.print("Lprod_nm 입력 >> ");
			String lprodNm = scan.next();
			
			// 1) 입력한 값들을 VO객체에 담는다.
			LprodVO lvol = new LprodVO();
			lvol.setLprod_id(lprodId);
			lvol.setLprod_gu(lprodGu);
			lvol.setLprod_nm(lprodNm);
			
			// 2) SqlMapClient 객체변수(smc)를 이용해서 처리할 쿼리문을 호출해서 실행한다.
			// 	  (형식 : smc.insert("namespace속성값.id속성값", 파라미터클래스))
			//			 반환값 : insert성공 : null, insert실패 : 오류객체
			Object obj = smc.insert("lprod.insertLprod", lvol); //smc.insert(SQL문이 저장되어있는 이름, insert할 데이터)
			if(obj == null) {
				System.out.println("insert 작업 성공!!!");
			}else {
				System.out.println("insert 작업 실패~~~");
			}
			
			*/
		
			/*
			//-------------------------------------------------------- 
			// 2-2 update 연습
			System.out.println("update 연습...");
			System.out.println("수정할 Lprod_gu 입력 >>");
			String lprodGu = scan.next();
			
			System.out.println("새로운 Lprod_id 입력 >>");
			int lprodId = scan.nextInt();
			
			System.out.println("새로운 Lprod_nm 입력 >>");
			String lprodNm = scan.next();
			
			// 1) 수정할 데이터를 VO에 담는다.
			LprodVO lvo2 = new LprodVO();
			lvo2.setLprod_id(lprodId);
			lvo2.setLprod_gu(lprodGu);
			lvo2.setLprod_nm(lprodNm);
			
			// 2) smc.update("namespace속성값.id속성값", 파라미터 클래스);
			//		==> 반환값 : 작업에 성공한 레코드 수
			int cnt = smc.update("lprod.updateLprod", lvo2);
			
			if(cnt>0) {
				System.out.println("update작업 성공!!!");
			}else {
				System.out.println("update작업 실패!!!");
			}
			*/
			
			/*
			//---------------------------------------------------------
			// 2-3 delete 연습
			System.out.println("delete 작업 시작...");
			System.out.println("삭제할 lprod_gu 입력 >> ");
			String lprodGu = scan.next();
			
			// 1) smc.delete("namespace속성값.id속성값", 파라미터 클래스)
			//		==> 반환값 : 작업에 성공한 레코드 수
			
			int cnt2 = smc.delete("lprod.deleteLprod", lprodGu);
			
			if(cnt2>0) {
				System.out.println("delete작업 성공!!!");
			}else {
				System.out.println("delete작업 실패~~~");
				
			}
			 */
			
			//----------------------------------------------
			// 2-4 select 작업
			/*
			// 1) select의 응답 결과가 여러개의 레코드일 경우
			System.out.println("select 작업 시작 (결과가 여러개일 경우...)");
			
			// 응답의 결과가 여러개일 경우에는 queryForList()메서드를 사용하는데 
			// 이 메서드는 여러개의 레코드 각각을 VO에 담은 후 이 VO데이터를 List에 추가해주는 작업을 자동으로 수행한다.
			// 형식) smc.queryForList("namespace속성값.id속성값", 파라미터클래스);
			List<LprodVO> lprodList = smc.queryForList("lprod.getAllLprod"); 
                        //getAllLprod는 파라미터클래스가 없어서 안써도 됨
			
			for(LprodVO lvo3 : lprodList) {
				System.out.println("ID : " + lvo3.getLprod_id());
				System.out.println("GU : " + lvo3.getLprod_gu());
				System.out.println("NM : " + lvo3.getLprod_nm());
				System.out.println("----------------------------");
			}
			System.out.println("출력 끝...");
			*/
			
			// 2) 응답 결과가 1개일 경우
			//	   응답 결과가 1개가 확실할 경우에는 queryForObject()메서드를 사용한다.
			// 형식) smc.queryForObject("namespace속성값.id속성값", 파라미터클래스);
			System.out.println("select 연습 (결과가 1개의 레코드일 경우...)");
			
			System.out.print("검색할 Lprod_gu >> ");
			String lprodGu = scan.next();
			
			LprodVO lvo4 = (LprodVO) smc.queryForObject("lprod.getLprod",lprodGu);
			
			System.out.println("검색 결과");
			System.out.println("ID : " + lvo4.getLprod_id());
			System.out.println("GU : " + lvo4.getLprod_gu());
			System.out.println("NM : " + lvo4.getLprod_nm());
			System.out.println("----------------------------");
			
			
			} catch (SQLException e) {
				e.printStackTrace();
			}
		
		
		//숙제 : jdbcTest05.java 파일의 문제를 iBatis로 처리하는 것으로 변경하기
		
		
	}

}

0개의 댓글