iBatis란 ?
- SQL 구문의 실행 결과를 객체에 매핑하는 Data Mapper
- 테이블 구조가 복잡해지고 정규화되어 있지 않더라도 사용이 가능
- 기존에 사용하던 SQL을 그대로 사용하므로 배우기가 쉽다.
중요한 것은 xml 을 이용하여 sql문을 호출하여서 메모리 캐쉬에 가지고 있다가
결과값을 자바 객체에 맵핑 시켜주는 방법으로 jdbc 코딩시 매번 코딩해주었던
부분들을 모두 줄일수 있고 메모리 또한 효율적으로 관리 할 수 있다.
framework를 사용함으로서 시스템 또한 가벼워질수 있다.
***sql-map-config.xml
<sqlMapConfig>
<properties resource="jdbc.properties" />
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false" />
<typeAlias alias="Account" type="kr.or.openframework.domain.Account"/>
<typeAlias alias="Family" type="kr.or.openframework.domain.AccountFamily"/>
<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver"
value="${mysql.jdbc.driverClassName}" />
<property name="JDBC.ConnectionURL"
value="${mysql.jdbc.url}" />
<property name="JDBC.Username"
value="${mysql.jdbc.username}" />
<property name="JDBC.Password"
value="${mysql.jdbc.password}" />
<property name="JDBC.DefaultAutoCommit" value="true" />
</dataSource>
</transactionManager>
<sqlMap resource="kr/or/openframework/dao/ibatis/MySQLAccount.xml" />
</sqlMapConfig>
이 파일을 통하여 jdbc에 연결하고 sql에서 사용하는 각종 설정들을 셋팅해준다
설정들의 셋팅 정의는
Property Name | 비고 |
enhancementEnabled | 런타임시 바이트코드 향상을 가능하게 한다. |
useStatementNamespace | sql 호출시 namespace 사용 여부 |
maxRequest | 한꺼번에 SQL문을 수행할 수 있는 쓰레드의 수를 정의 |
maxSession | 주어진 시간동안 활성화될 수 있는 세션의 수 |
maxTransaction | 한꺼번에 SqlMapClient.startTransaction()에 들어갈 수 있는 쓰레드의 최대 갯수 |
***sql map 부분
<sql id="selectAccount_frag">
select
acc_id,
acc_first_name,
acc_last_name,
acc_email
from account
</sql>
<select id="selectAccountById" parameterClass="int" resultClass="Account">
<include refid="selectAccount_frag"/>
where acc_id = #id#
</select>
<insert id="insertAccount" parameterClass="Account">
insert into account (
acc_id,
acc_first_name,
acc_last_name,
acc_email
) values (
#id#, #firstName#, #lastName#, #emailAddress#
)
</insert>
<update id="updateAccount" parameterClass="Account">
update account set
acc_first_name = #firstName#,
acc_last_name = #lastName#,
acc_email = #emailAddress#
where acc_id = #id#
</update>
<delete id="deleteAccount" parameterClass="int">
delete from account
where acc_id = #id#
</delete>
****자바소스
private static SqlMapClient sqlMapper;
static {
try {
// log4j setting
Properties configProps = new Properties();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("log4j.xml");
configProps.load(inputStream);
PropertyConfigurator.configure(configProps);
// iBATIS SQLMaps setting
Reader reader = Resources.getResourceAsReader("kr/or/openframework/dao/ibatis/SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);
}
}
public static Account selectAccountById(int id) throws SQLException {
return (Account) sqlMapper.queryForObject("selectAccountById", id);
}
public static String insertAccount(Account account) throws SQLException {
sqlMapper.insert("insertAccount", account);
return "SUCCESS";
}
public static String updateAccount(Account account) throws SQLException {
sqlMapper.update("updateAccount", account);
return "SUCCESS";
}
public static String deleteAccount(int id) throws SQLException {
sqlMapper.delete("deleteAccount", id);
return "SUCCESS";
}
이렇게 xml파일로 sql문을 생성하고 맵핑 시킨 상태에서
자바소스로 메소드 호출 하듯이 xml tag를 호출시켜서 결과 값을 객체에
맵핑 시킨다 . 때문에 자바소스에서 sql문이 없어졌고 불필요한 부분이
삭제된 간결한 코드가 완성 되었다
출처 - darkmirr님의 이글루
댓글 없음:
댓글 쓰기