mybatis-config.xml(전역, 요소 순서 고정) + mapper/*.xml(namespace = 인터페이스, id = 메서드). id 오타는 실행 시점 오류이므로 기동 시 hasStatement 검사를 둔다.<resultMap> 이 결과 매핑의 전부. <id> 가 접기 기준, <constructor> 는 record, <collection>/<association> 은 1:N/N:1. 중첩 매핑이 있으면 autoMapping="true" 를 잊지 않는다. JOIN 은 columnPrefix 로 컬럼 충돌을 피한다.<where>/<set>/<trim> 이 접속사·쉼표를 정리하고, <if>/<choose>/<foreach>/<bind> 가 조건을 만든다. 목록과 COUNT 는 <sql>/<include> 로 같은 WHERE 조각을 쓴다. 정렬 컬럼은 <choose> 화이트리스트.< 는 < 또는 CDATA. CDATA 안에서는 동적 태그가 죽는다.<selectKey order="BEFORE">, ROWNUM 3중 서브쿼리 또는 OFFSET/FETCH, NVL/TO_CHAR/DUAL, MERGE USING, 그리고 jdbcTypeForNull=NULL. DB 별 분기는 databaseId(소수 차이) 또는 방언 폴더 + mapper-locations(넓은 차이).Executor.query 인터셉터가 COUNT 와 페이징 SQL 을 만들어 끼움. 지시는 다음 한 번의 실행된 SQL 에만 소비되므로 finally { clearPage() }. StatementHandler 레벨 구현은 1차 캐시와 충돌한다.spring.datasource + mybatis.* + @MapperScan + @Transactional 로 세션·트랜잭션·설정을 대신한다. 코어에서 손으로 한 일과 1:1 로 대응된다.MODE=Oracle 로 폐쇄망에서 Oracle 문법 XML 을 80% 검증할 수 있다. databaseId 는 여전히 h2 이고, 바인드 변수만 있는 인라인 뷰는 CAST 가 필요하다.이것으로 실무 확장 레벨을 마칩니다.
Excel 순수 JDK(01) → POI(02) → 업로드 서버(03) → JDBC(04) → MyBatis 어노테이션(05) → MyBatis XML(06) 을 이으면, 브라우저에서 엑셀을 올려 검증하고 Oracle 에 트랜잭션으로 저장한 뒤 페이징된 목록과 엑셀 다운로드를 제공하는 관리자 기능이 실무 프로젝트와 같은 형태로 완성됩니다.
명령어 레벨은 이 과정에서 자주 찾게 되는 API 를 모아 둔 참조입니다.