Mybatis TypeHandler를 사용해 데이터 변환하기
- Board 테이블에 컬럼 추가
DEL_YN이라고 컬럼 이름을 정하고 데이터 유형은 CHARD, 길이는 1, default 값은 N, 코멘트는 삭제여부 - Board 도메인에 delYn 추가
@Data
public class Board {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
private Date regDate;
private boolean delYn;
}
- getList 쿼리에 B.DEL_YN 컬럼 추가
<select id="getList" parameterType="com.example.examplespring.framework.data.domain.PageRequestParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE,
B.DEL_YN
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(parameter.keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(parameter.boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
<!-- 페이징 (예 : 1 페이지 20개 가져오기) -->
LIMIT #{pageRequest.limit}, #{pageRequest.offset}
</select>
- StringValueBooleanTyepHandler 클래스 추가
이 클래스는 SELECT, INSERT, UPDATE 등 데이터를 자유롭게 변환해서 사용하기 위한 클래스로
String Y, N을 booelan true, false로 데이터를 변환하는 핸들러
public class StringValueBooleanTypeHandler implements TypeHandler<Boolean> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
// boolean 값이 true일 경우 Y, false일 경우 N로 바꿈
preparedStatement.setString(i, BooleanUtils.toString(parameter, "Y", "N"));
}
@Override
public Boolean getResult(ResultSet resultSet, String columnName) throws SQLException {
// 자동으로 Y, N 값을 boolean으로 바꿈
return BooleanUtils.toBoolean(resultSet.getString(columnName));
}
@Override
public Boolean getResult(ResultSet resultSet, int columnIndex) throws SQLException {
return BooleanUtils.toBoolean(resultSet.getString(columnIndex));
}
@Override
public Boolean getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
return BooleanUtils.toBoolean(callableStatement.getString(columnIndex));
}
}
- Board.xml에 resultMap을 선언하고 getList의 resultMap 지정
<resultMap id="getListResultMap" type="com.example.examplespring.mvc.domain.Board">
<result column="DEL_YN" property="delYn" typeHandler="com.example.examplespring.configuration.mybatis.typehandler.StringValueBooleanTypeHandler"/>
</resultMap>
<select id="getList" parameterType="com.example.examplespring.framework.data.domain.PageRequestParameter" resultMap="getListResultMap">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE,
B.DEL_YN
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(parameter.keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(parameter.boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
<!-- 페이징 (예 : 1 페이지 20개 가져오기) -->
LIMIT #{pageRequest.limit}, #{pageRequest.offset}
</select>
- 결과
목록 조회를 할 경우 DB에 있는 Y, N 값이 true, false로 변경되어 delYn에 나타나는 것을 볼 수 있음

- 저장하는 부분에 delYn를 추가하기 위해 BoardParameter 클래스, Board.xml 수정
@Data
public class BoardParameter {
private int boardSeq;
private String title;
private String contents;
private boolean delYn;
public BoardParameter() {
}
public BoardParameter(String title, String contents) {
this.title = title;
this.contents = contents;
}
}
<insert id="save" parameterType="com.example.examplespring.mvc.parameter.BoardParameter" useGeneratedKeys="true" keyProperty="boardSeq">
INSERT INTO T_BOARD
(
B.BOARD_TYPE,
TITLE,
CONTENTS,
REG_DATE,
DEL_YN
)
VALUES
(
#{boardType.code},
#{title},
#{contents},
NOW(),
#{delYn, typeHandler=com.example.examplespring.configuration.mybatis.typehandler.StringValueBooleanTypeHandler}
)
</insert>
- 결과
저장 시, true를 선택해 저장하면 Y로 DB에 들어와 저장되게 됨

'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] 컨트롤러에서 파라미터를 받는 방법들 (0) | 2022.09.02 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] 파일 업로드와 썸네일 생성 (0) | 2022.08.27 |
[자바 스프링부트 활용 웹개발 실무용] cron으로 로컬, 개발, 운영 설정값 프로퍼티에 따른 스케줄러 사용 (0) | 2022.08.18 |
[자바 스프링부트 활용 웹개발 실무용] @PostConstruct로 로컬, 개발, 운영 설정값 프로퍼티 클래스 관리 (0) | 2022.08.17 |
[자바 스프링부트 활용 웹개발 실무용] HandleMethod로 공통 로그인 체크 (0) | 2022.08.16 |
Mybatis TypeHandler를 사용해 데이터 변환하기
- Board 테이블에 컬럼 추가
DEL_YN이라고 컬럼 이름을 정하고 데이터 유형은 CHARD, 길이는 1, default 값은 N, 코멘트는 삭제여부 - Board 도메인에 delYn 추가
@Data
public class Board {
private int boardSeq;
private BoardType boardType;
private String title;
private String contents;
private Date regDate;
private boolean delYn;
}
- getList 쿼리에 B.DEL_YN 컬럼 추가
<select id="getList" parameterType="com.example.examplespring.framework.data.domain.PageRequestParameter" resultType="com.example.examplespring.mvc.domain.Board">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE,
B.DEL_YN
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(parameter.keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(parameter.boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
<!-- 페이징 (예 : 1 페이지 20개 가져오기) -->
LIMIT #{pageRequest.limit}, #{pageRequest.offset}
</select>
- StringValueBooleanTyepHandler 클래스 추가
이 클래스는 SELECT, INSERT, UPDATE 등 데이터를 자유롭게 변환해서 사용하기 위한 클래스로
String Y, N을 booelan true, false로 데이터를 변환하는 핸들러
public class StringValueBooleanTypeHandler implements TypeHandler<Boolean> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
// boolean 값이 true일 경우 Y, false일 경우 N로 바꿈
preparedStatement.setString(i, BooleanUtils.toString(parameter, "Y", "N"));
}
@Override
public Boolean getResult(ResultSet resultSet, String columnName) throws SQLException {
// 자동으로 Y, N 값을 boolean으로 바꿈
return BooleanUtils.toBoolean(resultSet.getString(columnName));
}
@Override
public Boolean getResult(ResultSet resultSet, int columnIndex) throws SQLException {
return BooleanUtils.toBoolean(resultSet.getString(columnIndex));
}
@Override
public Boolean getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
return BooleanUtils.toBoolean(callableStatement.getString(columnIndex));
}
}
- Board.xml에 resultMap을 선언하고 getList의 resultMap 지정
<resultMap id="getListResultMap" type="com.example.examplespring.mvc.domain.Board">
<result column="DEL_YN" property="delYn" typeHandler="com.example.examplespring.configuration.mybatis.typehandler.StringValueBooleanTypeHandler"/>
</resultMap>
<select id="getList" parameterType="com.example.examplespring.framework.data.domain.PageRequestParameter" resultMap="getListResultMap">
SELECT
B.BOARD_SEQ,
B.BOARD_TYPE,
B.TITLE,
B.CONTENTS,
B.REG_DATE,
B.DEL_YN
FROM T_BOARD B
<where>
<!-- 키워드 검색 -->
<if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(parameter.keyword)">
AND B.TITLE LIKE CONCAT('%', #{keyword}, '%')
</if>
<!-- 게시판 종류 배열 검색 -->
<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(parameter.boardTypes)">
AND B.BOARD_TYPE IN (
<foreach collection="boardTypes" item="value" separator=",">
#{value}
</foreach>
</if>
</where>
ORDER BY B.REG_DATE DESC
<!-- 페이징 (예 : 1 페이지 20개 가져오기) -->
LIMIT #{pageRequest.limit}, #{pageRequest.offset}
</select>
- 결과
목록 조회를 할 경우 DB에 있는 Y, N 값이 true, false로 변경되어 delYn에 나타나는 것을 볼 수 있음

- 저장하는 부분에 delYn를 추가하기 위해 BoardParameter 클래스, Board.xml 수정
@Data
public class BoardParameter {
private int boardSeq;
private String title;
private String contents;
private boolean delYn;
public BoardParameter() {
}
public BoardParameter(String title, String contents) {
this.title = title;
this.contents = contents;
}
}
<insert id="save" parameterType="com.example.examplespring.mvc.parameter.BoardParameter" useGeneratedKeys="true" keyProperty="boardSeq">
INSERT INTO T_BOARD
(
B.BOARD_TYPE,
TITLE,
CONTENTS,
REG_DATE,
DEL_YN
)
VALUES
(
#{boardType.code},
#{title},
#{contents},
NOW(),
#{delYn, typeHandler=com.example.examplespring.configuration.mybatis.typehandler.StringValueBooleanTypeHandler}
)
</insert>
- 결과
저장 시, true를 선택해 저장하면 Y로 DB에 들어와 저장되게 됨

'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] 컨트롤러에서 파라미터를 받는 방법들 (0) | 2022.09.02 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] 파일 업로드와 썸네일 생성 (0) | 2022.08.27 |
[자바 스프링부트 활용 웹개발 실무용] cron으로 로컬, 개발, 운영 설정값 프로퍼티에 따른 스케줄러 사용 (0) | 2022.08.18 |
[자바 스프링부트 활용 웹개발 실무용] @PostConstruct로 로컬, 개발, 운영 설정값 프로퍼티 클래스 관리 (0) | 2022.08.17 |
[자바 스프링부트 활용 웹개발 실무용] HandleMethod로 공통 로그인 체크 (0) | 2022.08.16 |