iBatis : LprodVO / LprodTest.xml / LprodIbatisTest

조수경·2021년 11월 26일
0

고급자바

목록 보기
79/97

iBatis란?

  • Java에서 DB를 편하게 핸들링 할 수 있게 해주는 프레임워크이다.

  • SQL문과 Java코드를 분리하고, 파라미터값만 변경되지 않으면,
    Java소스 변경없이 SQL문만 변경해서 사용할 수 있다.

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

LprodVO

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

LprodTest.xml

<?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클래스등을 기술할 때는 항상 클래스의 전체 이름을 사용하거나 
         <typeAlais>에서 설정한 alias명을 사용한다.)
   -->
  
  
  <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>
  
  
  <!-- 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">
     <!-- delete from lprod where lprod_gu=#lprod_gu# -->
     delete from lprod where lprod_gu=#RRR#
           <!-- 변수를 하나만 받아올때 ##안에 아무거나 넣어도됨 -->
   </delete>
   
   <!-- 
       resultClass ==> select문이 처리한 결과를 저장할 VO클래스나 Map클래스
                                              또는 Java의 기본자료형 이름을 지정한다.
                       select한 결과가 여러개이면 자동으로 List에 담아준다.
                                              그래서 결과가 여러개 일 경우에도 resultClass에 지정하는 것은
                       1개의 레코드가 저장될 클래스나 자료형이름을 지정하면 된다.
    -->
 
   <select id="getAllLprod" resultClass="lprodVo">
      select * from lprod
   </select>
 
   <select id = "getLprod" resultClass="lprodVo" parameterClass="String">
      select * from lprod where lprod_gu = #lprod_gu#
   </select>
 
 </sqlMap> 
  

LprodIbatisTest

package kr.or.ddit.basic;

import java.util.List;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.sql.SQLException;
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. iBatis의 환경 설정 파일을 읽어와 실행한다.
        //    (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.println("Lprod_gu 입력 >>"); 
			  String lprodGu = scan.next();
			  
			  System.out.println("Lprod_nm 입력 >>"); 
			  String lprodNm = scan.next();
			  
			  // 1) 입력한 값들을 VO객체에 담는다. 
			  LprodVO lvo1 = new LprodVO();
			  lvo1.setLprod_id(lprodId); 
			  lvo1.setLprod_gu(lprodGu);
			  lvo1.setLprod_nm(lprodNm);
			   
					  
			  //2. SqlMapClient 객체번수(smc)를 이용해서 처리할 쿼리문을 
			  // 호출해서 실행한다.
			   // 형식)
			  //smc.insert("namespace속성값.id속성값", 파라미터클래스); 
			  // 반환값 : insert성공 : null, insert실패
			  //: 오류객체
			  
			  Object obj = smc.insert("lprod.insertLprod", lvo1);
			   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();
        	
        	//수정할 데이터를 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("실패 ㅠㅠ ");
        	}
        	
        	*/
        	
        	//---------------------------------------------------
        	/*
        	// 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");
        	
        	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("-----------------------------------------------");
        	}
        	*/
        	// 2) 응답 결과가 1개일 경우
        	// 응답 결과가 1개가 확실할 경우에는 qureyForObject()메서드를 사용한다.
        	// 형식) smc.queryForObject("namespace속성값.id속성값", 파라미터클래스);
        	System.out.println("select 연습(결과가 1개의 레코드일 경우...)");
        	
        	System.out.println("검색할 Lprod_gu >>");
        	String lprodGu1 = scan.next();
        	
        	LprodVO lvo4 = (LprodVO)smc.queryForObject("lprod.getLprod", lprodGu1);
        
        	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();
		}
		
	}

}

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">
  
  <!-- 이 문서는 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클래스등을 기술할 때는 항상 클래스의 전체 이름을 사용하거나 
         <typeAlais>에서 설정한 alias명을 사용한다.)
   -->
  
  
  <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>
  
  
  <!-- 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">
     <!-- delete from lprod where lprod_gu=#lprod_gu# -->
     delete from lprod where lprod_gu=#RRR#
           <!-- 변수를 하나만 받아올때 ##안에 아무거나 넣어도됨 -->
   </delete>
   
   <!-- 
       resultClass ==> select문이 처리한 결과를 저장할 VO클래스나 Map클래스
                                              또는 Java의 기본자료형 이름을 지정한다.
                       select한 결과가 여러개이면 자동으로 List에 담아준다.
                                              그래서 결과가 여러개 일 경우에도 resultClass에 지정하는 것은
                       1개의 레코드가 저장될 클래스나 자료형이름을 지정하면 된다.
    -->
 
   <select id="getAllLprod" resultClass="lprodVo">
      select * from lprod
   </select>
 
   <select id = "getLprod" resultClass="lprodVo" parameterClass="String">
      select * from lprod where lprod_gu = #lprod_gu#
   </select>
 
 </sqlMap> 
  

res - properties

# 이 줄은 주석 처리 줄 입니다.
# 이 properties문서를 작성하는 방법
# key값 = value값 과 같이 작성한다.

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

Config-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/dtd/sql-map-config-2.dtd">
   
 <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/lprodTest.xml"/> -->
     <sqlMap resource="kr/or/ddit/ibatis/mapper/NewFile2.xml"/>
  	
  
 </sqlMapConfig>
 
 
 
profile
신입 개발자 입니다!!!

0개의 댓글

관련 채용 정보