SELECT * FROM USER
WHERE
col = ?
parameter : [값]
|
SELECT * FROM USER
WHERE
col = 값
|
마이바티스 ORM 프레임워크
SELECT * FROM USER
WHERE
col = ?
parameter : [값]
|
SELECT * FROM USER
WHERE
col = 값
|
iBatis 가동 전 Sqlmap XML 읽기, Caused by: com.ibatis.common.beans.ProbeException:
IBatis 가 가동되기 전, 서브 SqlMap에 있는 XML들을 읽는다.
이때 SqlmapXxxx.xml에 있는 ResultMap 과 해당하는 클래스의 Mapping 확인도 진행된다.
이런 메시지가 뜬다면,
Caused by: com.ibatis.common.beans.ProbeException: There is no WRITEABLE property named ‘leadDay’ in class ‘…domain.showcase.bestseller.BestSellerList’
해당하는 sqlmap에서
확인하도록 한다.
[iBatis] ResultMap 사용 시 “The error happened while setting a property on the result object.” Error 발생!
* error message
Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];
— The error occurred in resource/sql/front/classroom/classroom.front.xml.
— The error occurred while applying a result map.
— Check the front.classroom.evalactStatusRm.
— The error happened while setting a property on the result object.
— Cause: net.sf.cglib.beans.BulkBeanException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
— The error occurred in resource/sql/front/classroom/classroom.front.xml.
— The error occurred while applying a result map.
— Check the front.classroom.evalactStatusRm.
— The error happened while setting a property on the result object.
* cause
SQL Query와 ResultMap의 relation도 다 맞고 넘겨받은 파라메터로 수행한 쿼리도 문제가 없다! 그런데 이 에러가 날 경우가 있다.
이때에는 ResultMap 으로 받을 class 의 data type이 미스 매치 인 경우다!
예를들어 bean class에 private int foo; 라고 선언했고 쿼리에서 select foo… from xxx 라고 되 있는데 foo에 {NULL}이 select 되는 경우 int type에 매핑시킬 수가 없으므로 위와같은 에러가 난다.
* resolution
bean class의 data type을 String으로 하면 문제가 없다. 허나! 실제 data가 int인 경우엔 int로 쓰는게 더 편하겠지?! ㅋㅋ 그렇다면 데이터가 항상 int 값으로 매핑 할 수 있도록 쿼리의 결과를 보장해줘라! 예를들어 select NVL(foo, 0) as foo … from xxx 처럼 말이다!
출처 :
http://blog.naver.com/blackpet/100049375415
에러내용:
Servlet.service() for servlet article threw exception
org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];
이런 에러문구는 resultType 을 찾지 못하는 경우 발생한다.
예를 들면 ibatis sqlMap 설정에서 result 클래스명이 잘못 지정된 경우이거나
ibatis에서 정의한 resultMap 과 java 클래스간 내용이 일치하지 않을 때 발생한다.
일반적인 경우 vo작성시 getter/setter generater를 사용하여 만드는 경우에는 별일이 없지만
직접 작성 또는 수정후 재생성시 getter 또는 setter 메소드가 잘못 생성되었거나 중복되는 경우 위와 같은 에러가 발생한다.
특히 내부변수값을 변경하고자 하는 경우 자동생성시는 관련 setter/getter 메소드를 삭제후 구동하여야….ㅋ..
출처 : http://blog.naver.com/civan?Redirect=Log&logNo=150028875561
* result Type이 int와 같은 상수일경우 return값이 null이면 같은 에러
ibatis(mybatis) 쿼리 xml을 작성할때 조건문이 필요할 경우가 생긴다.
ibatis(mybatis)의 장점은 조건을 주면서 동적쿼리를 생성할수 있다는 장점이 있다.
즉, 프로시저를 사용하지 않아도 어느정도의 출력이 가능하다는 이야기임.
다음과 같은 테이블이 있다고 가정하자
– board
id | int |
title | varchar |
content | text |
create_id | varchar |
update_id | varchar |
위의 기준으로 생성된 테이블에서 예를들기 위해 몇가지 조건에 따라 비교를 하도록 하겠음
1. update_id null/not null 체크 조건문
– ibatis(isNull / isNotNull)
1
2
3
4
5
6
|
< isNull property = "update_id" > 조건절 </ isNull > < isNotNull property = "update_id" > 조건절 </ isNotNull > |
-mybatis(if / choose when otherwise)
1
2
3
4
5
6
|
< if test = "update_id == null" > 조건절 </ if > < if test = "update_id != null" > 조건절 </ if > |
또는
1
2
3
4
5
6
7
8
|
< choose > < when test = "update_id == null" > null 조건절 </ when > < otherwise > not null 조건절 </ otherwise > </ choose > |
2. update_id 공백유무 체크 조건문
– ibatis(isEmpty / isNotEmpty)
1
2
3
4
5
6
|
< isEmpty property = "update_id" > 조건절 </ isEmpty > < isNotEmpty property = "update_id" > 조건절 </ isNotEmpty > |
-mybatis(if / choose when otherwise)
1
2
3
4
5
6
|
< if test = "update_id == ''" > 조건절 </ if > < if test = "update_id != ''" > 조건절 </ if > |
또는
1
2
3
4
5
6
7
8
|
< choose > < when test = "update_id == ''" > 공백일경우 조건절 </ when > < otherwise > 공백 아닐경우 조건절 </ otherwise > </ choose > |
mybatis의 공백조건 체크를 위와같이 조건을 주었는데도 체크가 되지 않을 경우에
하단 내용 처럼
쌍따옴표(“”) -> 홑따옴표(”) and 홑따옴표(”) -> 쌍따옴표(“”)로 변경을 해주자
문자열쪽에서 문제가 발생하는거 같음
3. id(숫자) 비교체크 조건문
– ibatis(isGreaterThan/isGreaterEqual/isLessThan/isLessEqual)
1
2
3
4
5
6
7
8
9
10
11
12
|
< isGreaterThan property = "id" compareValue = "3" > 3보다 크다 </ isGreaterThan > < isGreaterEqual property = "id" compareValue = "3" > 3보다 크거나 같다 </ isGreaterEqual > < isLessThan property = "id" compareValue = "3" > 3보다 작다 </ isLessThan > < isLessEqual property = "id" compareValue = "3" > 3보다 작거나 같다 </ isLessEqual > |
– mybatis(if/choose when otherwise)
1
2
3
4
5
6
7
8
9
10
11
12
|
< if test='id > 3'> 3보다 크다 </ if > < if test='id >= 3'> 3보다 크거나 같다 </ if > < if test = 'id < 3' > 3보다 작다 </ if > < if test = 'id <= 3' > 3보다 작거나 같다 </ if > |
또는
1
2
3
4
5
6
7
8
9
10
11
|
< choose > < when test='id > 3'> 3보다 크다 </ when > < when test = 'id == 3' > 3이다 </ when > < when test = 'id < 3' > 3보다 작다 </ when > </ choose > |
4. 검색 조건 선택후 검색버튼 클릭했을경우라고 가정
(문자열) 비교체크 조건문
– ibatis(isEqual / isNotEqual + compareValue)
1
2
3
4
5
6
|
< isEqual property = "search_key" compareValue = "title" > 조건절 </ isEqual > < isNotEqual property = "search_key" compareValue = "content" > 조건절 </ isNotEqual > |
– mybatis는 공백조건의 경우와 동일하므로 생략
위와같이 비교를 들 수 있을 것이다.
본인의 생각으로
ibatis는 일일이 태그를 조건문 갯수에 따라 추가를 해줘야 하는 번거로움이 있는 반면,
mybatis는 JSTL처럼 일반적인 방식으로 사용을 해줄수 있어 라인수도 줄고 동적쿼리 작성하는데 코드작성이 좀더 수월한거 같다.
※ 만약 하나 이상의 조건을 mybatis에서 줄경우
&& = and
|| = or
로 하여서 여러개의 property로 비교가 가능하다.
쿼리문 열심히짜고 잘동작하는데 왜 이런 에러가나나 ..했는데..^-^;
getSqlMap().queryForList
로 받아야 하는 것을.
getSqlMap().queryForObject
로 받았기 때문이다!
queryForObject – > queryForList
List로 고쳐주면 끝…(__)!!
아이바티스에서 like 검색할 일이 생겼는데
삽질을 경험하게 되었다.
DBMS마다 약간의 문법차이가 있었던 것이다 !! ㅠㅠ ..
오라클은 like '%'||#value#||'%' Mysql은 like concat('%','#value#','%') Sysbase, SQL SERVER like '%' + #value# + '%'
우선 mybatis와 ibatis에서는 동적태그를 기본적으로 지원을 합니다.
즉, 프로시저로 짜여져 있는 로직을 동적태그를 사용하여 쿼리로 변경할 수 있습니다.
장점이 있을수도 있지만 자칫 잘못 사용하면 큰 문제를 일으킬수 있다는 단점이있을수 있다는…
양날의 칼날과 같다는것만 알아두시면 되겠습니다.
ibatis 비교문 지원 태그
isNull : "널일경우"
isNotNull : "널이아닐경우"
isEmpty : "공백일경우"
isNotEmpty : "공백이아닐경우"
isGreaterTan : ">"
isGreaterEqual : ">="
isLessThan : "<"
isLessEqual : "<="
isEqual : "=="
isNotEqual : "!="
mybatis 비교문 지원 태그
if : 단일조건문
choose when otherwise : 다중조건문
위와같이 각 mybatis(ibatis) 별 동적태그를 지원합니다.
ibatis에 비해 mybatis의 비교문태그가 간단해졌습니다.
ibatis에서 지원되는 태그들 if문과 choose문만을 이용하여 비교가 가능해 진것이죠.
일반 자바코드와 ibatis/mybatis 별로 비교문 예를 들어보도록 하겠습니다.
Null 비교문
if(stringProperty == null) { // code here } <!--ibatis --> <isNull property="stringProperty"> 조건문 </isNull> <!--mybatis--> <if test="stringProperty == null"> 조건문 </if>
NOT NULL 비교문
if(stringProperty != null) { // code here } <!--ibatis --> <isNotNull property="stringProperty"> 조건문 </isNotNull> <!--mybatis(1)--> <if test="stringProperty != null"> 조건문 </if> <!--mybatis(2)--> <choose> <when test="stringProperty == null"> NULL일경우 조건문 </when> <otherwise> NULL이 아닐경우 조건문 </otherwise> </choose>
공백일경우 비교문
if(stringProperty.equals("")) { //code here } <!--ibatis--> <isEmpty property="stringProperty"> 조건문 </isEmpty> <!--mybatis--> <if test="stringProperty == ''"> 조건문 </if>
공백이 아닐경우 비교문
if(!stringProperty.equals("")) { //code here } <!--ibatis--> <isNotEmpty property="stringProperty"> 조건문 </isNotEmpty> <!--mybatis(1)--> <if test="stringProperty != ''"> 조건문 </if> <!--mybatis(2)--> <choose> <when test="stringProperty == ''"> 공백일경우 조건문 </when> <otherwise> 공백 아닐경우 조건문 </otherwise> </choose>
숫자비교문(1)
if(numberProperty > 5) { //code here } <!--ibatis--> <isGreaterThan property="numberProperty" compareValue="5"> 5보다 클경우 조건문 </isGreaterThan> <!--mybatis--> <if test='id > 5'> 5보다 클경우 조건문 </if>
숫자비교문(2)
if(numberProperty >= 5) { //code here } <!--ibatis--> <isGreaterEqual property="numberProperty" compareValue="5"> 5보다 크거나같을경우 조건문 </isGreaterEqual> <!--mybatis--> <if test='id >= 5'> 5보다 크거나같을경우 조건문 </if>
숫자비교문(3)
if(numberProperty < 5) { //code here } <!--ibatis--> <isLessThan property="numberProperty" compareValue="5"> 5보다 작을경우 조건문 </isLessThan> <!--mybatis--> <if test='id < 5'> 5보다 작을경우 조건문 </if>
숫자비교문(4)
if(numberProperty <= 5) { //code here } <!--ibatis--> <isLessEqual property="numberProperty" compareValue="5"> 5보다 작거나같을경우 조건문 </isLessEqual> <!--mybatis--> <if test='id <= 5'> 5보다 작거나같을경우 조건문 </if>
문자열 비교(1)
if(stringProperty.equals("title")) { //code here } <!--ibatis--> <isEqual property="stringProperty" compareValue="title"> stringProperty 속성값이 "title"일 경우 </isEqual> <!--mybatis--> <if test='stringProperty == "title"'> stringProperty 속성값이 "title"일 경우 </if>
문자열 비교(2)
if(!stringProperty.equals("title")) { //code here } <!--ibatis--> <isNotEqual property="stringProperty" compareValue="title"> stringProperty 속성값이 "title"이 아닐경우 </isNotEqual> <!--mybatis--> <if test='stringProperty != "title"'> stringProperty 속성값이 "title"이 아닐경우 </if>
복잡한 형태의 쿼리를 만들다 보면 로직에따라 if문을 추가해야 한다던지
if else 문을 추가해야할 경우가 있다.
myBatis는 이를위해 동적 쿼리를 위한 기능을 제공한다.
그중에서도 가장 많이 사용되는 if 문과 choose문을 살펴보자.
동적쿼리는 XML 매퍼에 지정하게 되는데, JSTL을 사용해봤던 사람들이라면 큰 어려움이 없는 문법이다.
1. IF문
Continue reading →
1) <isNotEqual>
– 변수에 값이 지정 된 값과 같지 않을 경우 명령문을 실행하는 명령어 입니다.
if( num != 0 ) 과 같은 의미의 명령어 입니다.
2) 사용방법
<isNotEqual prepend=”AND” property=”비교 할 변수 명” compareValue=”비교 할 값”>
NAME LIKE ‘%’ || #searchKeyword# || ‘%’
</isNotEqual>
<isNotEqual prepend=”AND” property=”searchCondition” compareValue=”1″>
NAME LIKE ‘%’ || #searchKeyword# || ‘%’
</isNotEqual>