Spring/MyBatis

반응형

<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>

 

반응형
반응형

<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로 가져오면 됩니다.

반응형
반응형

MyBatis 속성

 

<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>
반응형
반응형

MyBatis 속성

 

<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> 문을 쓰면 됩니다. 

반응형
반응형

시작하기에 앞서 참고 자료

 

*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 파일 제공


[MyBatis] foreach문 예제.sql
0.00MB

 

 

반응형
  1. ``` 2020.12.15 17:43

    깨알 alertㅋㅋㅋㅋㅋㅋ

  2. BlogIcon sophie_min 2021.04.28 20:27 신고

    alert 귀엽..

  3. 박동춘 2021.06.18 18:32

    카피하다가 공감버튼 누르래서 눌르고 가요 ㅎㅎ. 좌측하단에는 공감버튼같은건 없는데, 하트 누르는거먖죠?

반응형

CDATA ( <![CDATA[..]]> )

 

개념


쿼리를 작성할 때, '<', '>', '&'를 사용해야하는 경우가 생기는데 xml에서 그냥 사용할 경우 태그로 인식하는 경우가 종종 있다.. 이럴 경우 에러를 뱉어내기 때문에 '태그가 아니라 실제 쿼리에 필요한 코드'라고 알려줘야 한다. 그때 사용하는 것이 <![CDATA[...]]> 이다.

 

한 마디로 <>(부등호),&(앤드),||(오아) 등을 닫는 부등호가 아니라 문자열로 처리하라는 뜻입니다.

 

어렵게 말하자면 "XML parser" 하지 말아라 이겁니다.

 

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>
반응형
반응형

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) 클래스 : 포장 클래스

이 글 참고

 

[Java]기본형(primitive type)과 참조형(reference type) (feat.Integer와 int 차이점)

오늘은 Java 기본형(primitive type)과 참조형(reference type) 종류 및 특징,사용 이유에 대해 시작하겠습니다. 자바는 크게 기본형(primitive type), Wrapper Class 참조형(reference type)으로 나눠진다. Primi..

java119.tistory.com

 

반응형
  1. BlogIcon 김캐셔 2019.11.08 11:44 신고

    넘나 어려워 보이네요.. 대단 하십니다!

    • BlogIcon DevHealth .java 2019.11.08 14:42 신고

      제가 글을 잘 못써서 어렵다고 느끼신거같네요 ㅠㅠ 더 쉽게 풀어서 쓰도록 하겠습니다!! 단 한명의 개발자도 삽질없는 그날까지!!!

  2. jieun 2020.02.13 16:15

    double형태로 리턴하려면 resultType="_double" 이렇게 쓰면 되나요?? ㅜㅜ

    • BlogIcon DevHealth .java 2020.02.17 10:15 신고

      답변이 늦었네요 죄송해요~

      기본형(원시형) 타입으로 받으시려면

      _double or double로 사용하시면 되고요

      래퍼 클래스로 받으시려면 Double 대문자를 사용하시면 됩니다.

  3. hyomini 2020.10.12 11:17

    좋은 글 감사합니다.
    복붙할 때 나오는 알림도 재밌네요 ㅋㅋ

  4. 알고있으면 좋은내용이지만 내용의 보강이 필요함 2021.08.21 04:01

    현시점 스프링부트 기반 개발이 주를 이루고 있고 마이바티스3 버전대를 사용하는 시점에서 봤을때

    resultType 생략해도 되지 않나요
    웬만하면 메서드 리턴 타입보고 자동추론으로 다 처리하던데

반응형

시작하기에앞서 참고 자료

 

*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>

 

굳이 && 사용하실 분들이 있다면 굳이!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

&amp;&amp;

<if test='paraName1 == "Y" &amp;&amp; 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 속성

다음은 MyBatis에서 제공 해주는 속성들을 알아보겠습니다.

반응형
  1. 감사 2020.03.10 14:39

    즐겨찾기 하고 갑니다~

  2. 질문 2020.04.14 14:37

    질문있습니다.
    xml에 동적쿼리 작성하고 콘솔로그에 동적쿼리가 안보이면 실패한거맞죠?
    select ***
    from **table
    <where>
    <if test="Id != null and !Id.equals('') ">
    AND ID = #{Id}
    </if>
    <if test="No != null and !No.equals('') ">
    AND No = #{No}
    </if>
    </where>
    ORDER BY *** DESC
    이 문법이 맞는지 궁금합니다.

    • BlogIcon DevHealth .java 2020.04.15 22:06 신고

      MyBatis 문법 에러가 발생하면 콘솔에 뜹니다. localhost로 하실 경우엔 서버를 재시작하면 바로 발생합니다 ^^

      해결 하셨다니 다행입니다. 즐코 하세요!

  3. 정정해야 할 내용이 있습니다! 2021.08.21 06:17

    맨 하단의 null,nullString 체크의 예시 코드 중에 3번째 코드는 문제가 있습니다.
    절대 이와 같이 쓰면 안됩니다.

    3번째 코드
    <if test="!paraName1.equals('') and paraName1!=null">
    </if>

    nullString 체크 후에 null 을 체크하죠.
    근데 애초에 paraName1 이 null 로 들어오면, equals() 메서드를 호출조차 할 수 없어서 에러가 발생합니다.
    null 에는 equals() 메소드 따윈 없는 근본없는 객체니까요

    이런 문제의 소지 때문에 바로 그 밑에 소개하신 4번째 코드처럼 순서를 바꿔서 쓰긴 합니다.
    null 체크를 먼저 후 nullString 을 체크하는 거죠.

    4번째 코드
    <if test="paraName1!=null and !paraName1.equals('')">
    </if>


    그런데 애초에 저렇게 짜잘한 순서까지 외워서 써야할까 짜증이 솟구치는 마음이 들 겁니다.
    사실 외울 필요가 없고 2가지만 습관을 들이면 됩니다.

    1. equals 메서드로 비교할 때는 무적권 null 이 될 여지가 있는 값은 앞에 두지 말자
    (equals 비교시 null 의 될 여지가 있는 놈을 무적권 뒤에 둬야합니다. 당연한 기초지요. )
    2. String 은 무적권 쌍따옴표로 "" 묶자.
    (마이빡티스는 홑따옴표 '' 로 묶으면 문자던 문자열이던 무적권 char 로 간주합니다)

    그러면 위와 같은 순서에 구애 없이 아래와 같은 코드를 자연스럽게 작성하게 될 겁니다.

    // 3번째 코드 (문제의 여지 제거)
    <if test='!"".equals(paraName1) and paraName1!=null'>
    </if>




+ Recent posts