2020.11.18 고급자바 수업노트 ibatis

1) sqlMapConfig 데이터베이스와 연결 xml 파일 형식이다. 


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

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



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

<!-- ibatis 와 ojdbc 라이브러리를 가져왔잖아. ojdbc 는 자바에서도 데이터베이스 sql에 접근해서 사용하기 위한 라이브러리였어.  -->

<!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  파일의 내용을 읽어올 수 있도록 설정한다.  

dbinfo.properties 요거는 properties 파일형식 dbinfo 는 내가지정한 파일이름

        그 안에 데이터는 sql 이랑 연결할때 쓰는 user password driver, url 정보가 있음

        -->

<properties resource="dbinfo.properties"/>

<!--

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

반장오빠랑 했던것 namespace 와 id속성값이 두개가 동일한애들을 동시에 접속불가.

        1개만 같으면 가능 

        두개로 구분하는것 

-->

<settings useStatementNamespaces="true" />

<!-- 

쿼리문에서 사용할 VO객체는 패키지 이름을 포함한 전체 이름을 사용해야 하는데  ( LprodVO 에 모든 행의 정보가 저장되는데, 그것을 불러오려면 패키지명, 클래스명까지 다 써야해서 

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

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

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

-->

  <typeAlias alias="lprodVo" type="kr.or.ddit.basic.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 문서로 따로 작성한 후(여기서는 lprodTest) 그 xml 문서를 아래와 같이 등록하면 된다. 

형식) <sqlMap resource="경로명/파일명.xml"/>

-->

<sqlMap resource="kr/or/ddit/basic/lprodTest.xml"/> 

</sqlMapConfig>



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

}

}




3) xml 파일 형식이고 여기에 sql문장을 작성해 놓는다.  lprodTest . 
여기에 namespace 와 id 가 존재한다. 


<?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 클래스, 자바의 자료형이름 등이 사용된다.  ) 
(VO 클래스 등을 기술할 때 해당 클래스의 전체이름( 패키지명까지 포함된 이름 ) 을 기술해야 한다.  
-->



<!-- 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>


</sqlMap>




4) 실제로 실행되는 main 부분 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.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("---------------------------------------------");
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e ) {
e.printStackTrace();
}
 
 
}

}

댓글