컴퓨터 공부/Mybatis&Struts

[Ibatis] ##과 $$ 의 의미

나정_ 2012. 10. 9. 16:42

##의 정의 


Ibatis에서 parameterClass 값을 매핑 시킬 때는 ##를 사용한다. 

자바를 배웠다고 가정했을 때, 변수에 값을 대입한다고 말하면 이해하기 좀 더 쉬울 것 같다.



<update id="updateCandidateSQL"  parameterClass="java.util.HashMap"> 

        <![CDATA[

  UPDATE tb_cadidate

      SET photo_path=#photo_path#

      comments=#comments#,

      regist_dtime=NOW()

WHERE cadidate_stu_no=#stu_no#

  ]]>

</update>


                 실제로 실행되는 쿼리는 이러하다. 


                       UPDATE tb_cadidate

      SET photo_path=?, 

      comments=?

      regist_dtime=NOW()

WHERE cadidate_stu_no=?



$$의 정의 


$$ 는 매핑을 하는 것이 아니라 있는 그대로의 text를 query 에 반영시킨다.  

 

<select id="getStudentListSQL" resultClass="java.util.HashMap"> 

SELECT * 

FROM 

(SELECT cast(@rnum := @rnum + 1 as unsigned) AS no,

tb_student.stu_no, 

  tb_student.name, 

        tb_student.semester,

                       tb_student.department,

                       tb_student.course,

                       tb_student.email,

                       tb_student.cellphone

FROM (SELECT @rnum := 0) r, 

vote_kpu.tb_student

ORDER BY  tb_student.stu_no ASC ) result 

ORDER BY no DESC  LIMIT $limit_num$ , 10



limit num변수의 값이 0이라면 쿼리가 시작될 때는 


<select id="getStudentListSQL" resultClass="java.util.HashMap"> 

SELECT * 

FROM 

(SELECT cast(@rnum := @rnum + 1 as unsigned) AS no,

tb_student.stu_no, 

  tb_student.name, 

        tb_student.semester,

                        tb_student.department,

                        tb_student.course,

                        tb_student.email,

                        tb_student.cellphone

FROM (SELECT @rnum := 0) r, 

vote_kpu.tb_student

ORDER BY  tb_student.stu_no ASC ) result 

ORDER BY no DESC  LIMIT 0 , 10


 


$$와 ## 사용용도 


그렇다면 이둘을 언제 어떻게 구분지어서 사용해야할까?  

이 둘을 구분해서 사용하기 위해서는 먼저 dynamic query와 static query에 대해서 알 필요가 있다. 


먼저 static query(정적 쿼리 방식)란 변수가 바뀔 때마다 새로운 SQL 을 생성 하여 DB쿼리 수행하는 것이다. 


그와 반대로 dynamic query(동적 쿼리 방식)는 변수가 바뀔 때마다 파싱을 하지 않고 변수 바인딩 과정을 통해 DB 쿼리 수행 하는 것이다. 


그때문에 정적 쿼리는 실행 계획이 한가지만 생성이 되고, 동적 쿼리는 실행 계획이 매번 변하게 된다.

 

즉 , 컴파일 할 때 마다 변하게 되는 것이다.

 

그래서 정적 쿼리는 실행계획을 메모리에 담아 두었다고 하는 것이고,

 

동적 쿼리는 실행 계획이 변하기 때문에, 메모리에 담아 두지 않는다고 크게 구분을 하게 되는 것이다.


결론적으로 static query를 사용할 때는 $$을 , dynamic query를 사용할 때는 ##을 이용하면 된다.