백엔드/Database

Mybatis - <sql>, <include> | TIL_159

ran4 2022. 11. 3. 22:39

 

Mybatis를 사용하면서 개인적으로 기록한 내용을 정리

 

 

 

Mybatis 기본내용

<insert  id="?" parameterType="?" resultType="?">

</insert>

 

id = 구현시 호출할 이름

parameterType = 파라미터 값 타입

public int Select(int bno //괄호 안 부분 

resultType = 결과타입 

return 타입 = public int Select() | public Dto Select()


 

 

 

<sql>과 <include>를 사용할 떄 

 

1. <sql> 태그는 다른 구문에서 재사용가능한 sql 구문을 정의할 때 사용한다

<sql id="boardSql">
 select * from board
</sql>

*주의 : sql태그 내에 있는 쿼리들을 재사용 할 경우 재사용할 쿼리의 상단에 선언되어야 한다 
하단에 선언되면 불러올 수 없다

 

 

sql 태그 내에 파라미터 값을 추가할 수도 된다

단, 인자 값이 존재해야 에러가 나지 않는다

<sql id = "boardSql">
title = #{title}
</sql>



 

2. <include> 태그

같은 파일 내에 정의한 <sql>태그 내의 쿼리들을 불러올 수 있게 한다

<include> 태그에 refid 속성을 추가한 후 불러올 sql 태그의 id값을 추가하면 된다

<sql id="boardSql">
where bno = #{bno}
</sql> // sql 태그는 쿼리문 이전에 선언 해야 한다 

<select id="getTitle" resultType="String">
select title from board
<include refid="boardSql">
</include> // include 태그는 구현한 쿼리문 안에 할당한다 
</select>

 

<sql id="boardSql2">
select * from board
</sql> // sql 태그는 쿼리문 이전에 선언 해야 한다 

<select id="getAll">
<include refid="boardSql" />
where id = #{id}
</select>

 

 

 

 

#{value}와 ${value}

#{}는 preparedStatement를 이용한 ?, ? 에 할당하는 방식이고 

${}는 statement를 이용한 ", " + title + ", " + name 방식이라 생각하면 된다


${title}은 '${title}' 처럼 문자열로 바꿔야 하는데

#{title}은 문자열로 인식되어서 변환할 필요가 없다

※ 더 유연한 방식은 ${title}이다

#{title}은 값에만 사용가능하다 

→ 외부에서 넘어오는 값을 막아준다

 

${title}은 보안상으로 외부에서 고치는 해킹 방지가 불가하다

 ${title}은 내부적으로 사용하고 #{title}은 외부에서 사용하는 것을 권장한다 

 

 

 

번외

  • xml 내의 특수문자 (<, >, &, ...)는 &lt; &gt;로 변환이 필요하다
  • 혹은 특수문자가 포함된 쿼리를 "<![CDATA[" 와 "]]>"로 감싸야 한다.

 

1. bno &lt; &gt; 0 == bno <> 0

→ 해당 방법은 구분이 어렵다 

 

2. 변환할 문자가 많은경우 try - catch 처럼 감싼다 

<![CDATA[

쿼리 and bno <> 0 

]]> 

-> xml 태그 없이 전부 C(character) 문자 데이터라는 의미이다