오늘은 하루동안
Ibatis를 진행한다.
iBatis란 SQL 실행 결과를 자바빈즈 혹은 Map 객체에 매핑해 주는 Persistence 솔루션으로 SQL을 소스코드가 아닌 XML로 따로 분리해 관리하도록 지원해준다.
1.iBatis 설치
http://ibatis.apache.org/java.cgi 에서 다운을 받는다.
압축을 풀면 lib 디렉토리에 api가 있다.
2. sqlmap-config.xml
- sqlmap-config에서 sqlmap.xml파일을 포함하고 sqlmap.xml 안에 Mapstatement를 가지고 있게 되는데 이 Mapstatment을 실제로 스프링에서 사용하게 된다.
- sqlmap-config.xml 파일은 커넥션 정보와 사용할 sqlmap파일에 대한 정보를 가지는 두가지 역할을 한다.
-sqlmap.xml 파일은 result map 과 실제 사용할 쿼리문을 담고 있다.
3. 환경설정
- java perspactive에서 java 프로젝트를 생성한 후 Build path 설정에서 External Lib로 압축을 풀어둔 ibatis-2.3.0.677.jar 파일을 추가해준다.
DB연결을 위해 ojdbc14.jar파일도 추가해 주어야 한다
- 샘플을 가지고 실습을 해 보기 위해 ibatis폴더 내의 simple_example 폴더로 들어가서 com폴더를 프로젝트 내 src 아래로 추가해준다.
- Quantum perspective 환경에서 사용할 테이블을 생성해 준다.
4. sqlmap-config 설정
- transactionManager 태그에 DB환경에 맞추어 변수값을 설정해 준다.
기존에 추가해둔 Servers아래 server.xml 파일을 열면 설정된 값을 확인 할 수 있으므로 복사해서 값을 설정해 주도록 한다.
<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="spring"/>
<property name="JDBC.Password" value="1234"/>
</dataSource>
</transactionManager>
- 사용할 sqlmap 파일을 연결해 주어야 한다. 샘플에는 기본으로 Account.xml이 연결되어 있음을 확인 할 수 있다. 이 파일을 원하는 파일 명으로 변경해주고 해당 xml파일을 생성해주어야 하는데 실습에서는 기존의 Account.xml파일을 rename하고 파일 내용을 수정해서 사용했다.
<sqlMap resource="com/mydomain/data/Member.xml"/>
5. sqlmap
- sqlmap으로 사용할 파일 내부에는 기본적으로 select, insert,update, delete 가 정의되어 있다. 이렇게 sqlmap 내부에 정의되는 메소드들을 mapstatement라고 한다.
sqlmap으로 사용하는 파일은 사용하지 않는 메소드라도 오류가 있으면 정상적으로 작동되지 않으므로 모든 메소드를 제대로 작성해 주거나 사용하지 않을 메소드는 우선 주석처리를 해 주어야 한다.
- sqlmap에서 주고받을 객체로 일반 자바클래스(POJO)를 생성해주고 자바클래스에서 정의해둔 프로퍼티를 insert 문의 value로 넣어주면 된다. insert 메소드에 id로 지정한 이름과 DAO에서 메소드를 호출할때 넘겨주는 id값이 같아야 한다. 태그의 내부에는 실제 쿼리문이 들어간다.
<insert id="insertMember" parameterClass="Member">
insert into Member (
MEM_ID,
MEM_NAME,
MEM_PASSWD,
MEM_TEL,
MEM_EMAIL,
MEM_COMMENT
) values (
#id#, #name#, #passwd#, #tel#, #email#, #comment#
)
</insert>
- select의 경우 테이블의 필드명과 클래스의 변수명이 다를때 결과값의 매핑을 위해 resultMap 을 선언해서 쓸 수 있다.
<resultMap id="MemberResult" class="Member">
<result property="id" column="MEM_ID"/>
<result property="name" column="MEM_NAME"/>
<result property="passwd" column="MEM_PASSWD"/>
<result property="tel" column="MEM_TEL"/>
<result property="email" column="MEM_EMAIL"/>
<result property="comment" column="MEM_COMMENT"/>
</resultMap>
- select의 결과값은 테이블명이 같은 경우나 쿼리 자체에서 알리아스로 지정해서 매핑을 해준 경우라면 resultClass, 그렇지 않고 resultMap을 이용한 매핑이 필요하다면 resultMap 을 선언해 준다.
<select id="selectMemberById" parameterClass="String"
resultMap="MemberResult">
select
*
from Member
where MEM_ID = #id#
</select>
- SQL문 생성 태그
중복으로 사용되는 sql문을 설정한뒤 include해서 사용할 수 있다.
<sql id="select">
select * from order
</sql>
<select id=“selectOrderById resultClass="map">
<include refid="select" />
where order_id = #orderId#
</select>
6. 자바 클래스
- ibatis에서 맵핑해줄 자바빈으로 사용할 클래스는 매우 간단하게 생성한다. 생성한 테이블의 필드명과 일치하는 프로퍼티들을 작성해주고 eclipse의 코드 생성 기능을 이용해 getter와 setter를 생성해준다.
- 역시 코드생성 기능을 이용해 toString 메소드를 생성해 주면 끝!
7. DAO
- DAO에서는 sqlMapClient 객체를 통해서 sqlMapConfig.xml파일을 가져오게 되고 이 객체를 통해 최종적으로 sqlmap 파일 내부의 Mapstatement(sql)를 접근한다.
이 sqlMapClient객체가 모든 쿼리 질의시에 미리 생성이 되어 있어야 하기때문에 static으로 정의해준다.
private static SqlMapClient sqlMapper;
static {
try {
Reader reader = Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// Fail fast.
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
- insert
미리 생성해둔 SqlMapClient를 통해서 sqlmap의 mapstatement를 콜한다.
이때 데이터를 넘겨주는 클래스로는 이미 생성해둔 자바 클래스를 넘긴다.
mapstatement를 콜할때 넘겨주는 첫번째 인자는 mapstatement의 id값이므로 xml상의 id값과 맞춰준다.
sqlMapper.insert("insertMember", Member);
- select
select는 queryForList 와 queryForObject 두가지로 나뉜다. List는 당연히 목록 및 검색 결과를 보여주기 위해 사용하는것으로 2개 이상의 데이터를 결과 클래스들을 담은 List를 리턴한다. Object 는 파라메터 값을 넘겨서 상세보기를 제공할때 사용한다.
return sqlMapper.queryForList("selectAllMembers");
return (Member) sqlMapper.queryForObject("selectMemberById", id);
8. Dynamic 태그
조건에 따라서 where절을 동적으로 구성할 필요가 있는 경우 사용하는 태그이다.