Ibatis : 2020.11.19 고급자바 수업노트 1) ibatis 기본 with : lprod 테이블

res 영역 : dbinfo.properties : 데이터베이스 연결 정보를 저장해 놓는다. 

--------------------------------------------------------------------------------------------------------


# properties 파일을 작성하는 방법은

# key값=value값 과 같은 모양으로 만듭니다. 

driver=oracle.jdbc.driver.OracleDriver


url=jdbc:oracle:thin:@localhost:1521:xe

user=Aurora

pass=java

 


-------------------------------------------------------------------------------------------------------

res 영역 :  sqlMapConfig.xml  환경설정 해놓는 부분이다. 


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

<!-- 이 문서는 ibatis 의 환경 설정용 xml 문서 입니다. -->



<!-- pc 가 문서설정해줌 ibatis 라이브러리에 설정을 가져옴   -->

<!DOCTYPE sqlMapConfig 

PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"http://ibatis.apache.org/dtd/sl-map-config-2.dtd">


<!-- 환경설정  -->

<sqlMapConfig>

<!--

DB와 연결하는 정보를 properties 파일에 설정해 놓고 

이 properties  파일의 내용을 읽어올 수 있도록 설정한다.  

-->

<properties resource="dbinfo.properties"/>

<!--

각각의 sqlMap 파일의 namespace와 아이디 속성값을 연결해서 실행할 쿼리문을 선택한다. 

-->

<settings useStatementNamespaces="true" />

<!-- 

쿼리문에서 사용할 VO객체는 패키지 이름을 포함한 전체 이름을 사용해야 하는데 

그렇게 되면 문장이 너무 길어질 수 있다. 

그래서 전체 이름 대신 사용할 alias 를 설정할 수 있다. 

형식 : <typeAlias alias = "alias명" type="클래스의 전체이름" /> 

-->

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

<typeAlias alias="memVo" type="kr.or.ddit.member.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/basic/lprodTest.xml"/> 

<sqlMap resource="kr/or/ddit/member/ibatis/mymember.xml"/> 

</sqlMapConfig>



-----------------------------------------------------------------------------------------------------

src 영역 ~ LprodIbatisTest


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;


public class LprodIbatisTest {


//iBatis 를 이용하여 DB 자료를 처리하는 순서 및 방법 

public static void main(String[] args) {

Scanner scan = new Scanner(System.in); 


//1. iBatis의 환경 설정 파일(sqlMapConfig.xml) 을 읽어와서 실행한다. 

 

try {

// 1-1 . 문자 인코딩 케릭터셋 설정하기 

Charset charset = Charset.forName("UTF-8");

Resources.setCharset(charset);

 

// 1-2 환경 설정 파일을 읽어온다. 

Reader rd = Resources.getResourceAsReader("sqlMapConfig.xml");

 

// 1-3 위에서 읽어온 Reader 객체를 이용하여 실제 환경설정을 완성한 후 

// SQL 문을 호출해서 실행할 수 있는 객체를 생성한다. 

SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

rd.close(); // Reader 객체 닫기

// 환경설정 끝 

//-----------------------------------------------------

//2. 실행할 SQL 문에 맞는 쿼리문을 호출해서 원하는 작업을 수행한다.

/* //2-1 . insert 연습

System.out.println("insert 작업 시작....");

System.out.println("lprod_id 입력 : ");

int lprodId = scan.nextInt(); 

System.out.println("lprod_gu 입력 : ");

String lprodGu = scan.next(); 

System.out.println("lprod_nm 입력 : ");

String lprodNm = scan.next(); 

//insert 할 데이터들을 VO 객체에 담는다. 

LprodVO lprodVo = new LprodVO() ; 

lprodVo.setLprod_id(lprodId);

lprodVo.setLprod_gu(lprodGu);

lprodVo.setLprod_nm(lprodNm);

//2) sqlMapClient 객체변수를 이용해서 처리할 쿼리문을 호출하여 실행한다. 

// 형식 ) sqlMapClient 객체변수. insert("namespace값.id속성값" , 파라미터클래스 ) 

// 반환값 : insert 성공이면 : null insert 실패면 : 오류객체가 반환 

//----------------------------------------------------------------------------------

Object obj = smc.insert("lprod.insertLprod", lprodVo); 

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(); 

LprodVO lprodVo2 = new LprodVO(); 

lprodVo2.setLprod_gu(lprodGu);

lprodVo2.setLprod_id(lprodId);

lprodVo2.setLprod_nm(lprodNm);

// 2) sqlMapClient 객체변수.update("namespace값.id속성값", 파라미터클래스); 

// ==> 반환값 : 작업에 성공한 레코드 수 

int cnt = smc.update("lprod.updateLprod",lprodVo2 );

if(cnt > 0) {

System.out.println("update 작업 성공.. ");

}else {

System.out.println("update 작업 실패 ");

}

System.out.println("---------------------------------------------");

*/

 

/* //2-3. delete 연습

System.out.println("delete 작업 시작...");

System.out.println("삭제할 Lprod_gu 입력 : ");

String lprodGu = scan.next(); 

// 1) sqlClient객체변수.delete("namespace값.id속성값" , 파라미터클래스 ) 

// 반환값 : 작업에 성공한 레코드 수 

int cnt2 = smc.delete("lprod.deleteLprod", lprodGu); 

if(cnt2 > 0) {

System.out.println("update 작업 성공.. ");

}else {

System.out.println("update 작업 실패 ");

}

System.out.println("---------------------------------------------");

*/

//2-4 select 연습 

// 1) 응답 결과가 여러개의 레코드인 경우 

//   ==> 응답 결과가 여러개일 경우에는 queryForList()메서드를 사용하는데 

//    이 메서드는 여러개의 레코드 각각을 VO 객체에 담은 후 이 VO 객체를 List 에 추가해서 

//   추가하는 작업을 자동으로 수행한다. 

// 형식 ) sqlMapClient객체변수.queryForList("namespace값.id속성값" , 파라미터클래스 ) 

// ==> SQL 문에 전달할 데이터가 없으면 '파라미터클래스'값을 생략할 수 있다. 

//           -> select * from lpro 같이 파라미터가 필요없는애들

System.out.println("1) select 연습(결과가 여러개일 경우....");

List<LprodVO> lprodList = smc.queryForList("lprod.getAllLprod"); 

for(LprodVO lpVo : lprodList) {

System.out.println("ID : " + lpVo.getLprod_id());

System.out.println("GU : " + lpVo.getLprod_gu());

System.out.println("NM : " + lpVo.getLprod_nm());

}

System.out.println("출력작업 끝");

//2) 응답 결과가 1개일 경우

// ==> 응답 결과가 1개일 경우에는 queryForObject() 메서드를 사용한다. 

// 형식 ) sqlMapClient객체변수.queryForObject("namespace값.id속성값" , 파라미터클래스 ) 

System.out.println("2) select 연습 시작 ( 결과가 1개일 경우)....");

System.out.println("검색할 lprod_gu 입력 : ");

String lprodGu = scan.next(); 

LprodVO lprodVo = 

(LprodVO) smc.queryForObject("lprod.getLprod" , lprodGu); 

if(lprodVo == null) { //검색한 결과가 하나도 없으면 null 을 반환한다. 

System.out.println("검색한 데이터가 하나도 없습니다.");

}else {

System.out.println("ID : " + lprodVo.getLprod_id());

System.out.println("GU : " + lprodVo.getLprod_gu());

System.out.println("NM : " + lprodVo.getLprod_nm());

System.out.println("출력끝");

}

} catch (IOException e) {

e.printStackTrace();

} catch (SQLException e ) {

e.printStackTrace();

}

 

 

}


}


