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 |