iBatis(2.0) 설치 및 초기 세팅
by 무작정 개발2022.03.08(52일 차)
기존까지는 JDBC로 게시판을 제작해서 DB를 연동했지만 오늘은 iBatis를 사용해서 DB를 연결해서 게시판을 만들 예정
기존까지는 JDBC로 DB를 연결해서 게시판을 만들었다. 하지만 오늘은 iBatis를 사용해서 DB를 연결해서 게시판을 만들 것이다.
오늘의 수업 내용
iBatis란?
iBatis는 기존까지 사용한 DAO의 JDBC 형태를 보완하기 위해 나온 프레임워크(FrameWork)이다. DB와 Java를
연결해주는 역할을 한다.
iBatis에서 버전이 업그레이 된 것이 MyBatis이고, 나중에 다뤄볼 예정이다.
iBatis(2.0) 설치 및 초기 세팅
(1) - iBatis(2.0) 설치하기
http://www.java2s.com/Code/Jar/i/Downloadibatis234726jar.htm
Download ibatis-2.3.4.726.jar : ibatis « i « Jar File Download
www.java2s.com
위의 링크로 가서 iBatis-2.3.4.726버전을 설치한다.
(2) - lib 추가하기

설치한 압축파일을 더블클릭하면 위의 화면이 보일 것이다. 저기서 ibatis-2.3.4.726.jar를 이클립스 lib에 드래그해서
옮긴다!

여기까지 하면 iBatis 설치는 끝난다. 이제 초기 세팅을 시작할 것이다.
(3) - 패키지(Package) 생성

