Spring/MyBatis
-
[MyBatis] 동적 쿼리 <trim> 개념 및 문법 총 정리2020.04.30
-
[MyBatis] 동적 쿼리 <bind> 문법 총 정리2020.04.26
[MyBatis] 동적 쿼리 <trim> 개념 및 문법 총 정리
<trim>
속성
prefix : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 앞에 붙여준다.
UPDATE board <trim prefix="SET"> username=#{username},password=#{password}</trim>
prefixOverrides : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 앞에 해당하는 문자들이 있으면 자동으로 지워준다.
SELECT * FROM board WHERE id = #{id}
<trim prefixOverrides="OR">OR TT LIKE '%' || #{searchContent} || '%' </if>
suffix : 실행 될 쿼리의 <trim> 문 안에 쿼리 가장 뒤에 붙여준다.
<trim suffix=")"></trim>
suffixOverrides : 실행될 쿼리의 <trim> 문 안에 쿼리 가장 뒤에 해당하는 문자들이 있으면 자동으로 지워준다.
<trim suffixOverrides=","></trim>
문법
<select id="test" resultType="user">
SELECT * FROM user WHERE id = #{id}
<trim prefix="AND (" prefixOverrides="OR" suffix=")">
<if test="para1 != null">
OR para1 = #{data1}
</if>
<if test="para2 != null">
OR para2 = #{data2}
</if>
</trim>
</select>
설명
0.<trim prefix="AND (" prefixOverrides="OR" suffix=")"> 이 부분을 해석하자면
1. 먼저 prefix 속성이 'AND'로 돼있기 때문에 맨 앞에 'AND'가 붙습니다.
2.prefixOverrides 속성이 쿼리 중에 'OR' 텍스트를 찾고, 찾게 되면 'OR' 텍스트를 제거합니다.
3. 그리고 suffix 속성이 <trim> 문 맨 마지막에 ')'를 닫아줍니다.
실행될 쿼리 (para1, para2 값이 들어올 경우)
SELECT * FROM user WHERE id = '119'
AND para1 = 'java119' OR para2 = 'java119'
실전 예제
prefix, suffixOverrides 사용 예시
1. 맨 앞에 'SET' 붙이고 맨 끝에 있는 콤마(,)를 제거하기
<update id="updateUser">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio},</if>
</trim>
WHERE id=#{id}
</update>
prefix, prefixOverrides 사용
2. 맨 앞에 있는 연산자를(AND 또는 OR) 제거하는 경우
<select id="selectInfo" resultType="user">
SELECT * FROM USER
<trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="username != null">AND username=#{username}</if>
<if test="password != null">OR password=#{password}</if>
<if test="email != null">AND email=#{email}</if>
</trim>
</select>
prefix, prefixOverrides, suffixOverrides 사용
3. 맨 앞에 'SET' 붙이고 맨 앞, 맨 끝에 있는 콤마(,)를 제거하기
<update id="updateTable">
UPDATE TABLE
<trim prefix="SET" prefixOverrides="," suffixOverrides="," >
<if test="aFlag != null">
, A_FLAG = #{aFlag}
</if>
<if test="bFlag != null">
, B_FLAG = #{bFlag}
</if>
<if test="cFlag != null">
, C_FLAG = #{cFlag} ,
</if>
</trim>
WHERE KEY = #{key}
</update>
prefix, prefixOverrides, suffix 사용
4. 맨 앞에 'AND (' 붙이고 맨 앞 'OR' 제거하고 맨 끝에 ')' 붙이기
<select id="searchUser">
<trim prefix="AND (" prefixOverrides="OR" suffix=")">
<if test="searchCategory0 != null">
OR TT LIKE '%' || #{searchContent} || '%'
</if>
<if test="searchCategory1 != null">
OR DS LIKE '%' || #{searchContent} || '%'
</if>
<if test="searchCategory2 != null">
OR WRT_MPR_NM LIKE '%' || #{searchContent} || '%'
</if>
</trim>
</select>
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 개발 생산성 향상,중복 쿼리 줄이기 <sql>,<include> 개념 및 문법 총 정리 (0) | 2020.04.29 |
---|---|
[MyBatis] 동적 쿼리 <bind> 문법 총 정리 (0) | 2020.04.26 |
[MyBatis] 동적 쿼리 <where> 문법 총 정리 (3) | 2020.04.05 |
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] 개발 생산성 향상,중복 쿼리 줄이기 <sql>,<include> 개념 및 문법 총 정리
<sql>
개념
다른 구문에서 재사용하기 위한 SQL 조각
출처 : mybatis 공식 사이트
말 그대롭니다. "재사용성을 높이기 위한 SQL 조각" 아주 정확한 표현입니다.
조건
1.id 속성 값이 필수입니다.
2.사용하려는 태그보다 먼저 선언되어야 합니다.(위에 존재해야 합니다.)
문법
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<include>
<property>
개념
<sql> 문을 DML(Data Manipulation Language) 태그에 삽입하는 기술
문법
<select,insert,update,delete>
<include refid="<sql> id"><property name="<sql> property" value=""/></include>
</select,insert,update,delete>
<sql> + <include><property> 설명
//no property
<sql id="example01">
FROM
</sql>
//property 한개 작성
<sql id="example02">
FROM ${alias(별칭)}
</sql>
//property 여러 개 작성
<sql id="example03">
FROM ${alias(별칭)} WHERE id = ${alias02(별칭)}
</sql>
<select id="selectUser" resultType="User">
SELECT id,name
<include refid="example03">
<property name="alias" value="tablename"/>
<property name="alias02" value="119"/>
</include>
</select>
실행될 쿼리
SELECT id,name FROM tablename WHERE id = 119
설명
0.<sql> 문에는 parameter를 넘길 수 없으므로 property를 사용한다. ex) ${alias},${tablename}..
1. <sql> id 속성 == <include> refid 속성
2. <sql> ${alias(별칭)} == <property> name 속성
3. <property> value 속성 : ${alias}에 들어갈 값
이 네가지만 기억하시면 됩니다.
<sql> + <include> 실전 예제
☞ 참고 : <sql> property는 꼭 $로 작성하셔야 합니다.
☞ 참고 02 : <sql> 문에선 property 를 <if> , <bind> 태그에 변수로 인식하지 못합니다.
1.Table 문법 재사용
<sql id="returnTable">
from ${tableproperty}
</sql>
<include refid="returnTable">
<property name="tableproperty" value="tablename"/>
</include>
2.JOIN문 활용 (MyBatis 공식 사이트 예제)
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
cross join some_table t2
</select>
3.SELECT 칼럼 문법 재사용
<sql id="common_select_table">id, name, age</sql>
<select id="getMemberInfo">
SELECT
<include refid="common_select_table" />
FROM
TABLE
</select>
4.INSERT 문 활용
<sql id="board_columns">
${alias}id,
${alias}subject,
${alias}context,
${alias}attachments,
${alias}likes,
${alias}views,
${alias}create_time,
${alias}update_time,
${alias}writer
</sql>
<insert id="insertBoard">
INSERT INTO BOARD (
<include refid="board_columns"><property name="alias" value=""/></include>
) VALUES (
#{id},
#{subject},
#{context},
#{attachments},
#{likes},
#{views},
now(),
null,
#{writer} )
</insert>
외부 SQL-Mapper.xml + <include> 사용하기
board-Mapper.xml 에서 common-Mapper.xml <sql> 사용(접근) 하기
common-Mapper.xml
<mapper namespace="mapper.common-Mapper">
<sql id="board_col">
${alias}id,
${alias}subject,
${alias}context
</sql>
</mapper>
board-Mapper.xml
<select id="selectUser">
SELECT <include refid="mapper.common-Mapper.board_col">
<property name="alias" value="b."/></include>
FROM board b
</select>
설명
사용 할 외부 Mapper.xml에 namespace.<sql> id로 가져오면 됩니다.
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 동적 쿼리 <trim> 개념 및 문법 총 정리 (0) | 2020.04.30 |
---|---|
[MyBatis] 동적 쿼리 <bind> 문법 총 정리 (0) | 2020.04.26 |
[MyBatis] 동적 쿼리 <where> 문법 총 정리 (3) | 2020.04.05 |
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] 동적 쿼리 <bind> 문법 총 정리
<bind>
개념
외부에서 전달된 파라미터를 이용하여 변수 생성하는 엘리먼트
동적 쿼리 변수를 생성할 때 사용한다.
조건
MyBatis version 3.2.3 이상
문법
동적 쿼리문 안에 작성
<select | insert | update | delete>
<bind name="지정할 변수이름" value="파라미터 값+부가 옵션"/>
</select | insert | update | delete>
name 속성 : 자기가 지정할 변수 이름
value 속성 : 받아오는 파라미터 값 + 추가 문법 (이때 문법은 OGNL(Object Graph Navigation Language) 표현식을 사용한다.)
실전 예시 1. Like 문 문법
Parameter 01 : id
Parameter 02 : subject
<select id="getTest" resultType="board">
SELECT * FROM board
<bind name="ids" value="'%'+id+'%'"/>
<bind name="subjects" value="'%'+subject+'%'"/>
<where>
<if test="id != null"> AND id like #{ids}</if>
<if test="subject != null"> AND subject like #{subjects} </if>
</where>
</select>
이런식으로 value 속성에 받아온 파라미터를 작성하고 추가 문법을 덧붙이면 됩니다.
실제 실행된 쿼리
SELECT * FROM board WHERE id like '%2%' AND subject like '%test%'
실전 예시 2. Map 사용 문법
<bind name="a" value="hMap.get('a'.toString())"/>
<bind name="b" value="hMap.get('b'.toString())"/>
<bind name="c" value="hMap.get('c'.toString())"/>
실전 예시 3. 메서드(Method) 사용 문법
bind 사용 전
<select id="selectPerson" parameterType="String" resultType="hashmap">
SELECT * FROM PERSON WHERE FIRST_NAME like #{name.upperCase() + '%'}
</select>
bind 사용 후
<select id="selectPerson" parameterType="String" resultType="hashmap">
<bind name="nameStartsWith" value="_parameter.getName().upperCase() + '%'"/>
SELECT * FROM PERSON WHERE FIRST_NAME like #{nameStartsWith}
</select>
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 동적 쿼리 <trim> 개념 및 문법 총 정리 (0) | 2020.04.30 |
---|---|
[MyBatis] 개발 생산성 향상,중복 쿼리 줄이기 <sql>,<include> 개념 및 문법 총 정리 (0) | 2020.04.29 |
[MyBatis] 동적 쿼리 <where> 문법 총 정리 (3) | 2020.04.05 |
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] 동적 쿼리 <where> 문법 총 정리
<where>
개념
추가 쿼리 문의 내용을 <where> 문 안에 작성하면 첫 조건이 AND로 시작할지라도 WHERE로 치환해준다.
조건
MyBatis version 3.2.3 이상
문법
<select id="id">
SELECT * FROM table
<where>
추가 SQL
</where>
</select>
잘못된 문법 예시 1.
<select id="getTest" resultType="board">
SELECT * FROM board
<if test="id != null">WHERE id = #{id} </if>
<if test="subject != null">AND subject = #{subject} </if>
</select>
만약 이런 식으로 작성하면
1-1."subject" 칼럼이 먼저 올 경우
SELECT * FROM board AND subject = #{subject}
문법 에러가 나게 된다. 이때 <where> 문을 써주면 된다.
실전 예시 1.
<select id="getTest" resultType="board">
SELECT * FROM board
<where>
<if test="id != null">AND id = #{id} </if>
<if test="subject != null">AND subject = #{subject} </if>
</where>
</select>
이런식으로 작성하게 되면
실제 쿼리는 이런 식으로 작성된다.
1-1."id" 칼럼 값만 있을 경우
SELECT * FROM board WHERE id = #{id}
1-2."subject" 칼럼 값만 있을 경우
SELECT * FROM board WHERE subject = #{subject}
1-3. 두 컬럼 모두 값이 있을 경우
SELECT * FROM board WHERE id = #{id} AND subject = #{subject}
#WHERE AND가 되지 않고 알아서 문법에 맞게 치환 해줍니다.
그냥 (AND || OR ) 뭐가 먼저 들어올지 모르는 매개변수 값에 <where> 문을 쓰면 됩니다.
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 개발 생산성 향상,중복 쿼리 줄이기 <sql>,<include> 개념 및 문법 총 정리 (0) | 2020.04.29 |
---|---|
[MyBatis] 동적 쿼리 <bind> 문법 총 정리 (0) | 2020.04.26 |
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] resultType에 넣을 수 있는 값 정리 (6) | 2019.11.07 |
[MyBatis] 동적 쿼리 foreach문 문법 총 정리
시작하기에 앞서 참고 자료
*ibatis iterate문 지원 태그
property : 파라미터명
prepend : 쿼리로 쓰일 문자
open : 구문이 시작될때 삽입할 문자열
close : 구문이 종료될때 삽입할 문자열
conjunction : 반복되는 사이에 출력할 문자열
*ibatis : MyBatis의 옛 버전
MyBatis foreach문 지원 태그
collection : 전달받은 인자. List or Array 형태만 가능
item : 전달받은 인자 값을 alias 명으로 대체
open : 구문이 시작될때 삽입할 문자열
close : 구문이 종료될때 삽입할 문자열
separator : 반복 되는 사이에 출력할 문자열
index : 반복되는 구문 번호이다. 0부터 순차적으로 증가
즉, ibatis iterate -> MyBatis foreach로 변경됐습니다.
문법
<foreach collection="List or Array" item="alias" ></foreach>
사용 예시
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
-참고 자료 MyBatis 공식 사이트
1. 배열 예시
공통 배열 데이터
String[] userArray = {"1","2","3"}
1-1. 배열 파라미터를 Map을 통해 넘겼을 경우
DAO
public List<Members> getAuthUserList(String[] userArray) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userArray",userArray);
return sqlSession.selectList("getAuthUserList", map);
}
user-Mapper.xml
<select id="getAuthUserList" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="userArray" item="arr" open="(" close=")" separator=",">
#{arr}
</foreach>
ORDER BY m.authority;
</select>
※ 주의 : collection을 꼭! 넘겨주는 배열 변수 값과 동일하게 작성하셔야 합니다.
1-2. 배열 파라미터를 직접 넘겼을 경우
DAO
public List<Members> getAuthUserList(String[] userArray) {
return sqlSession.selectList("getAuthUserList", userArray);
}
user-Mapper.xml
<select id="getAuthUserList" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="array" item="arr" open="(" close=")" separator=",">
#{arr}
</foreach>
ORDER BY m.authority;
</select>
※ 주의 : collection을 꼭! "array"로 작성하셔야 합니다.
2. 리스트 예시
공통 리스트 데이터
List<Members> chkList = userService.getUserList(); //SELECT * FROM members 결과값
2-1. 리스트 Map을 통해 넘겼을 경우
DAO
public List<Members> getListTest(List<Members> chkList) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("chkList",chkList);
return sqlSession.selectList("getListTest", map);
}
user-Mapper.xml
<select id="getListTest" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="chkList" item="item" open="(" close=")" separator=",">
#{item.authority}
</foreach>
ORDER BY m.authority;
</select>
리스트 안에 뽑고 싶은 결괏값을 {key.value} 형태로 뽑으시면 됩니다.
※ 주의 : collection을 꼭! 넘겨주는 리스트 변수 값과 동일하게 작성하셔야 합니다.
2-2. 리스트 파라미터를 직접 넘겼을 경우
DAO
public List<Members> getListTest(List<Members> chkList) {
return sqlSession.selectList("getListTest", chkList);
}
user-Mapper.xml
<select id="getListTest" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item.authority}
</foreach>
ORDER BY m.authority;
</select>
리스트 안에 뽑고 싶은 결괏값을 {key.value} 형태로 뽑으시면 됩니다.
※ 주의 : collection을 꼭! "list"로 작성하셔야 합니다.
공통 설명
1. 먼저 리스트/배열 변수 값을 collection에 넣어주고, item이라는 설정으로 별칭 설정을 해준다.
2. 리스트/배열의 값이 시작하기 전 open="(" 이 설정돼있으므로'(' (열린 괄호)가 열리게 되고
3. 리스트/배열의 값이 한 번씩 반복문을 거칠 때마다 separator 옵션에 있는 ', '(콤마)가 찍히게 된다.
4. 반복이 끝나면 close=")" 설정이 있으므로 ')' (닫힌 괄호)가 쓰인다.
더욱 자세한 이해를 위해 실전 예시
문법에 들어가기 앞서, 공통 테이블 예시
예시 테이블
예시 테이블 02
[배열(array)] 예시 1. 멤버 테이블에서 체크박스에 따라 권한별 보여주는 기능 만들기
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<meta charset="UTF-8">
<script type="text/javascript">
var chkArray = new Array;
$(document).ready(function(){
getAuthUserList($("input[name=chk_authority]:checked").val());
$("input[name=chk_authority]").change(function(){
var chk = "";
chkArray = [];
$("input[name=chk_authority]:checked").each(function() {
chkArray.push($(this).val());
});
if(chkArray.length == 0){
$("#userList").empty();
} else {
getAuthUserList(chkArray);
}
});
});
function getAuthUserList(chkArray){
$.ajax({
url : "/user/getAuthUserList",
data : { chkArray : chkArray },
traditional : true,
async: true,
success : function(data){
var html = '';
for(key in data){
html += '<tr>';
html += '<td>'+data[key].userId+'</td>';
html += '<td>'+data[key].nickname+'</td>';
html += '<td>'+data[key].name+'</td>';
html += '</tr>';
}
$("#userList").empty().append(html);
}
})
}
</script>
</head>
<body>
<div>
유저 등급별 보기<br>
<input type="checkbox" name="chk_authority" value="0" checked="checked">실버
<input type="checkbox" name="chk_authority" value="1">골드
<input type="checkbox" name="chk_authority" value="2">플래티넘
<input type="checkbox" name="chk_authority" value="3">다이아
<input type="checkbox" name="chk_authority" value="4">마스터
<input type="checkbox" name="chk_authority" value="5">그랜드마스터
<table>
<thead>
<tr>
<th>아이디</th>
<th>닉네임</th>
<th>권한</th>
</tr>
</thead>
<tbody id="userList">
</tbody>
</table>
</div>
</body>
</html>
Controller
@RequestMapping("user/getAuthUserList")
public @ResponseBody List<Members> getAuthUserList(String[] chkArray) {
List<Members> result = userService.getAuthUserList(chkArray);
return result;
}
Service
List<Members> getAuthUserList(String[] chkArray);
Servicelmpl
@Override
public List<Members> getAuthUserList(String[] chkArray) {
return userDAO.getAuthUserList(chkArray);
}
DAO
public List<Members> getAuthUserList(String[] chkArray) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("chkArray",chkArray);
return sqlSession.selectList("getAuthUserList", map);
}
user-Mapper.xml
<select id="getAuthUserList" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="chkArray" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
ORDER BY m.authority;
</select>
쿼리 결과
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
(체크박스 수에 따른 값)
#('1','2','3')
#('2','3')
ORDER BY m.authority;
쿼리 결과 설명
1. 먼저 배열 변수 값을 collection에 넣어주고, item이라는 설정으로 별칭 설정을 해준다.
2. 배열의 값이 시작하기 전 open="(" 이 설정돼있으므로'(' (열린 괄호)가 열리게 되고
3. 배열의 값이 한 번씩 반복문을 거칠 때마다 separator 옵션에 있는 ', '(콤마)가 찍히게 된다.
4. 반복이 끝나면 close=")" 설정이 있으므로 ')' (닫힌 괄호)가 쓰인다.
View
[리스트(List)] 예시 2. 멤버 테이블에서 데이터 넘겨받아 리스트로 반복문 돌리기
Controller
@RequestMapping("user/getUserList")
public @ResponseBody List<Members> getUserList() {
List<Members> result = userService.getUserOne();
List<Members> foreachTest = userService.getListTest(result);
System.out.println(foreachTest);
return result;
}
Service
List<Members> getListTest(List<Members> result);
Servicelmpl
@Override
public List<Members> getListTest(List<Members> result) {
return userDAO.getListTest(result);
}
DAO
public List<Members> getListTest(List<Members> chkList) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("chkList",chkList);
return sqlSession.selectList("getListTest", map);
}
user-Mapper.xml
<select id="getListTest" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="chkList" item="item" open="(" close=")" separator=",">
#{item.authority}
</foreach>
ORDER BY m.authority;
</select>
쿼리 결과
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
(체크박스 수에 따른 값)
#('1','2','3')
#('2','3')
ORDER BY m.authority;
쿼리 결과 설명
1. 먼저 리스트 변수 값을 collection에 넣어주고, item이라는 설정으로 별칭 설정을 해준다.
2. 리스트의 값이 시작하기 전 open="(" 이 설정돼있으므로'(' (열린 괄호)가 열리게 되고
3. 리스트의 값이 한 번씩 반복문을 거칠 때마다 separator 옵션에 있는 ', '(콤마)가 찍히게 된다.
4. 반복이 끝나면 close=")" 설정이 있으므로 ')' (닫힌 괄호)가 쓰인다.
예제 SQL 파일 제공
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 동적 쿼리 <bind> 문법 총 정리 (0) | 2020.04.26 |
---|---|
[MyBatis] 동적 쿼리 <where> 문법 총 정리 (3) | 2020.04.05 |
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] resultType에 넣을 수 있는 값 정리 (6) | 2019.11.07 |
[MyBatis] 동적 쿼리 if문 문법 총 정리 (5) | 2019.11.04 |
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기)
CDATA ( <![CDATA[..]]> )
개념
쿼리를 작성할 때, '<', '>', '&'를 사용해야하는 경우가 생기는데 xml에서 그냥 사용할 경우 태그로 인식하는 경우가 종종 있다.. 이럴 경우 에러를 뱉어내기 때문에 '태그가 아니라 실제 쿼리에 필요한 코드'라고 알려줘야 한다. 그때 사용하는 것이 <![CDATA[...]]> 이다.
한 마디로 <>(부등호),&(앤드),||(오아) 등을 닫는 부등호가 아니라 문자열로 처리하라는 뜻입니다.
어렵게 말하자면 "XML parser"를 하지 말아라 이겁니다.
사진을 보시면 "<" 괄호가 연녹색이네요? 엥? 에러가 떴네요?
예 맞습니다. XML parser로 인식했으니 XML parser에선 "<"가 태그의 시작이거든요
다른 설정들도 <내용> 이 포맷이잖아요
이해되셨지요?
그럼 사용해봅시다.
문법
<![CDATA[
쿼리 내용
]]>
CDATA 안에 쿼리를 사용하면 쿼리 내용의 괄호나 특수문자를 XML parser로 인식하지 않고
"문자열"로 인식한다 이말입니다. 문자열로!
다양한 예시
전체 쿼리 CDATA 사용
<select id="getUserList" resultMap="UserVO">
<![CDATA[
select *
from user
where id > 3
]]>
</select>
조건 문 중간에 CDATA 사용
if 문
<select id="getUser" resultType="UserVO">
select * from user
<if test="id != null">
where id <![CDATA[<]]> 3;
</if>
</select>
choose 문
<select id="getUser" resultMap="UserVO">
<![CDATA[
select *
from user
where 1=1
]]>
<choose>
<when test='id != null and user_type =="1"'>
<![CDATA[
salary > 100
]]>
</when>
<otherwise>
<![CDATA[
salary < 100
]]>
</otherwise>
</choose>
</select>
이런 것도가능
<select id="getUser" resultType="UserVO">
SELECT *
FROM user
WHERE id <![CDATA[<]]> ;
</select>
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 동적 쿼리 <where> 문법 총 정리 (3) | 2020.04.05 |
---|---|
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
[MyBatis] resultType에 넣을 수 있는 값 정리 (6) | 2019.11.07 |
[MyBatis] 동적 쿼리 if문 문법 총 정리 (5) | 2019.11.04 |
[MyBatis] #{} 와 ${} 개념과 차이점 (0) | 2019.11.01 |
[MyBatis] resultType에 넣을 수 있는 값 정리
resultType
문법 예시
<select id="getUser" resultType="string">
쿼리 내용...
</select>
<select id="getCompany" resultType="hashmap">
쿼리 내용...
</select>
<select id="getService" resultType="DTOclass">
쿼리 내용...
</select>
별칭(alias) |
데이터 형태(data type) |
string |
String |
date |
Date |
map |
Map |
hashmap |
HashMap |
list |
List |
arraylist |
ArrayList |
decimal |
BigDecimal |
bigdecimal |
BigDecimal |
biginteger |
BigInteger |
_byte |
byte |
_long |
long |
_short |
short |
_int |
int |
_integer |
int |
_double |
double |
_float |
float |
_boolean |
boolean |
_byte[] |
byte[] |
_long[] |
long[] |
_short[] |
short[] |
_int[] |
int[] |
_integer[] |
int[] |
_double[] |
double[] |
_float[] |
float[] |
_boolean[] |
boolean[] |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
integer |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
byte[] |
Byte[] |
long[] |
Long[] |
short[] |
Short[] |
int[] |
Integer[] |
integer[] |
Integer[] |
double[] |
Double[] |
float[] |
Float[] |
boolean[] |
Boolean[] |
object |
Object |
date[] |
Date[] |
decimal[] |
BigDecimal[] |
bigdecimal[] |
BigDecimal[] |
biginteger[] |
BigInteger[] |
object[] |
Object[] |
collection |
Collection |
iterator |
Iterator |
ResultSet |
ResultSet |
※주의 : 원시형의 경우는 언더스코어(_)를 앞에 붙인다. 붙이지 않는 경우 *래퍼(Wrapper) 클래스로 변환된다.
*래퍼(Wrapper) 클래스 : 포장 클래스
이 글 참고
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
---|---|
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] 동적 쿼리 if문 문법 총 정리 (5) | 2019.11.04 |
[MyBatis] #{} 와 ${} 개념과 차이점 (0) | 2019.11.01 |
[MyBatis] 관련 오류(예외)시 꼭! 확인해야 될 사항 (0) | 2019.11.01 |
[MyBatis] 동적 쿼리 if문 문법 총 정리
시작하기에앞서 참고 자료
*ibatis 비교문 지원 태그
isNull : "널일경우"
isNotNull : "널이아닐경우"
isEmpty : "공백일경우"
isNotEmpty : "공백이아닐경우"
isGreaterTan : ">"
isGreaterEqual : ">="
isLessThan : "<"
isLessEqual : "<="
isEqual : "=="
isNotEqual : "!="
*ibatis : mybatis의 옛 버전
MyBatis 비교문 지원 태그
<if> : 단일 조건문
<choose> <when> <otherwise> : 다중 조건문
*ibatis에는 isNull, isEmpty가 있었지만 MyBatis에는 없다.
문자열 비교
paraName1 이라는 파라미터가 null이 아니면서 값이 "test"와 동일한가?
<if test='paraName1 != null and(paraName1 eq "test".toString())'>
</if>
paraName1 이라는 파라미터가 "all" 이라는 문자와 동일 하지 않은가?
<if test='!paraName1.equals("all")'>
</if>
대소문자 관계없이 비교
paraName1 이라는 파라미터가 null이 아니면서 값이 "test" or "TEST"와 동일한가?
<if test='paraName1 !=null and paraName1.equalsIgnoreCase("test")'>
</if>
특정 값 비교
paraName1 이라는 파라미터의 값이 "Y"인지 검사할 경우
<if test='paraName1== "Y"'></if>
paraName1 이라는 파라미터의 값이 공백인지 검사할 경우
<if test='paraName1 == " "'></if>
주의 : 작은 따옴표가 밖에 있어야 한다.
숫자 비교
paraName1 이라는 파라미터의 값이 3보다 큰가?
<if test='paraName1 > 3'></if>
paraName1 이라는 파라미터의 값이 3보다 크거나 같은가?
<if test='paraName1 >= 3'></if>
paraName1 이라는 파라미터의 값이 3보다 작은가?
<if test='paraName1 < 3'></if>
paraName1 이라는 파라미터의 값이 3보다 작거나 같은가?
<if test='paraName1 <= 3'></if>
paraName1 이라는 파라미터의 값이 숫자로 된 문자열일 경우
<if test='paraName1 > "3"'></if>
//비교할 값을 쌍 따옴표로 묶어준다.
주의
요소 유형 "null"과(와) 연관된 "test" 속성의 값에는 '<' 문자가 포함되지 않아야 합니다.
이러한 예외가 발생하였다면?
원인
if 태그 안에 ">" 괄호를 인식하지 못하는 거다. 그렇다면 CDATA를 쓰면 어떨까? 역시 적용되지 않는다.
일단 원인은 ">" 괄호를 XML Parsing으로 인식한 건데, XML Parsing을 Text로 바꿔주는 CDATA 마저 적용되지 않는 현상
해결
기호 |
대체식 |
예제 |
< |
lt |
<if test="paraName1 lt 0"> |
> |
gt |
<if test="paraName1 gt 0"> |
<= (또는 =<) |
lte |
<if test="paraName1 lte 0"> |
>= (또는 =>) |
gte |
<if test="paraName1 gte 0"> |
or 문
||가 아닌 or로 쓰셔야 합니다.
or (O)
|| (X)
paraName1 값이 Y이거나 paraName2의 값이 N인 경우
<if> 문
<if test='paraName1 == "Y" or paraName2 == "N"'></if>
<choose> 문
<choose>
<when test='paraName1 == "Y" or paraName2 == "N"'>
</choose>
굳이 || 를 사용하실 분들이 있다면 굳이!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|amp;|amp;
<if test='paraName1 == "Y" |amp;|amp; paraName2 == "N"'></if>
and 문
&&가 아닌 and로 쓰셔야 합니다.
and (O)
&& (X)
paraName1 값이 Y이고 paraName2의 값이 N인 경우
<if> 문
<if test='paraName1 == "Y" and paraName2 == "N"'></if>
<choose> 문
<choose>
<when test='paraName1 == "Y" and paraName2 == "N"'>
</choose>
굳이 && 를 사용하실 분들이 있다면 굳이!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
&&
<if test='paraName1 == "Y" && paraName2 == "N"'></if>
null,nullString 체크
<if test='paraName1 == null'></if>
<if test="paraName1 == null"></if>
<if test="!paraName1.equals('') and paraName1!=null">
</if>
<if test="paraName1!=null and !paraName1.equals('')">
</if>
정리
1.문자열 비교
2.특정 값 비교
3.숫자 비교
4.or 문
5.and 문
6.null 체크
JPA 쓰자!!!!!!!!!!!!!!!!!!!!!
다음은 MyBatis에서 제공 해주는 이 속성들을 알아보겠습니다.
'Spring > MyBatis' 카테고리의 다른 글
[MyBatis] 동적 쿼리 foreach문 문법 총 정리 (6) | 2020.03.28 |
---|---|
[MyBatis] CDATA 사용하기(feat.<> 괄호,특수문자 문자열로 인식하기) (0) | 2019.12.10 |
[MyBatis] resultType에 넣을 수 있는 값 정리 (6) | 2019.11.07 |
[MyBatis] #{} 와 ${} 개념과 차이점 (0) | 2019.11.01 |
[MyBatis] 관련 오류(예외)시 꼭! 확인해야 될 사항 (0) | 2019.11.01 |