최신 외국 동향을 보면 오픈 소스를 많이 사용하지만 조금씩 코어 자바로
회귀 하는 경우가종종 있습니다. 그중에 하나가 JDBC 입니다.
좋은 ORM도 있지만 순수 JDBC가 제공하는 기능은여전히 매력적 입니다.
개인적으로 최근에 iBatis 보다 스프링 JDBC를 사용하려고 합니다.
그런데 문제는 스프링에서 SQL을 메타데이터 (XML,Properties)를
제공하는 기능이 없습니다.
설사 있다고 해도 별도로 repository 클래스를 구현하거나 아니면
dbutil 같은 오픈 소스를 사용해야합니다.
하지만 이들을 사용하더라도 Dynamic 쿼리 지원 여부도
여전히 문제로 남아 있습니다.
고민 끝에 SQL 관리는 Ibatis를 사용하고 실제 execute는
JDBC를 사용하기로 했습니다.
그렇게 되면 Dynamic 쿼리도 지원 됩니다.
Example usage DAO:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.web.context.request.RequestScope;
import com.ibatis.sqlmap.engine.execution.SqlExecutor;
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
import com.ibatis.sqlmap.engine.mapping.sql.Sql;
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
import com.ibatis.sqlmap.engine.scope.SessionScope;
import com.ibatis.sqlmap.engine.scope.StatementScope;
import com.ibatis.sqlmap.engine.transaction.Transaction;
public class MemberDAOImpl implements MemberDAO {
/** The logger. */
private Logger logger = LoggerFactory.getLogger(MemberDAOImpl.class);
/** The sql map client template. */
private SqlMapClientTemplate sqlMapClientTemplate;
public final void setSqlMapClientTemplate(final SqlMapClientTemplate template) {
this.sqlMapClientTemplate = template;
}
public final void selectMember(final Map parameterMap) throws Exception {
SqlMapClientImpl sqlMapClientImpl;
MappedStatement mappedStatement;
StatementScope statementScope;
SessionScope sessionScope;
Sql sql ;
//ibatis에서 sqlMapClient인터페이스 구현체는 sqlMapClientImpl 밖에 없습니다. doc 참조
//다운캐스팅 합니다.
sqlMapClientImpl = (SqlMapClientImpl)this.sqlMapClientTemplate.getSqlMapClient();
//sqlmap statement 객체를 구합니다.
mappedStatement = sqlMapClientImpl.getMappedStatement("selectMember");
//iBatis에서는 ThreadLocal를 통해서 세션을 정의합니다.
sessionScope = new SessionScope();
statementScope = new StatementScope(sessionScope);
//이부분 매우 중요합니다. 이부분을 생략 하면 다이나믹 쿼리가 적용되지 않습니다.
mappedStatement.initRequest(statementScope);
//sql을 추출 합니다.
sql = mappedStatement.getSql();
if(logger.isDebugEnabled()){
logger.debug("======================="+
sql.getSql(statementScope,parameterMap);
}
}
}
====== Sql Log ======
(No Dynamic)
select * from member
(Dynamic)
select * from member WHERE member_id = 111
댓글 없음:
댓글 쓰기