---------------------------------------------------------------------------------------------------

LprodVO 


package kr.or.ddit.basic;


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 version="1.0" encoding="UTF-8"?>

<!-- 

이 xml 문서는 ibatis에서 실행할 SQL 문을 작성하는 문서입니다. -->

<!DOCTYPE sqlMap

PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"

"http://ibatis.apache.org/dtd/dtd-map-2.dtd">



<sqlMap namespace="lprod">

<!-- 

이 부분에 ibatis 에서 실행할 SQL 문에 맞는 태그를 사용하여 SQL문을 작성한다. 

사용할 수 있는 기본적인 태그들

<select> ~~ </select>

<insert> ~~ </insert>

<update> ~~ </update>

<delete> ~~ </delete> 

~~~~~

-->

<!-- 

id 속성 ==> Java 프로그램에서 실행할 쿼리문을 호출할 때 사용되는 이름

<sqlMap>태그의 namespace 속성값과 연결해서 사용한다. 

(예 : lprod.insertLprod) 

-> sqlMapConfig 에서 <settings useStatementNamespaces="true" /> 를

주었다는 것은 여기서  <sqlMap namespace="lprod"> namespace 랑 id="insertLprod" id를 연결해서 구분해서 사용해라 (다른것과 구분)

parameterClass 속성 => SQL문에 사용될 데이터가 들어있는 객체를 기술한다. 

(보통 VO 클래스, 자바의 자료형이름 등이 사용된다.(String , int 등   ) 

(VO 클래스 등을 기술할 때 해당 클래스의 전체이름( 패키지명까지 포함된 이름 ) 을 기술해야 한다.  만약 sqlMapConfig 에 Allias 를 별칭을 지정해주면

별칭을 대신 사용할 수도 있다.  

-->




<!-- parameterClass 에서는 vo객체에서 패키지이름이랑 클래스이름 가져와서 써준다. -->

<!-- <insert id="insertLprod" parameterClass="kr.or.ddit.basic.LprodVO"> -->

<insert id="insertLprod" parameterClass="lprodVo"> <!-- allias 로지정하기  -->

insert into lprod (lprod_id, lprod_gu , lprod_nm ) 

values(#lprod_id#, #lprod_gu# , #lprod_nm#) 

</insert>

<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 = #asdadasdsad#


<!-- 이렇게 변수에 아무렇게나 써도 작동이 된다. -->

<!-- 만약 변수명에 key값을 한다면, #키값쓰면된다.# -->

</delete>

<!-- 

resultClass 속성 ==> select 문을 처리한 결과를 저장할 VO클래스나 자바 자료형이름을 지정한다. 

select 한 결과가 여러개이면 자동으로 List 에 담아준다.

그래서 결과가 여러개일 경우에도 resultClass 속성에 지정하는 것은 

1개의 레코드가 저장될 클래스나 자료형이름을 지정하면 된다. 

-->

<select id="getAllLprod" resultClass="lprodVo" >

select * from lprod

</select>

<select id="getLprod" parameterClass="String" resultClass="lprodVo">

select * from lprod where lprod_gu = #lprod_gu#

</select>



</sqlMap>



댓글