Blue Chicken - The Legend Of Zelda
본문 바로가기

개인공부

[mybatis]db와 java에서 필드명이 다를때

as-is는 아래와 같았음, 그런데 자바에서는 user_id 같은 언더바 사용보다는 userId같은 카멜케이스를 지향한다고 함, 하지만 나는 db에서 user_id를 사용하고 있기 때문에.. 변경이 필요

더보기
더보기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="egovframework.let.main.data.UserMapper">
    <select id="selectAllUsers" resultType="egovframework.let.main.data.User">
        SELECT id, 
        	   user_id, 
        	   pass, 
        	   name, 
        	   role, 
        	   status, 
        	   etc
        FROM user
    </select>
    
    <select id="selectUserByLogin" resultType="egovframework.let.main.data.User" parameterType="map">
        SELECT id,
               user_id, 
               pass,
               name, 
               role, 
               status, 
               etc
        FROM user
        WHERE name = #{name}
          AND pass = #{pass}
    </select>
    
    <insert id="userCreate" parameterType="egovframework.let.main.data.User">
        INSERT INTO user(
        	 id,
         	 user_id,
        	 pass,
        	 name, 
        	 role, 
        	 status, 
        	 etc)
        VALUES (
        	#{id},
        	#{user_id}, 
        	#{pass}, 
        	#{name}, 
        	#{role}, 
        	#{status}, 
        	#{etc}
        	)
    </insert>
</mapper>

User.java는 아래와 같이 userId로 선언

package egovframework.let.main.data;


import com.fasterxml.jackson.annotation.JsonInclude;

import lombok.Data;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
	
	private String id;
	private String userId;
	private String pass;
	private String name;
	private String role = "user";
    private String status = "active";
    private String etc;
}

Mapper는 아래와 같이 변경

Java에서 user_id라는 데이터베이스 컬럼 이름을 userId라는 Java 필드 이름으로 매핑하려면, MyBatis의 결과 매핑(Result Mapping) 기능을 사용하거나, JPA와 같은 ORM 프레임워크를 사용할 때는 애노테이션을 사용해 매핑할 수 있습니다.

여기서는 MyBatis를 사용할 경우 방법을 설명하겠습니다.

MyBatis에서 매핑하는 방법

MyBatis에서는 resultMap을 사용하여 데이터베이스 컬럼과 Java 객체의 필드 사이의 매핑을 명시적으로 정의할 수 있습니다.

MyBatis XML 매퍼에서 resultMap 사용:

UserMapper.xml 파일에서 resultMap을 정의하여 매핑할 수 있습니다.

아래처럼 resultMap을 작성 시 user_id라는 데이터베이스 컬럼이 Java의 userId 필드로 매핑됩니다. resultMap을 통해 각 컬럼과 필드 간의 관계를 명시적으로 정의할 수 있습니다.

 

myBatis에서 #{} 안에 들어가는 이름은 Java 코드에서 사용되는 필드 이름이나 매개변수 이름과 일치해야 합니다.

 

resultType vs resultMap

<select> 태그에서 resultType과 resultMap을 혼용하는 것에 주의해야 합니다. resultType은 클래스 이름을 사용하고, resultMap은 resultMap의 id를 참조합니다. 이 두 가지는 서로 다른 역할을 하므로, 혼동하지 않아야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="egovframework.let.main.data.UserMapper">

    <resultMap id="userResultMap" type="egovframework.let.main.data.User">
        <id column="id" property="id" />
        <result column="user_id" property="userId" />
        <result column="pass" property="pass" />
        <result column="name" property="name" />
        <result column="role" property="role" />
        <result column="status" property="status" />
        <result column="etc" property="etc" />
    </resultMap>
    
    <select id="selectAllUsers" resultMap="userResultMap">
        SELECT id, 
        	   user_id, 
        	   pass, 
        	   name, 
        	   role, 
        	   status, 
        	   etc
        FROM user
    </select>
    
    <select id="selectUser" resultMap="userResultMap" parameterType="map">
        SELECT id,
               user_id, 
               pass,
               name, 
               role, 
               status, 
               etc
        FROM user
        WHERE 1=1
        <if test="userId !=null">
          AND user_id = #{userId}
        </if>
        <if test="name !=null">
          AND name = #{name}
        </if>
        <if test="pass !=null">
          AND pass = #{pass}
        </if>
    </select>
    
    <insert id="userCreate" parameterType="egovframework.let.main.data.User">
        INSERT INTO user(
        	 id,
         	 user_id,
        	 pass,
        	 name, 
        	 role, 
        	 status, 
        	 etc)
        VALUES (
        	#{id},
        	#{userId}, 
        	#{pass}, 
        	#{name}, 
        	#{role}, 
        	#{status}, 
        	#{etc}
        	)
    </insert>
</mapper>