위의 사진처럼 2개의 패키지를 만들고, 각 패키지에 2개, 3개의 파일을 생성해서 총 5개의 파일을 생성할 것이다.
(4) - com.util.dao 패키지 안에 2개의 파일 생성
CommonDAO 인터페이스 생성
- iBatis에만 존재하고, sql문이 실행되는 모든 경우의 수를 반영해서 생성해둔 것이다.
package com.util.dao;
import java.util.List;
import java.util.Map;
//ibatis
public interface CommonDAO {
//데이터 추가 - id랑 value 이름은 자율이지만 String, Object는 필수로 써야함
public void insertData(String id, Object value);
//데이터 수정 -2가지 방법
public int updateData(String id, Object value);
public int updateData(String id, Map<String, Object> map);
//데이터 삭제
// - 데이터를 삭제하는 경우의 수 3 가지
public int deleteData(String id, Object value);
public int deleteData(String id, Map<String, Object> map);
public int deleteAllData(String id); //위의 2가지는 거의안쓰고 여기만 씀
//레코드 가져오기 - 데이터를 주고받을때는 Object
public Object getReadData(String id); //- 1개의 데이터를 가져온다.(ex최대값,나이 등)
public Object getReadData(String id, Object value);
public Object getReadData(String id, Map<String, Object> map);
//하나의 데이터 가져오기
public int getIntValue(String id);
public int getIntValue(String id, Object value);
public int getIntValue(String id, Map<String, Object> map);
//여러 개의 데이터 가져오기
public List<Object> getListData(String id);
public List<Object> getListData(String id, Object value);
public List<Object> getListData(String id, Map<String, Object> map);
}
CommonDAOImpl.java 클래스 생성
- 위에서 만든 인터페이스를 상속받는다.
- 인터페이스를 구현한 클래스
- insert, update, delete의 경우 commit을 작성해줘야 한다!
package com.util.dao;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.util.sqlMap.SqlMapConfig;
//인터페이스를 구현한 클래스
public class CommonDAOImpl implements CommonDAO {
private SqlMapClient sqlMap;
public CommonDAOImpl() {
//클래스 메서드라서 클래스.메서드 로 호출
this.sqlMap = SqlMapConfig.getSqlMapInstance();
}
//CommonDAOImpl를 사용할려면 객체생성을 해야 함
public static CommonDAO getInstance() {
//자기자신의 객체를 반환해준다.
//객체를 생성해주면 sqlMap을 사용할수 있음
return new CommonDAOImpl();
}
@Override
public void insertData(String id, Object value) {
try {
//insert,update,delete는 시작할때 자동적으로 트랜잭션이 시작된다.
//여기서는 수동으로 시작해줌
sqlMap.startTransaction();
sqlMap.insert(id, value);
sqlMap.commitTransaction(); //커밋을 해줌
} catch (SQLException e) {
System.out.println(e.toString());
} finally { //finally는 무조건 실행된다.
//try-catch문을 더써줘야함. transaction을 닫을 때는
try {
sqlMap.endTransaction();//수동으로 트랜잭션을 끝내줘야한다.안하면 rock이 걸림
} catch (Exception e2) {
}
}
}
@Override
public int updateData(String id, Object value) {
int result = 0;
try {
sqlMap.startTransaction();
result = sqlMap.update(id, value);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
//try-catch문을 더써줘야함. transaction을 닫을 때는
try {
sqlMap.endTransaction();
} catch (Exception e2) {
}
}
return result;
}
@Override
public int updateData(String id, Map<String, Object> map) {
int result = 0;
try {
sqlMap.startTransaction();
result = sqlMap.update(id, map);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
//try-catch문을 더써줘야함. transaction을 닫을 때는
try {
sqlMap.endTransaction();
} catch (Exception e2) {
}
}
return result;
}
@Override
public int deleteData(String id, Object value) {
int result = 0;
try {
sqlMap.startTransaction();
result = sqlMap.delete(id, value);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
//try-catch문을 더써줘야함. transaction을 닫을 때는
try {
sqlMap.endTransaction();
} catch (Exception e2) {
}
}
return result;
}
@Override
public int deleteData(String id, Map<String, Object> map) {
int result = 0;
try {
sqlMap.startTransaction();
result = sqlMap.delete(id, map);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
//try-catch문을 더써줘야함. transaction을 닫을 때는
try {
sqlMap.endTransaction();
} catch (Exception e2) {
}
}
return result;
}
@Override
public int deleteAllData(String id) {
int result = 0;
try {
sqlMap.startTransaction();
result = sqlMap.delete(id); //이게 실제 삭제하는 명령어
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
//try-catch문을 더써줘야함. transaction을 닫을 때는
try {
sqlMap.endTransaction();
} catch (Exception e2) {
}
}
return result;
}
@Override
public Object getReadData(String id) {
//애는 트랜잭션 시작이 안된다
try {
return sqlMap.queryForObject(id);
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
@Override
public Object getReadData(String id, Object value) {
try {
return sqlMap.queryForObject(id, value);
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
@Override
public Object getReadData(String id, Map<String, Object> map) {
try {
return sqlMap.queryForObject(id, map);
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
@Override
public int getIntValue(String id) {
try {
//int값으로 형변환해서 반환
return ((Integer)sqlMap.queryForObject(id)).intValue();
} catch (Exception e) {
System.out.println(e.toString());
}
return 0;
}
@Override
public int getIntValue(String id, Object value) {
try {
//int값으로 형변환해서 반환
return ((Integer)sqlMap.queryForObject(id, value)).intValue();
} catch (Exception e) {
System.out.println(e.toString());
}
return 0;
}
@Override
public int getIntValue(String id, Map<String, Object> map) {
try {
//int값으로 형변환해서 반환
return ((Integer)sqlMap.queryForObject(id, map)).intValue();
} catch (Exception e) {
System.out.println(e.toString());
}
return 0;
}
@SuppressWarnings("unchecked")
@Override
public List<Object> getListData(String id) {
try {
return (List<Object>)sqlMap.queryForList(id);
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public List<Object> getListData(String id, Object value) {
try {
return (List<Object>)sqlMap.queryForList(id, value);
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public List<Object> getListData(String id, Map<String, Object> map) {
try {
return (List<Object>)sqlMap.queryForList(id, map);
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
}
(5) - com.util.sqlMap 패키지 안에 3개의 파일 생성
sqlMapConfig.xml 생성
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-/ibatis.apache.org//DTO SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<!-- cacheModelsEnabled="false" -> 캐쉬를 사용하지 말라는 뜻 -->
<!-- useStatementNamespaces -> sqlMap.xml에서 namespace 사용가능하게 해줌 -->
<!-- <dataSource type="SIMPLE"> -> 단일 DB사용 -->
<!-- property : 등록 -->
<!-- sqlMap resource : com/util/sqlMap/boardTest_sqlMap.xml 를 불러옴-->
<!-- Config(환경설정파일) -->
<sqlMapConfig>
<settings
cacheModelsEnabled="false"
useStatementNamespaces="true"/>
<!-- DB연결자.JDBC등록된 내용도있고, 이 내용도 함께 존재해야함 -->
<transactionManager type="JDBC" commitRequired="false">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="JDBC.Username" value="suzi"/>
<property name="JDBC.Password" value="a123"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/util/sqlMap/boardTest_sqlMap.xml"/>
</sqlMapConfig>
위의 주석을 참고하고, 각자 DB계정에 맞는 아이디, 비밀번호, IP주소, DB포트번호를 넣어주면 된다.
나는 오라클 DB를 사용해서 1521:xe를 적어주었고, ip는 노트북이라서 localhost를 적었다.
<sqlMap resource>에는 사용할 맵 xml을 입력하면 된다.
XML는 텍스트이기 때문에 객체로 바꿔야만 사용할 수 있다. 따라서 객체화 작업이 필요한데
다음 소스에서 XML을 객체화하는 작업을 할 것이다.
SqlMapConfig.java
- XML을 객체화 하는 작업을 하는 클래스
package com.util.sqlMap;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class SqlMapConfig {
//XML는 텍스트이기때문에 객체로 바꿔야만 사용할 수 있다.
//여기서 xml을 객체화 하는 작업을 한다.
//final 변수는 초기화가 없으면 오류
private static final SqlMapClient sqlMap; //sqlMap에 xml에서 읽어온 객체를 담을 것이다.
//static이므로 이미 메모리상에 올라가 있다.
static {
try {
//파일을 넣는게 아니고 문자를 넣는 것이다.
//해당 위치에 있는 xml을 읽어서 sqlMap에 할당
String resource = "com/util/sqlMap/sqlMapConfig.xml";
//위의 String값을 찾아가서 읽어내서 reader에 넣고
//경로로 들어가서 xml를 읽어오게 한다.
//아직 객체화x
Reader reader = Resources.getResourceAsReader(resource);
//여기서 객체 생성해서 sqlMap에 넣는다.(객체화해서 sqlMap에 넣음)
// - SqlMapClientBuilder가 객체를 만들어서 sqlMap에 넣는다.
// - 여기 sqlMap이 위의 final sqlMap으로 들어간다.
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();//몇번째줄 오류인지 출력
throw new RuntimeException("sqlMap Error : " + e);
}
}
public static SqlMapClient getSqlMapInstance() {
//이 메서드를 호출하면 메모리상에 올라가 있는 sqlMap이 반환된다.
return sqlMap;
}
}
변수 sqlMap에 XML에서 읽어온 데이터 객체를 담는다.
resource 에는 "com/util/sqlMap/sqlMapConfig.xml"라는 문자가 들어가는 것이고, reader를 통해 주소가
실행되도록 하는 것이다.
SqlMapClientBuilder가 객체를 만들어서 처음에 선언한 변수 sqlMap에 넣는다.
그리고 getSqlMapInstance() 메서드를 호출하면 메모리상에 올라가 있는 sqlMap이 반환된다.
temp_sqlMap.xml
- temp파일을 만들어두고 템플릿처럼 복사 붙여 넣기 해서 사용할 것이다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-/ibatis.apache.org//DTO SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="">
</sqlMap>
여기까지 하면 iBatis 설치 및 초기 세팅이 끝난다!
다음 글에서 Struts1 + iBatis를 사용해서 게시판을 만들어볼 예정이다.
'Back-End > JSP & Struts & JDBC' 카테고리의 다른 글
| [Struts1] Struts1 + iBatis 를 사용한 파일 업로드 (0) | 2022.03.10 |
|---|---|
| [Struts1] Struts1/iBatis 게시판 만들기 (0) | 2022.03.09 |
| [Struts 1] 설치 및 초기 세팅, 게시판 만들기 (0) | 2022.03.07 |
| [Servlet] - 이미지 게시판 만들기 (0) | 2022.03.03 |
| [Servlet] 쿠키(cookie), 파일 업로드(1) - 파일 등록 및 조회, 파일 업로드(2) - 파일 업로드, 다운로드, 삭제 (0) | 2022.02.24 |
블로그의 정보
무작정 개발
무작정 개발