Association

has one 관계를 형성하기 위함

 

 

Collection

has many 관계를 형성하기 위함

 

 

Mybatis 에서 관게를 정의하는 방법
  • Nested Select : 1번의 추가 Select 를 통한 데이터 검색
  • Nested Results : Join 을 통한 한 번에 데이터 검색

2번의 경우, association 태그 내에서 resultMap에 지정한 형태로 결과 값을 담게 된다.

 

 

도메인 관계

[User] 1:1 [Board]
[Apply] N:1 [Board]

@Data
public class User {
 private Long id;
 pirvate String name;
}

@Data
public class Board {
 private Long id;
 private String name;
 private User user;  // has one relation ( association )
 private List<Apply> apply; // has many relation ( collection )
}

public class Apply {
 private Long id;
 private Board board; // has one relation ( association )
 private User user; // has one relation ( association )
}

 

 

<mapper namespace="package.BoardRepo">    

    <resultMap id="userResultMap" type="package.users">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
    </resultMap>
    
    
    
    <resultMap id="BoardResultMap" type="package.Board">
    	<id column="board_id" property="id" jdbcType="BIGINT"/>
        <result column="board_name" property="name" jdbcType="VARCHAR"/>
        
        // nested Result
        <collection column="applys" property="applys" ofType="hashmap" javaType="list">
        	<id column="id" property="id" jdbcType="BIGINT"/>
            
            // nested Result
            <assocation property="board" resultMap="BoardResultMap"/>
            
            //nested Select
            <assocation column="user_id" property="user" select="selectUserById"/>
        </collection>

        // nested Result
        <assocation property="user" resultMap="userResultMap"/>
    </resultMap>
    
    
    
    <resultMap id="applyResultMap" type="package.applys">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <assocation property="board" resultMap="BoardResultMap"/>
        <assocation column="user_id" property="user" select="selectUserById"/>
    </resultMap>



    <select id="selectUserById" resultMap="UserResultMap2" parameterType="java.lang.Long">
        SELECT
            id, name
        FROM
            users
        WHERE
            id = #{id, jdbcType=BIGINT}
    </select>
</mapper>

 

  • <association property="user" resultMap="userResultMap"/>

이 의미는 Board 클래스에 User타입의 user 변수에 resultMap으로 선언한 userResultMap 형태의 값을 바인딩시킨다.

즉, user에 userResultMap의 값이 들어간다.

 

 

  • <assocation column="user_id" property="user" select="selectUserById"/>

이 의미는 해당 쿼리를 수행하기 전에 selectUserById 쿼리를 먼저 수행해준다.

 

 

 

${alias}

동적 SQL 쿼리를 작성할 때 사용하는 "플레이스 홀더" 이다.

이를 통해 SQL 일부를 "동적" 으로 생성하거나 피라미터로 값을 삽입 가능하다.

 

즉, '${alias}' 문법은 문자열 치환을 수행한다.

 

<select id="findUsersByAlias" parameterType="string" resultType="com.example.User">
  SELECT * FROM users WHERE alias = #{alias}
</select>

이 매퍼는 findUsersByAlias라는 메소드에서 alias라는 파라미터를 받아 테이블에서 alias에 해당하는 사용자를 검색한다.

 

이를 수행하는 코드:

 

String alias = "john_doe"; // 파라미터로 전달할 alias 값
User user = sqlSession.selectOne("findUsersByAlias", alias);

이렇게 실제로 alias라는 파라미터를 전달해야 합니다.

 

이는 동적 검색, 정렬 순서와 같이 일부 조건을 바꿔야 할 때 유용합니다.

 

 

'mybatis' 카테고리의 다른 글

트랜잭션 관리  (0) 2023.09.14
WHERE 절은 왜 OUTER JOIN 에서 데이터를 누락시키는가?  (0) 2023.09.13
마이바티스란? (과정 및 개요)  (0) 2023.09.10
Spring + MySQL + Mybatis  (0) 2023.08.17

+ Recent posts