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>