resultMap
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ๋ ํ๊ทธ์
๋๋ค.
resultMap์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ๋งคํํ ์ ์์ผ๋ฉฐ, ํนํ JOIN ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ ๊ฐ์ฒด๋ก ๋งคํํ ๋ ์ ์ฉํฉ๋๋ค.ย
๊ฐ์
โข
๊ธฐ๋ณธ ๊ตฌ์กฐ
โฆ
๊ตฌ์กฐ ์ค๋ช
โฆ
๊ธฐ๋ณธ ์ฝ๋
โข
์ฃผ์ ์์
โข
์ฃผ์ ๊ธฐ๋ฅ
โข
์ฃผ์ ์์
๊ธฐ๋ณธ ๊ตฌ์กฐ
๊ตฌ์กฐ ์ค๋ช
<resultMap id="๋งคํID" type="ํจํค์ง.ํด๋์ค๋ช
">
<!-- ๊ธฐ๋ณธ ํค๋ฅผ ๋งคํํ๋ ์์ -->
<id property="์๋ฐ ๊ฐ์ฒด์ ๋ณ์๋ช
" column="DB ํ
์ด๋ธ์ ์ปฌ๋ผ๋ช
"/>
<!-- ์ผ๋ฐ ์์ฑ์ ๋งคํํ๋ ์์ -->
<result property="์๋ฐ ๊ฐ์ฒด์ ๋ณ์๋ช
" column="DB ํ
์ด๋ธ์ ์ปฌ๋ผ๋ช
"/>
<!-- 1:1 ๊ด๊ณ๋ฅผ ๋งคํํ๋ ์์ -->
<association property="๊ฐ์ฒด ๋ณ์๋ช
" javaType="ํจํค์ง.ํด๋์ค๋ช
(์ 2์ ๋งคํ๊ฐ์ฒด)">
<!-- ์ค์ฒฉ๋ resultMap ์์ -->
</association>
<!-- 1:N ๊ด๊ณ๋ฅผ ๋งคํํ๋ ์์ -->
<collection property="์ปฌ๋ ์
๋ณ์๋ช
" ofType="์๋ฐ ์ปฌ๋ ์
ํ์
">
<!-- ์ค์ฒฉ๋ resultMap ์์ -->
</collection>
</resultMap>
XML
๋ณต์ฌ
1.
<resultMap>:ย resultMapย ์์๋ ๋งคํ์ ์ ์ํ๋ ๋ฃจํธ ์์์
๋๋ค.
โข
id:ย resultMap์ ๊ณ ์ ์๋ณ์์
๋๋ค.
โข
type: ๋งคํํ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค.
2.
<id>: ๊ธฐ๋ณธ ํค๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โข
property: Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค.
โข
column: SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ์
๋๋ค.
3.
<result>: ์ผ๋ฐ ์์ฑ์ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โข
property: Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค.
โข
column: SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ์
๋๋ค.
4.
<association>: 1:1 ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โข
property: Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค.
โข
javaType: ์ฐ๊ด๋ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค.
โข
associationย ์์ ๋ด์ ๋ค๋ฅธย resultMapย ์์๋ฅผ ์ค์ฒฉํ ์ ์์ต๋๋ค.
5.
<collection>: 1:N ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โข
property: Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค.
โข
ofType: ์ฐ๊ด๋ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค.
โข
collectionย ์์ ๋ด์ ๋ค๋ฅธย resultMapย ์์๋ฅผ ์ค์ฒฉํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ฝ๋
<?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="com.aloha.thymeleaf_security.mapper.UserMapper">
<resultMap type="Users" id="UserMap">
<id property="no" column="no" />
<result property="no" column="no" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="enabled" column="enabled" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
</resultMap>
</mapper>
XML
๋ณต์ฌ
@Data
public class Users {
private Long no;
private String username;
private String password;
private String name;
private String email;
private Date createdAt;
private Date updatedAt;
private int enabled;
}
Java
๋ณต์ฌ
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`NO` bigint NOT NULL AUTO_INCREMENT,
`ID` varchar(255) NOT NULL,
`USERNAME` varchar(100) NOT NULL,
`PASSWORD` varchar(200) NOT NULL,
`NAME` varchar(100) NOT NULL,
`EMAIL` varchar(200) DEFAULT NULL,
`CREATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ENABLED` int DEFAULT 1,
PRIMARY KEY (`NO`)
) COMMENT='ํ์';
SQL
๋ณต์ฌ
์ฃผ์ ์์
โข
<resultMap>
โฆ
<id>
โฆ
<result>
โฆ
<association>
โฆ
<collection>
์์ | ์์ฑ | ์ค๋ช
|
<resultMap> | id | resultMap์ ๊ณ ์ ์๋ณ์์
๋๋ค. |
type | ๋งคํํ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค. | |
<id> | property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
column | SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ์
๋๋ค. | |
javaType | (์ ํ ์ฌํญ) ๋งคํํ Java ํ์
์
๋๋ค. | |
jdbcType | (์ ํ ์ฌํญ) ๋งคํํ JDBC ํ์
์
๋๋ค. | |
typeHandler | (์ ํ ์ฌํญ) ์ฌ์ฉ์ ์ ์ ํ์
ํธ๋ค๋ฌ์
๋๋ค. | |
<result> | property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
column | SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ์
๋๋ค. | |
javaType | (์ ํ ์ฌํญ) ๋งคํํ Java ํ์
์
๋๋ค. | |
jdbcType | (์ ํ ์ฌํญ) ๋งคํํ JDBC ํ์
์
๋๋ค. | |
typeHandler | (์ ํ ์ฌํญ) ์ฌ์ฉ์ ์ ์ ํ์
ํธ๋ค๋ฌ์
๋๋ค. | |
<association> | property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
javaType | ์ฐ๊ด๋ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค. | |
columnPrefix | (์ ํ ์ฌํญ) ์ด ์ด๋ฆ์ ์ ๋์ฌ์
๋๋ค. | |
select | (์ ํ ์ฌํญ) ๋ณ๋์ select ๋ฌธ์ ์ง์ ํฉ๋๋ค. | |
resultMap | (์ ํ ์ฌํญ) ์ค์ฒฉ๋ resultMap์ ID์
๋๋ค. | |
notNullColumn | (์ ํ ์ฌํญ) null์ด ์๋ ์ด์ ์ง์ ํฉ๋๋ค. | |
fetchType | (์ ํ ์ฌํญ) lazy ๋๋ eager ๋ก๋ฉ์ ์ง์ ํฉ๋๋ค. | |
<collection> | property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
ofType | ์ฐ๊ด๋ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค. | |
columnPrefix | (์ ํ ์ฌํญ) ์ด ์ด๋ฆ์ ์ ๋์ฌ์
๋๋ค. | |
select | (์ ํ ์ฌํญ) ๋ณ๋์ select ๋ฌธ์ ์ง์ ํฉ๋๋ค. | |
resultMap | (์ ํ ์ฌํญ) ์ค์ฒฉ๋ resultMap์ ID์
๋๋ค. | |
notNullColumn | (์ ํ ์ฌํญ) null์ด ์๋ ์ด์ ์ง์ ํฉ๋๋ค. | |
fetchType | (์ ํ ์ฌํญ) lazy ๋๋ eager ๋ก๋ฉ์ ์ง์ ํฉ๋๋ค. |
<resultMap>
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ๋ ๋ฃจํธ ์์์
๋๋ค.
์์ฑ | ์ค๋ช
|
id | resultMap์ ๊ณ ์ ์๋ณ์์
๋๋ค. |
type | ๋งคํํ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค. |
<resultMap id="๋งตid" type="ํจํค์ง๋ช
.ํด๋์ค๋ช
">
</resultMap>
XML
๋ณต์ฌ
typeAliases ์ค์ ๋ฐฉ๋ฒ
mybatis ์์ Java ํด๋์ค ์ ์ฒด์ด๋ฆ(ํจํค์ง๋ช
.ํด๋์ค๋ช
)์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก ์ ์ฉํ ์ ์์ต๋๋ค.
โข
โข
mybatis-config.xml
โข
์ค์ ํ์ผ ์์น
โฆ
โช
โข
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- ์ค์ -->
<settings>
<!-- ์ธ๋์ค์ฝ์ด ์ผ์ด์ค์ธ ์ปฌ๋ผ์ ์นด๋ฉ ์ผ์ด์ค๋ก ๋ณํํ๋ ์ค์ -->
<!-- board_no - boardNo -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- ํ์
๋ณ์นญ ์ค์ -->
<typeAliases>
<!--
โญ typeAlias : ๋ณ์นญ ์ค์
- alias : ๋ณ์นญ
- type : ๋ณ์นญ์ ์ฌ์ฉํ ํด๋์ค ๊ฒฝ๋ก
-->
<typeAlias alias="User" type="com.aloha.mybatis.dto.User"/>
<!--
โญ package : ํจํค์ง ๊ฒฝ๋ก ์ง์
- name : ํจํค์ง ๊ฒฝ๋ก
-->
<package name="com.aloha.mybatis.dto"/>
</typeAliases>
</configuration>
XML
๋ณต์ฌ
โข
application.properties
# Mybatis ์ค์
# Mybatis ์ค์ ๊ฒฝ๋ก : ~/resources/mybatis-config.xml
mybatis.config-location=classpath:mybatis-config.xml
# Mybatis ๋งคํผ ํ์ผ ๊ฒฝ๋ก : ~/๋ฉ์ธํจํค์ง/mapper/**Mapper.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Java
๋ณต์ฌ
ํ์
๋ณ์นญ package ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ฉด, ํด๋น ํจํค์ง ์๋์ ๋ชจ๋ ํด๋์ค๋ค์ ํด๋์ค ์ด๋ฆ๋ง์ผ๋ก type ์ ์ง์ ํ ์ ์์ต๋๋ค.
โข
typeAliases - package ์ค์ 
<resultMap id="๋งตid" type="ํจํค์ง๋ช
.ํด๋์ค๋ช
">
</resultMap>
XML
๋ณต์ฌ
โข
typeAliases - package ์ค์ 
<!-- <resultMap id="๋งตid" type="ํจํค์ง๋ช
.ํด๋์ค๋ช
"> -->
<resultMap id="๋งตid" type="ํด๋์ค๋ช
">
</resultMap>
XML
๋ณต์ฌ
mybatis-config.xml ๋ง์ด๋ฐํฐ์ค ์ค์ ํ์ผ์ ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ ,
application.properties ์ ์์ฑ์ผ๋ก ๋ฐ๋ก ์ ์ฉํ ์๋ ์์ต๋๋ค.
# Mybatis ์ค์
# ์ปฌ๋ผ๋ช
์ ๋ณ์๋ช
์ผ๋ก ์๋๋งคํ : board_no โก boardNo
mybatis.configuration.map-underscore-to-camel-case=true
# resultType ์์ฑ์์ dto ๊ฐ์ฒด (ํจํค์ง.ํด๋์ค๋ช
) โก (ํด๋์ค๋ช
)
mybatis.type-aliases-package=com.aloha.mybatis.dto
# Mybatis ๋งคํผ ํ์ผ ๊ฒฝ๋ก : ~/๋ฉ์ธํจํค์ง/mapper/**Mapper.xml
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
Java
๋ณต์ฌ
@Alias ์ด๋
ธํ
์ด์
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํ ๊ฐ ๊ฐ์ฒด์์, @Alias ์ด๋
ธํ
์ด์
์ผ๋ก ๋ณ์นญ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ
package com.aloha.mybaits.dto;
...
@Data
@Alias("Users")
public class Users {
private Long no;
private String username;
private String password;
private String name;
private String email;
private Date createdAt;
private Date updatedAt;
private int enabled;
}
Java
๋ณต์ฌ
โข
@Alias("Users") ์ค์ 
<!-- โญ typeAliases ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ - ํจํค์ง๋ช
.ํด๋์ค๋ช
-->
<select id="select" resultType="com.aloha.mybatis.dto.Users">
SELECT *
FROM user
WHERE username = #{username}
</select>
XML
๋ณต์ฌ
โข
@Alias("Users") ์ค์ 
<!-- โญ typeAliases ์ค์ ํ ๊ฒฝ์ฐ - ๋ณ์นญ (Users) -->
<select id="select" resultType="Users">
SELECT *
FROM user
WHERE username = #{username}
</select>
XML
๋ณต์ฌ
<id>
๊ธฐ๋ณธ ํค๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์์
๋๋ค.
์์ฑ | ์ค๋ช
|
property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
column | SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ์
๋๋ค. |
javaType | (์ ํ ์ฌํญ) ๋งคํํ Java ํ์
์
๋๋ค. |
jdbcType | (์ ํ ์ฌํญ) ๋งคํํ JDBC ํ์
์
๋๋ค. |
typeHandler | (์ ํ ์ฌํญ) ์ฌ์ฉ์ ์ ์ ํ์
ํธ๋ค๋ฌ์
๋๋ค. |
<result>
์ผ๋ฐ ์์ฑ์ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์์
๋๋ค.
์์ฑ | ์ค๋ช
|
property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
column | SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ์
๋๋ค. |
javaType | (์ ํ ์ฌํญ) ๋งคํํ Java ํ์
์
๋๋ค. |
jdbcType | (์ ํ ์ฌํญ) ๋งคํํ JDBC ํ์
์
๋๋ค. |
typeHandler | (์ ํ ์ฌํญ) ์ฌ์ฉ์ ์ ์ ํ์
ํธ๋ค๋ฌ์
๋๋ค. |
<association>
1:1 ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์์
๋๋ค.
์์ฑ | ์ค๋ช
|
property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
javaType | ์ฐ๊ด๋ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค. |
columnPrefix | (์ ํ ์ฌํญ) ์ด ์ด๋ฆ์ ์ ๋์ฌ์
๋๋ค. |
select | (์ ํ ์ฌํญ) ๋ณ๋์ select ๋ฌธ์ ์ง์ ํฉ๋๋ค. |
resultMap | (์ ํ ์ฌํญ) ์ค์ฒฉ๋ resultMap์ ID์
๋๋ค. |
notNullColumn | (์ ํ ์ฌํญ) null์ด ์๋ ์ด์ ์ง์ ํฉ๋๋ค. |
fetchType | (์ ํ ์ฌํญ) lazy ๋๋ eager ๋ก๋ฉ์ ์ง์ ํฉ๋๋ค. |
<collection>
1:N ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์์
๋๋ค.
์์ฑ | ์ค๋ช
|
property | Java ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์
๋๋ค. |
ofType | ์ฐ๊ด๋ Java ํด๋์ค์ ์ ์ฒด ์ด๋ฆ์
๋๋ค. |
columnPrefix | (์ ํ ์ฌํญ) ์ด ์ด๋ฆ์ ์ ๋์ฌ์
๋๋ค. |
select | (์ ํ ์ฌํญ) ๋ณ๋์ select ๋ฌธ์ ์ง์ ํฉ๋๋ค. |
resultMap | (์ ํ ์ฌํญ) ์ค์ฒฉ๋ resultMap์ ID์
๋๋ค. |
notNullColumn | (์ ํ ์ฌํญ) null์ด ์๋ ์ด์ ์ง์ ํฉ๋๋ค. |
fetchType | (์ ํ ์ฌํญ) lazy ๋๋ eager ๋ก๋ฉ์ ์ง์ ํฉ๋๋ค. |
์ฃผ์ ๊ธฐ๋ฅ
1.
๊ฐ์ฒด ๋งคํ (Object Mapping)
2.
1:1 ์กฐ์ธ (One-to-One Join)
3.
1:N ์กฐ์ธ (One-to-Many Join)
4.
๋ค์ค ๋งคํ (Multiple Mapping)
5.
์์ ๋งคํ (Inheritance Mapping)
6.
๋ณตํฉ ํค ๋งคํ (Composite Key Mapping)
7.
๋ค์์คํ์ด์ค ์ฌ์ฉ (Namespace Usage)
8.
์๋ ๋งคํ (Auto Mapping)
resultMap์ MyBatis์์ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฅผ ํตํด ๋ค์ํ ๋งคํ ์์
์ ์ํํ ์ ์์ต๋๋ค.ย
1. ๊ฐ์ฒด ๋งคํ (Object Mapping)
SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์ ์์ฑ์ ๋งคํํฉ๋๋ค. ๊ฐ ์ปฌ๋ผ์ ๊ฐ์ฒด์ ์์ฑ์ ๋งคํํ ์ ์์ต๋๋ค.
<resultMap id="UserMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="enabled" column="enabled"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
</resultMap>
XML
๋ณต์ฌ
2. 1:1 ์กฐ์ธ (One-to-One Join)
๋ค๋ฅธ ํ
์ด๋ธ๊ณผ์ 1:1 ๊ด๊ณ๋ฅผ ๋งคํํฉ๋๋ค.ย associationย ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๊ฐ์ฒด์์ ๊ด๊ณ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
<resultMap id="UserMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="enabled" column="enabled"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<association property="profile" javaType="Profile">
<id property="id" column="profile_id"/>
<result property="bio" column="bio"/>
<result property="website" column="website"/>
</association>
</resultMap>
XML
๋ณต์ฌ
3. 1:N ์กฐ์ธ (One-to-Many Join)
๋ค๋ฅธ ํ
์ด๋ธ๊ณผ์ 1:N ๊ด๊ณ๋ฅผ ๋งคํํฉ๋๋ค.ย collectionย ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์
์์ฑ์ ์ ์ํ ์ ์์ต๋๋ค.
<resultMap id="UserMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="enabled" column="enabled"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<collection property="roles" ofType="Role">
<id property="id" column="role_id"/>
<result property="name" column="role_name"/>
</collection>
</resultMap>
XML
๋ณต์ฌ
4. ๋ค์ค ๋งคํ (Multiple Mapping)
์ฌ๋ฌ ํ
์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ๊ฐ์ฒด์ ๋งคํํ ์ ์์ต๋๋ค.ย association๊ณผย collection์ ์กฐํฉํ์ฌ ๋ณต์กํ ๋งคํ์ ์ํํ ์ ์์ต๋๋ค.
<resultMap id="UserMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="enabled" column="enabled"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<association property="profile" javaType="Profile">
<id property="id" column="profile_id"/>
<result property="bio" column="bio"/>
<result property="website" column="website"/>
</association>
<collection property="roles" ofType="Role">
<id property="id" column="role_id"/>
<result property="name" column="role_name"/>
</collection>
</resultMap>
XML
๋ณต์ฌ
5. ์์ ๋งคํ (Inheritance Mapping)
์์ ๊ด๊ณ๋ฅผ ๋งคํํ ์ ์์ต๋๋ค.ย discriminatorย ์์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ด๊ณ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
<resultMap id="vehicleMap" type="Vehicle">
<id property="id" column="id"/>
<result property="make" column="make"/>
<result property="model" column="model"/>
<discriminator javaType="string" column="type">
<case value="car" resultType="Car"/>
<case value="truck" resultType="Truck"/>
</discriminator>
</resultMap>
XML
๋ณต์ฌ
6. ๋ณตํฉ ํค ๋งคํ (Composite Key Mapping)
๋ณตํฉ ํค๋ฅผ ๋งคํํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ปฌ๋ผ์ ํ๋์ ํค๋ก ๋งคํํ ์ ์์ต๋๋ค.
<resultMap id="orderMap" type="Order">
<id property="orderId" column="order_id"/>
<id property="productId" column="product_id"/>
<result property="quantity" column="quantity"/>
<result property="price" column="price"/>
</resultMap>
XML
๋ณต์ฌ
7. ๋ค์์คํ์ด์ค ์ฌ์ฉ (Namespace Usage)
๋ค๋ฅธย resultMap์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.ย extendsย ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธย resultMap์ ํ์ฅํ ์ ์์ต๋๋ค.
<resultMap id="baseUserMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
<resultMap id="extendedUserMap" extends="baseUserMap">
<result property="name" column="name"/>
<result property="email" column="email"/>
</resultMap>
XML
๋ณต์ฌ
8. ์๋ ๋งคํ (Auto Mapping)
MyBatis๋ ์๋ ๋งคํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ SQL ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก Java ๊ฐ์ฒด์ ๋งคํํ ์ ์์ต๋๋ค.ย autoMappingย ์์ฑ์ ์ฌ์ฉํ์ฌ ์๋ ๋งคํ์ ํ์ฑํํ ์ ์์ต๋๋ค.
<resultMap id="UserMap" type="User" autoMapping="true">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="enabled" column="enabled"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
</resultMap>
XML
๋ณต์ฌ
resultMap์ ์ฌ์ฉํ๋ฉด MyBatis์์ ๋ค์ํ ๋งคํ ์์
์ ์ํํ ์ ์์ต๋๋ค. ๊ฐ์ฒด ๋งคํ, 1:1 ์กฐ์ธ, 1:N ์กฐ์ธ, ๋ค์ค ๋งคํ, ์์ ๋งคํ, ๋ณตํฉ ํค ๋งคํ, ๋ค์์คํ์ด์ค ์ฌ์ฉ, ์๋ ๋งคํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ณต์กํ SQL ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ ๋ฐ์ดํฐ ์ ์ก์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ฃผ์ ์์
โข
์กฐ์ธ
โฆ
1:1 ์กฐ์ธ - association
โฆ
1:N ์กฐ์ธ - collection
์กฐ์ธ
โข
1:1 ์กฐ์ธ - association
โข
1:N ์กฐ์ธ - collection
์์ ๊ฐ์ฒด ๋ฐ ํ ์ด๋ธ
โข
user.sql
โข
user_auth.sql
โข
board.sql
โข
Users.java
โข
UserAuth.java
user.sql
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`NO` bigint NOT NULL AUTO_INCREMENT,
`ID` VARCHAR(255) NOT NULL COMMENT 'UK',
`USERNAME` varchar(100) NOT NULL,
`PASSWORD` varchar(200) NOT NULL,
`NAME` varchar(100) NOT NULL,
`EMAIL` varchar(200) DEFAULT NULL,
`CREATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATED_AT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ENABLED` int DEFAULT 1,
PRIMARY KEY (`NO`)
) COMMENT='ํ์';
SQL
๋ณต์ฌ
user_auth.sql
DROP TABLE IF EXISTS `user_auth`;
CREATE TABLE `user_auth` (
no bigint NOT NULL AUTO_INCREMENT -- ๊ถํ๋ฒํธ
`id` VARCHAR(255) NOT NULL COMMENT 'UK',
, username varchar(100) NOT NULL -- ์์ด๋
, auth varchar(100) NOT NULL -- ๊ถํ (ROLE_USER, ROLE_ADMIN, ...)
, PRIMARY KEY(no)
);
SQL
๋ณต์ฌ
board.sql
DROP TABLE IF EXISTS `board`;
CREATE TABLE `board` (
`no` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'PK',
`id` VARCHAR(255) NOT NULL COMMENT 'UK',
`title` VARCHAR(100) NOT NULL COMMENT '์ ๋ชฉ',
`user_no` BIGINT NOT NULL COMMENT 'ํ์PK',
`content` TEXT NULL COMMENT '๋ด์ฉ',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '๋ฑ๋ก์ผ์',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '์์ ์ผ์'
);
ALTER TABLE `board` ADD CONSTRAINT `FK_users_TO_board_1` FOREIGN KEY (
`user_no`
)
REFERENCES `users` (
`no`
)
ON DELETE CASCADE
;
SQL
๋ณต์ฌ
Users.java
@Data
public class Users {
private Long no;
private String id;
private String username;
private String password;
private String name;
private String email;
private Date createdAt;
private Date updatedAt;
private int enabled;
private List<UserAuth> authList;
public Users() {
this.id = UUID.randomUUID().toString();
}
}
Java
๋ณต์ฌ
UserAuth.java
@Data
public class UserAuth {
private Long no;
private String id;
private String username;
private String auth;
private Date createdAt;
private Date updatedAt;
public UserAuth() {
this.id = UUID.randomUUID().toString();
}
}
Java
๋ณต์ฌ
Board.java
@Data
@AllArgsConstructor
@Builder
public class Board {
private Long no;
private String id;
private String title;
private Long userNo;
private String content;
private Date createdAt;
private Date updatedAt;
// ์ ์
Users user;
public Board() {
this.id = UUID.randomUUID().toString();
}
}
Java
๋ณต์ฌ
1:1 ์กฐ์ธ - association
association
MyBatis์์ 1:1 ๊ด๊ณ๋ฅผ ๋งคํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์์
๋๋ค. ์ด๋ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ๋งคํํ ๋, ๋ค๋ฅธ ๊ฐ์ฒด์์ 1:1 ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐฉ๋ฒ
โข
๋ฐฉ๋ฒ 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ์์ฑ
โข
๋ฐฉ๋ฒ 2 - 2๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ
board ํ
์ด๋ธ๊ณผ user ํ
์ด๋ธ์ 1:1 ๋ก ์กฐ์ธํ์ฌ,
board ํ
์ด๋ธ์ user_no ๋ก user ํ
์ด๋ธ์ no (PK) ์ฐธ์กฐํ์ฌ ์กฐํํฉ๋๋ค.
์ด ๋, Board ๊ฐ์ฒด ์์ ํ๋(๋ฉค๋ฒ๋ณ์)์ธ Users ๊ฐ์ฒด์ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํฉ๋๋ค.
์ฌ๊ธฐ์๋, ๊ฒ์๊ธ ์ ๋ณด ์กฐํ ์, ์ฌ์ฉ์ ์ ๋ณด(์ด๋ฆ)์ ์ฐธ์กฐํ์ฌ ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
๋ฐฉ๋ฒ 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ์์ฑ
<resultMap id="BoardMap" type="Board">
<!-- Board ํ๋ ๋งคํ -->
<id property="no" column="no" />
<result property="id" column="id" />
<result property="title" column="title" />
<result property="content" column="content" />
<result property="userNo" column="user_no" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<!-- Users ๊ฐ์ฒด ๋งคํ -->
<association property="user" javaType="Users">
<id property="no" column="user_no" />
<result property="name" column="name" />
<result property="username" column="username"/>
</association>
</resultMap>
XML
๋ณต์ฌ
<select id="list" resultMap="BoardMap">
SELECT b.*
,u.no user_no
,u.name
,u.username
FROM board b JOIN user u ON b.user_no = u.no
</select>
XML
๋ณต์ฌ
๋ฐฉ๋ฒ 2 - 2๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ
<resultMap id="BoardMap" type="Board">
<!-- Board ํ๋ ๋งคํ -->
<id property="no" column="no" />
<result property="id" column="id" />
<result property="title" column="title" />
<result property="content" column="content" />
<result property="userNo" column="user_no" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<!-- Users ๊ฐ์ฒด ๋งคํ -->
<association property="user" select="selectUser" column="user_no" ofType="com.aloha.security_method.domain.Users">
<id property="no" column="user_no" />
<result property="name" column="name" />
<result property="username" column="username"/>
</association>
</resultMap>
XML
๋ณต์ฌ
association
โข
property:
โฆ
์ฃผ ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์์ฑ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์์ฑ์
๋๋ค.
โฆ
์ฌ๊ธฐ์๋, Board ๊ฐ์ฒด์ Users user; ๋ณ์๋ก ์ ์ธ๋์ด ์์ต๋๋ค.
โข
select
โฆ
์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์กฐํํ๊ธฐ ์ํ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์ฟผ๋ฆฌ๋ ๋ค๋ฅธ ๋งคํผ ๋ฉ์๋๋ก ์ ์๋์ด ์์ด์ผ ํฉ๋๋ค.
โฆ
์ฌ๊ธฐ์๋, selectUser select ํ๊ทธ id ๋ก ์ฟผ๋ฆฌ๊ฐ ์ง์ ๋์ด ์์ต๋๋ค.
โข
column
โฆ
์ฃผ ๊ฐ์ฒด์ ์ปฌ๋ผ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์ปฌ๋ผ์ ๊ฐ์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โฆ
์ฌ๊ธฐ์๋, board ํ
์ด๋ธ์ user_no ๋ฅผ ์ง์ ํ์ฌ, ์๋ธ์ฟผ๋ฆฌ์ ์ ๋ฌํ์ฌ ์กฐ์ธํฉ๋๋ค.
โข
ofType
โฆ
์ฐ๊ด๋ ๊ฐ์ฒด์ ํ์
์ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์์ฑ์ ์ฐ๊ด๋ ๊ฐ์ฒด์ Java ํด๋์ค ํ์
์ ์ง์ ํฉ๋๋ค.
โฆ
์ฌ๊ธฐ์๋, Users ๊ฐ์ฒด๋ก ๋งคํ๋๋๋ก ์ง์ ํฉ๋๋ค.
โข
๋ฉ์ธ ์ฟผ๋ฆฌ
<select id="list" resultMap="BoardMap">
SELECT *
FROM board
</select>
XML
๋ณต์ฌ
โข
์๋ธ ์ฟผ๋ฆฌ
โฆ
resultType ์ผ๋ก ์ง์
โฆ
resultMap ์ผ๋ก ์ง์
โข
resultType ์ผ๋ก ์ง์
<select id="selectUser" resultType="Users">
SELECT u.no user_no
,u.*
FROM user
WHERE user_no= #{user_no}
</select>
XML
๋ณต์ฌ
โข
resultMap ์ผ๋ก ์ง์
<select id="selectUser" resultMap="UserMap">
SELECT u.no user_no
,u.*
FROM user
WHERE user_no= #{user_no}
</select>
XML
๋ณต์ฌ
(UserMap ์ ์์ง ๋ฏธ๊ตฌํ
๋ค์ 1:N ์กฐ์ธ - collection ์์ ๊ตฌํ)
์ฆ, ๊ฒ์๊ธ ์ ๋ณด์ ํ์ ์ ๋ณด๋ฅผ ์กฐ์ธํ๋ฉด์, ํ์์ ๋ณด์ ๊ถํ ์ ๋ณด๊ฐ ์กฐ์ธ๋์ด ์กฐํํ ์ ์๋ค.
โข
BoardMap
โฆ
UserMap
โช
AuthMap
1:N ์กฐ์ธ - collection
collection
MyBatis์์ย collectionย ์์๋ 1:N ๊ด๊ณ๋ฅผ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์ ์ปฌ๋ ์
์์ฑ์ผ๋ก ๋งคํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์์
1.
user - user_auth JOIN
2.
board - user JOIN
user - user_auth JOIN
๋ฐฉ๋ฒ
โข
๋ฐฉ๋ฒ 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ์์ฑ
โข
๋ฐฉ๋ฒ 2 - 2๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ
user ํ
์ด๋ธ๊ณผ user_auth ํ
์ด๋ธ์ 1:N ๋ก ์กฐ์ธํ์ฌ,
user ํ
์ด๋ธ์ username ๊ณผ user_auth ํ
์ด๋ธ์ username ๋ฅผ ์กฐ์ธ ์กฐ๊ฑด์ผ๋ก ์กฐํํฉ๋๋ค.
์ด ๋, Users ๊ฐ์ฒด ์์ ํ๋(๋ฉค๋ฒ๋ณ์)์ธ List<UserAuth> ์ปฌ๋ ์
์ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํฉ๋๋ค.
์ฌ๊ธฐ์๋, ํ์ ์ ๋ณด ์กฐํ ์, ํ์ ๊ถํ ๋ชฉ๋ก์ ํจ๊ป ์กฐํํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
๋ฐฉ๋ฒ 1 - JOIN ์ฟผ๋ฆฌ ์ง์ ์์ฑ
<resultMap id="UserMap" type="com.aloha.security_method.domain.Users">
<id property="no" column="no" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="enabled" column="enabled" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<collection property="authList" resultMap="authMap"></collection>
</resultMap>
<resultMap id="authMap" type="UserAuth">
<id property="no" column="auth_no" />
<result property="id" column="auth_id" />
<result property="username" column="username" />
<result property="userNo" column="user_no" />
<result property="auth" column="auth" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
</resultMap>
XML
๋ณต์ฌ
<select id="select" resultMap="UserMap">
SELECT u.no
,u.username
,password
,name
,email
,enabled
,u.created_at
,u.updated_at
,auth.no auth_no
,auth.id auth_id
,auth.user_no
,auth.auth auth
FROM user u LEFT OUTER JOIN user_auth auth ON u.username = auth.username
WHERE u.username = #{username}
</select>
XML
๋ณต์ฌ
๋ฐฉ๋ฒ 2 - 2๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ฒฐ
<resultMap id="UserMap" type="com.aloha.security_method.domain.Users">
<id property="no" column="no" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="enabled" column="enabled" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<collection property="authList" select="selectAuthList" column="username" javaType="list" ofType="com.car.ckauto.domain.users.UserAuth" ></collection>
</resultMap>
XML
๋ณต์ฌ
collection
โข
property:
โฆ
์ฃผ ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์์ฑ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์์ฑ์
๋๋ค.
โฆ
์ฌ๊ธฐ์๋, Users ๊ฐ์ฒด์ List<UserAuth> authList; ๋ณ์๋ก ์ ์ธ๋์ด ์์ต๋๋ค.
โข
select
โฆ
์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์กฐํํ๊ธฐ ์ํ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์ฟผ๋ฆฌ๋ ๋ค๋ฅธ ๋งคํผ ๋ฉ์๋๋ก ์ ์๋์ด ์์ด์ผ ํฉ๋๋ค.
โฆ
์ฌ๊ธฐ์๋, selectAuthList select ํ๊ทธ id ๋ก ์ฟผ๋ฆฌ๊ฐ ์ง์ ๋์ด ์์ต๋๋ค.
โข
column
โฆ
์ฃผ ๊ฐ์ฒด์ ์ปฌ๋ผ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์ปฌ๋ผ์ ๊ฐ์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โฆ
์ฌ๊ธฐ์๋, user ํ
์ด๋ธ์ username ๋ฅผ ์ง์ ํ์ฌ, ์๋ธ์ฟผ๋ฆฌ์ ์ ๋ฌํ์ฌ ์กฐ์ธํฉ๋๋ค.
โข
ofType
โฆ
์ฐ๊ด๋ ๊ฐ์ฒด์ ํ์
์ ์ง์ ํฉ๋๋ค.
โฆ
์ด ์์ฑ์ ์ฐ๊ด๋ ๊ฐ์ฒด์ Java ํด๋์ค ํ์
์ ์ง์ ํฉ๋๋ค.
โฆ
์ฌ๊ธฐ์๋, UserAuth ๊ฐ์ฒด๋ก ๋งคํ๋๋๋ก ์ง์ ํฉ๋๋ค.
โข
๋ฉ์ธ ์ฟผ๋ฆฌ
<select id="select" resultMap="UserMap">
SELECT *
FROM user u
WHERE u.username = #{username}
</select>
XML
๋ณต์ฌ
โข
์๋ธ ์ฟผ๋ฆฌ
<select id="selectAuthList" resultType="UserAuth">
SELECT *
FROM user_auth
WHERE username = #{username}
</select>
XML
๋ณต์ฌ
board - user JOIN
โข
BoardMapper.xml
โข
UserMapper.xml
โข
JOIN ํ
์ด๋ธ ๊ด๊ณ
boad : user = 1 : 1
user : user_auth = 1 : N
BoardMapper.xml
<resultMap id="BoardMap" type="Board">
<!-- Board ํ๋ ๋งคํ -->
<id property="no" column="no" />
<result property="id" column="id" />
<result property="title" column="title" />
<result property="content" column="content" />
<result property="userNo" column="user_no" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<!-- Users ๊ฐ์ฒด ๋งคํ -->
<association property="user" select="selectUser" column="user_no" javaType="com.aloha.security_method.domain.Users"></association>
</resultMap>
XML
๋ณต์ฌ
<select id="list" resultMap="BoardMap">
SELECT b.*
FROM board b
</select>
XML
๋ณต์ฌ
<select id="selectUser" resultMap="com.aloha.security_method.mapper.UserMapper.UserMap">
SELECT *
FROM user u
WHERE u.no = #{user_no}
</select>
XML
๋ณต์ฌ
UserMapper.xml
<resultMap id="UserMap" type="com.aloha.security_method.domain.Users">
<id property="no" column="no" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="enabled" column="enabled" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<collection property="authList" select="selectAuthList" column="username" javaType="list" ofType="com.car.ckauto.domain.users.UserAuth" ></collection>
</resultMap>
XML
๋ณต์ฌ
<select id="select" resultMap="UserMap">
SELECT *
FROM user u
WHERE u.username = #{username}
</select>
XML
๋ณต์ฌ
<select id="selectAuthList" resultType="UserAuth">
SELECT *
FROM user_auth
WHERE username = #{username}
</select>
XML
๋ณต์ฌ
์ด๋ ๊ฒ resultMap ์ผ๋ก ์ฐธ์กฐํ์ฌ JOIN ์ ํ๋ฉด, ๋ค์ค์ JOIN ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
์ฌ๊ธฐ์๋, ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ ์
โข
board : user = 1 : 1
โข
user : user_auth = 1 : N
์ด๋ ๊ฒ ๋ค์ค์ผ๋ก ๊ณ์ธต์ ์ผ๋ก ๊ฒ์๊ธ ๋ชฉ๋ก์ ์กฐํํ ์ ์๋ค.
- BoardMap
- UserMap
- AuthMap (or selectAuthList)
Plain Text
๋ณต์ฌ
Board
โโโ no: 1
โโโ id: 67610565-a89b-11ef-a47a-a8a1596f255e
โโโ title: ์ ๋ชฉ1
โโโ userNo: 3
โโโ content: ๋ด์ฉ1
โโโ createdAt: Fri Nov 22 15:31:27 KST 2024
โโโ updatedAt: Fri Nov 22 15:31:27 KST 2024
โโโ user: Users
โ โโโ no: 3
โ โโโ id: 60b8c64d-a89b-11ef-a47a-a8a1596f255e
โ โโโ username: test
โ โโโ password: $2a$12$TrN..KcVjciCiz.5Vj96YOBljeVTTGJ9AUKmtfbGpgc9hmC7BxQ92
โ โโโ name: ํ
์คํธ
โ โโโ email: test@mail.com
โ โโโ createdAt: Fri Nov 22 15:31:16 KST 2024
โ โโโ updatedAt: Fri Nov 22 15:31:16 KST 2024
โ โโโ enabled: 1
โ โโโ authList: List<UserAuth>
โ โโโ UserAuth
โ โโโ no: 4
โ โโโ id: 64816228-a89b-11ef-a47a-a8a1596f255e
โ โโโ userNo: 1
โ โโโ username: test
โ โโโ auth: ROLE_USER
โ โโโ createdAt: Fri Nov 22 15:31:23 KST 2024
โ โโโ updatedAt: Fri Nov 22 15:31:23 KST 2024
โโโ fileList: null
โโโ deleteFiles: null
Plain Text
๋ณต์ฌ