<form th:action="@{/}" method="get">
<select id="selectSrch" name="selectSrch">
<option value="">전체</option>
<option value="T">제목</option>
<option value="C">내용</option>
</select>
<input id="writeSrch" type="text" name="writeSrch">
<button type="submit" id="btnSrch">확인</button>
</form>
-- HTML --
/* 게시판 전체 조회 */
public List<Map<String, Object>> boardMain(Map<String, Object> requestMap) {
if (requestMap.get("selectSrch") != null) { // 검색조건 값 String으로 변환
String selectSrch = String.valueOf(requestMap.get("selectSrch"));
requestMap.put("selectSrch", selectSrch);
log.warn("selectSrch type: " + selectSrch.getClass() );
} else {
log.warn("null");
}
return boardMapper.boardMain(requestMap);
}
-- SERVICE --
<select id="boardMain" parameterType="map" resultType="map">
<!-- BoardMapper.boardMain : 게시판 조회 -->
SELECT
NO,
TITLE,
COMMENT
FROM
BOARD
WHERE
1=1
<if test="selectSrch == null or selectSrch == ''">
</if>
<if test="selectSrch == '' and writeSrch != null and writeSrch != ''">
AND (TITLE LIKE CONCAT('%', #{writeSrch}, '%') OR COMMENT LIKE CONCAT('%', #{writeSrch}, '%'))
</if>
<if test="selectSrch == 'T' and writeSrch != null and writeSrch != ''">
AND TITLE LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
</if>
<if test="selectSrch == 'C' and writeSrch != null and writeSrch != ''">
AND COMMENT LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
</if>
-- XML --
다음과 같이 소스를 작성해 놨었는데 분명 서비스에서 selectSrch 값을 String으로 변환시켜 줬는데도 프로그램을 실행시키면
[Request processing failed: org.mybatis.spring.MyBatisSystemException] with root cause
java.lang.NumberFormatException: For input string: "C"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
이런 식으로 NumberFormatException 이 떴다.
이유는 OGNL(Object Graph Navigation Language) 인터프리터 문제였다.
Mybatis에서 사용하고 있는 OGNL 중에서 한 글자에 ' '를 씌우면 Char 형식으로 인식한다
한 글자를 String으로 인식시키려면 " "를 써야 한다.
두 글자 이상부터는 ' ' , " " 아무거나 상관없다고 한다.
// 예시
'T' => Char 형식
"T" => String 형식
'TT' , "TT" => String 형식
따라서 위 코드에서 다음과 같이 ' 와 "를 바꿔주면 해결이 된다.
<select id="boardMain" parameterType="map" resultType="map">
<!-- BoardMapper.boardMain : 게시판 조회 -->
SELECT
NO,
TITLE,
COMMENT
FROM
BOARD
WHERE
1=1
<if test='selectSrch == null or selectSrch == ""'>
</if>
<if test='selectSrch == "" and writeSrch != null and writeSrch != ""'>
AND (TITLE LIKE CONCAT('%', #{writeSrch}, '%') OR COMMENT LIKE CONCAT('%', #{writeSrch}, '%'))
</if>
<if test='selectSrch == "T" and writeSrch != null and writeSrch != ""'>
AND TITLE LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
</if>
<if test='selectSrch == "C" and writeSrch != null and writeSrch != ""'>
AND COMMENT LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
</if>
다음과 같이 수정하면 NumberFormatException 이 뜨지 않는다.