[java] MyBatis에서 특정 DBMS 기능 사용하기

MyBatis는 자바 어플리케이션에서 SQL 쿼리와 객체 매핑을 쉽게 처리할 수 있도록 도와주는 프레임워크입니다. MyBatis를 사용하면 다양한 DBMS에서 일관된 방법으로 데이터를 액세스할 수 있습니다. 이번 튜토리얼에서는 MyBatis를 사용하여 특정 DBMS의 기능을 사용하는 방법을 알아보겠습니다.

1. DBMS 종속적인 쿼리 작성

MyBatis에서 특정 DBMS의 기능을 사용하려면 먼저 DBMS 종속적인 쿼리를 작성해야 합니다. 예를 들어, MySQL에서는 LIMIT을 사용하여 검색 결과를 제한할 수 있지만, Oracle에서는 ROWNUM을 사용해야 합니다. 따라서 DBMS 종속적인 쿼리를 작성하는 것이 필요합니다.

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user LIMIT #{offset}, #{limit}")
    List<User> getUsers(@Param("offset") int offset, @Param("limit") int limit);
}

위의 예제에서는 MySQL에서 사용되는 LIMIT을 이용하여 검색 결과를 제한하고 있습니다. 만약 Oracle을 사용한다면, ROWNUM을 사용하는 쿼리로 변경해야 합니다.

2. DBMS에 따른 Mapper 작성

MyBatis에서는 Mapper 인터페이스로 DBMS에 따른 쿼리를 작성할 수 있습니다. 아래 예제는 MySQL과 Oracle에서 사용되는 제한된 검색 결과를 가져오기 위한 Mapper 인터페이스입니다.

MySQLMapper.java

@Mapper
public interface MySQLMapper {
    @Select("SELECT * FROM user LIMIT #{offset}, #{limit}")
    List<User> getUsers(@Param("offset") int offset, @Param("limit") int limit);
}

OracleMapper.java

@Mapper
public interface OracleMapper {
    @Select("SELECT * FROM (SELECT ROWNUM AS row_num, user.* FROM user) WHERE row_num BETWEEN #{offset} AND #{offset}+#{limit}")
    List<User> getUsers(@Param("offset") int offset, @Param("limit") int limit);
}

MySQL의 경우 LIMIT을 사용하여 검색 결과를 제한하고, Oracle의 경우 서브쿼리를 사용하여 ROWNUM으로 제한된 검색 결과를 가져옵니다.

3. DBMS에 따른 Mapper 선택 및 사용

MyBatis에서는 XML 설정 파일을 통해 사용할 DBMS의 Mapper를 선택할 수 있습니다. 아래 예제는 MySQL과 Oracle의 Mapper를 설정하는 XML 파일입니다.

mybatis-config.xml

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mydatabase" />
                <property name="username" value="root" />
                <property name="password" value="password" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/MySQLMapper.xml" />
    </mappers>
</configuration>

mapper/MySQLMapper.xml

<mapper namespace="com.example.mapper.MySQLMapper">
    <select id="getUsers" resultType="com.example.model.User">
        SELECT * FROM user LIMIT #{offset}, #{limit}
    </select>
</mapper>

mapper/OracleMapper.xml

<mapper namespace="com.example.mapper.OracleMapper">
    <select id="getUsers" resultType="com.example.model.User">
        SELECT * FROM (SELECT ROWNUM AS row_num, user.* FROM user) WHERE row_num BETWEEN #{offset} AND #{offset}+#{limit}
    </select>
</mapper>

위의 XML 설정 파일에서는 MySQL의 Mapper를 설정하고, 필요한 경우 Oracle의 Mapper로 변경할 수 있습니다.

마무리

이제 MyBatis를 사용하여 특정 DBMS의 기능을 사용하는 방법을 알아보았습니다. DBMS 종속적인 쿼리를 작성하고, DBMS에 따른 Mapper를 작성하고 사용하는 방법을 숙지하면 다양한 DBMS에서 일관된 방법으로 데이터를 액세스할 수 있습니다.

참고 자료: