개발/Mybatis

Mybatis란?

함수형 인간 2025. 1. 24. 07:20

MyBatis는 SQL 쿼리를 XML 파일이나 어노테이션으로 분리하여 작성하고, 자바 객체SQL 쿼리의 결과를 매핑해주는 자바용 퍼시스턴스 프레임워크이다. 

MyBatis의 매핑 방식:

ResultMap 미사용 시 (기본 매핑):

  • MyBatis는 SQL 쿼리의 결과 집합(ResultSet)의 컬럼 이름과 자바 객체(Result Object)의 필드 이름을 비교한다.
  • 기본적으로 대소문자를 구분하지 않고 이름이 같으면 해당 필드에 값을 매핑한다.
  • 만약 컬럼명과 필드명이 다른 경우, SQL 쿼리에서 별칭(Alias) 을 사용하여 필드명과 일치시켜 매핑한다.

예시:

Java
 
public class User {
    private int userId; // 컬럼명과 일치 (대소문자 무시)
    private String userName; // 컬럼명과 일치 (대소문자 무시)

    // getters and setters
}

 


XML
 
<select id="getUserById" parameterType="int" resultType="User">
    SELECT userid, username 
    FROM users 
    WHERE userid = #{userId}
</select>

 

SQL

-- 컬럼명: userid, username
SELECT userid, username FROM users WHERE userid = #{userId}

 

 

ResultMap 사용 시 (명시적 매핑):

  • resultMap을 사용하면 컬럼명과 필드명을 명시적으로 매핑할 수 있다.
  • 컬럼명과 필드명이 다르거나, typeHandler를 사용해야 하는 경우, 또는 중첩된 객체 매핑 등 복잡한 매핑을 처리할 때 유용하다.
  • resultMap 내에서 <result> 태그를 사용하여 컬럼과 필드를 1:1로 매핑.

예시:

Java
 
public class User {
    private int id; // 컬럼명과 다름
    private String name; // 컬럼명과 다름

    // getters and setters
}

 

 
XML
 
<resultMap id="userResultMap" type="User">
    <id property="id" column="user_id" />
    <result property="name" column="user_name" />
</resultMap>

<select id="getUserById" parameterType="int" resultMap="userResultMap">
    SELECT user_id, user_name 
    FROM users 
    WHERE user_id = #{userId}
</select>

 

 
 
 
SQL
 
-- 컬럼명: user_id, user_name
SELECT user_id, user_name FROM users WHERE user_id = #{userId}

 

카멜 케이스(Camel Case) 자동 매핑 (mapUnderscoreToCamelCase):

  • MyBatis 설정에서 mapUnderscoreToCamelCase 옵션을 true로 설정하면, 데이터베이스의 언더스코어 표기법(user_name)자바의 카멜 케이스 표기법(userName) 에 자동으로 매핑시켜준다.

예시:

XML
 
<configuration>
  <settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
  </configuration>

 

매핑 시 주의사항:

  • 대소문자 구분: 기본적으로 컬럼명과 필드명을 비교할 때 대소문자를 구분하지 않지만, 데이터베이스나 JDBC 드라이버에 따라 다르게 동작할 수 있으므로 주의해야 한다.
  • 타입 불일치: 컬럼 타입과 필드 타입이 호환되지 않으면 TypeException이 발생할 수 있다.
  • NULL 값: null 값을 처리하는 방법에 유의해야 합니다. 기본형(primitive type)은 null을 가질 수 없으므로, Integer와 같은 Wrapper 클래스를 사용해야 한다.