iBatis(버전2.0) 라이브러리 추가
iBatis는 DAO의 JDBC 형태를 보완하기 위해 나온 프레임워크이다. SQL에 기반한 데이터베이스와 자바를 연결해주는 역할을 해준다.
이렇게 데이터베이스와 관련된 작업을 정형화한 것들을 Persistence Framwork라 한다. 여기서 버전이 업그레이드 된 3.0이 Mybatis이다. iBatis와 Mybatis 둘의 차이점은 크진 않지만 추후에 비교해서 진행하고자 한다.
ibatis 프레임워크 사용을 위해 ibatis-2.3.4.726.zip의 jar파일을 lib폴더에 추가
1. 패키지 생성 및 SqlMapConfig 클래스 생성
com.util.dao : 공통적으로 사용되는 DAO클래스를 생성
com.util.sqlMap : SqlMap.xml 환경설정 정보를 읽어 SqlMapClient 객체를 생성할 클래스
SqlMapConfig 클래스 생성 package com.util.sqlMap; import java.io.IOException; 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 {
//final변수인데 초기화 없으면 오류. private static final SqlMapClient sqlMap;
static{//static이므로 이미 메모리상에 올라가있음
try { //해당위치에 있는 xml을 읽어서 sqlMap에 할당 String resource = "com/util/sqlMap/sqlMapConfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (IOException e) { e.printStackTrace(); throw new RuntimeException("Error initialixing class: "+ e); } } public static SqlMapClient getSqlMapInstance() { //이 메소드를 호출하면 메모리상에 올라가 있는 sqlMap 반환 return sqlMap; } } |
2. sqlMapConfig.xml 생성 (환경설정 파일)
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
이 부분에서 문법검사를 못하므로 오타가 나면 안됨!!
cacheModelsEnabled ▶ 캐시를 사용하지 않겠다
useStatementNamespaces ▶ 이름을 주고 그 이름인 com.board 를 호출해서 가져다가 쓰는 개념
<?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"> <!-- 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:@192.168.16.16:1521:TestDB"/> <property name="JDBC.Username" value="SUZI"/> <property name="JDBC.Password" value="A123"/> </dataSource> </transactionManager>
<!-- 이 sqlMap은 struts에서 struts-config_temp.xml를 만들어두고 복사해서 사용한것과 동일 --> <sqlMap resource="com/util/sqlMap/temp_sqlMap.xml"/>
</sqlMapConfig> |
3. temp_sqlMap.xml 생성
temp 파일을 만들어두고 템플릿처럼 복사 붙여넣기해서 사용할 것.
<?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"> <!-- Mapper라고 함 --> <sqlMap namespace="test"> SQL문 작성 </sqlMap> |
제어의 역전(Ioc)과 의존성주입(DI)
1. SqlMapConfig클래스의 static변수
2. static변수 객체 생성시에 메모리상에 올라가면서 sqlMapConfig.xml을 읽어옴
3. sqlMapConfig.xml에 있는 마지막 문장의 xml파일들을 추가적으로 읽어옴
<sqlMap resource="com/util/sqlMap/temp_sqlMap.xml"/>
4. CommonDAO 인터페이스 생성
ibatis에만 존재. sql문이 실행되는 SQL문을 모든 경우의 수를 반영하여 생성해둔 것
package com.util.dao; import java.sql.SQLException; import java.util.List; import java.util.Map; public interface CommonDAO {
//데이터 추가 public void insertData(String id, Object value) throws SQLException;
//데이터 수정 public int updateData(String id, Object value) throws SQLException; public int updateData(String id, Map<String, Object> map) throws SQLException;
//데이터 삭제 public int deleteData(String id) throws SQLException; public int deleteData(String id, Object value) throws SQLException; public int deleteData(String id, Map<String, Object> map) throws SQLException;
//해당 레코드 가져오기 public Object getReadData(String id) throws SQLException; public Object getReadData(String id, Object value) throws SQLException; public Object getReadData(String id, Map<String, Object> map) throws SQLException; public int getIntValue(String id) throws SQLException; public int getIntValue(String id, Object value) throws SQLException; public int getIntValue(String id, Map<String, Object> map) throws SQLException; public List<Object> getListData(String id) throws SQLException; public List<Object> getListData(String id, Object value) throws SQLException; public List<Object> getListData(String id, Map<String, Object> map) throws SQLException; } |
5. CommonDAOImpl 구현 클래스 생성
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(); }
public static CommonDAO getInstance(){ return new CommonDAOImpl(); }
@Override public void insertData(String id, Object value) throws SQLException { try { sqlMap.startTransaction(); //트랜잭션 시작 sqlMap.insert(id,value); //insert문 실행 sqlMap.commitTransaction(); //트랜잭션 커밋 } catch (SQLException e) { System.out.println(e.toString()); } finally { sqlMap.endTransaction();//에러가 발생해도 트랜잭션을 종료시키게 작성 } } @Override public int updateData(String id, Object value) throws SQLException { int result = 0; try { sqlMap.startTransaction(); //트랜잭션 시작 result = sqlMap.update(id,value); //update문 실행 sqlMap.commitTransaction(); //트랜잭션 커밋 } catch (SQLException e) { System.out.println(e.toString()); } finally { sqlMap.endTransaction();//에러가 발생해도 트랜잭션을 종료시키게 작성 } return result; } @Override public int updateData(String id, Map<String, Object> map) throws SQLException { int result = 0; try { sqlMap.startTransaction(); //트랜잭션 시작 result = sqlMap.update(id,map); //update문 실행 sqlMap.commitTransaction(); //트랜잭션 커밋 } catch (SQLException e) { System.out.println(e.toString()); } finally { sqlMap.endTransaction();//에러가 발생해도 트랜잭션을 종료시키게 작성 } return result; } @Override public int deleteData(String id) throws SQLException { int result = 0; try { sqlMap.startTransaction(); result = sqlMap.delete(id); sqlMap.commitTransaction(); } catch (SQLException e) { System.out.println(e.toString()); } finally { sqlMap.endTransaction(); } return result; } @Override public int deleteData(String id, Object value) throws SQLException { int result = 0; try { sqlMap.startTransaction(); result = sqlMap.delete(id,value); sqlMap.commitTransaction(); } catch (SQLException e) { System.out.println(e.toString()); } finally { sqlMap.endTransaction(); } return result; } @Override public int deleteData(String id, Map<String, Object> map) throws SQLException { int result = 0; try { sqlMap.startTransaction(); result = sqlMap.delete(id,map); sqlMap.commitTransaction();
} catch (SQLException e) { System.out.println(e.toString()); } finally { sqlMap.endTransaction(); } return result; } @Override public Object getReadData(String id) throws SQLException { try { //select문은 transaction start,endTransaction이 필요하지 않음 return sqlMap.queryForObject(id); } catch (Exception e) { System.out.println(e.toString()); } return null; } @Override public Object getReadData(String id, Object value) throws SQLException { try { //select문은 transaction start,endTransaction이 필요하지 않음 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) throws SQLException { try { //select문은 transaction start,endTransaction이 필요하지 않음 return sqlMap.queryForObject(id,map); } catch (Exception e) { System.out.println(e.toString()); } return null; } @Override public int getIntValue(String id) throws SQLException { try { return ((Integer)sqlMap.queryForObject(id)).intValue(); } catch (Exception e) { System.out.println(e.toString()); } return 0; } @Override public int getIntValue(String id, Object value) throws SQLException { try { 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) throws SQLException { try { 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) throws SQLException { 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) throws SQLException { 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 throws SQLException { try { return (List<Object>)sqlMap.queryForList(id,map); } catch (Exception e) { System.out.println(e.toString()); } return null; } } |
Log4J
Log4J : 자바 프로그램 작성 시 로그를 남기기 위해서 사용되는 Logging Framework
Log4J 다운로드 : http://logging.apache.org/log4j/1.2/download.html
src 경로에 log4j.properties 파일 위치(소스 폴더 최상위)
'Dev > Struts' 카테고리의 다른 글
Struts2 세팅 (0) | 2019.03.21 |
---|---|
Struts1/iBatis - 파일 업로드 기능 구현 (0) | 2019.03.21 |
Struts1/iBatis - 게시판 만들기 (2) | 2019.03.20 |
Struts1/JDBC - 게시판 만들기 (2) | 2019.03.19 |
Struts1 세팅 및 기본 예제 & MVC 패턴 (0) | 2019.03.18 |