무작정 개발.Vlog

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 추가하기

lib 추가하기
lib 추가하기

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

옮긴다!

 

lib 추가 화면
lib 추가 화면

여기까지 하면 iBatis 설치는 끝난다. 이제 초기 세팅을 시작할 것이다.

 

 

(3) - 패키지(Package) 생성

 

2개의 패키지 생성
2개의 패키지 생성

위의 사진처럼 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를  사용해서 게시판을 만들어볼 예정이다.

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기