일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Selector
- 환경설정
- 자료구조
- Set
- interface
- mybatis
- scope
- 자바스크립트
- 정규화표현식
- DB
- JCF
- 형변환
- jquery
- String
- 참조타입
- iBATIS
- 개선
- 자바
- SQL
- JavaScript
- 알고리즘
- regex
- jdbc
- jsp
- java
- html
- controller
- extends
- jar
- for문
- Today
- Total
프로그래밍공부노트
Day 43 - iBatis (selectKey , Binding, DynamicQuery) 본문
XSS란 (Cross Side Script)
SQL Injection 공격
OWASP
SQL Injection Statement 객체
PreparedStatement(준비된 쿼리 : 쿼리 임시 저장 영역, 자동으로 SQL Injection을 막아준다)
: 쿼리를 작성할때 필요한 부분을 Binding을 통해 쿼리를 효율적으로 작업
arr[1,2,3]
SELECT * FROM JOBS_TEMP SHERE JOB_ID =? 한번만 날리면 된다
CreateStatement - CallableStatment(하드웨어 부하가 심하다, SQL Injection 공격을 막을 수 없다)
SELECT * FROM JOBS_TEMP SHERE JOB_ID =1
SELECT * FROM JOBS_TEMP SHERE JOB_ID =2
SELECT * FROM JOBS_TEMP SHERE JOB_ID =3
CallableStatement
selectKey
iBatis를 통해서 insert delete update 실행할때 알아야 할 중요 keyword
1) insert - selectKey (SQL문에서 사용하는 CDATA)
2) CUD에서는 성공한 ROW의 갯수를 반환하기 때문에 각 태그(insert delete update)는 result 타입을 가질 수 없다.
<insert id="insert01" parameterClass="com.min.edu.dto.jobsDto">
INSERT INTO JOBS_TEMP (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
VALUES(#job_id#,#job_title#,#min_salary#,#max_salary#)
<selectKey keyProperty="job_id" resultClass="java.lang.String" type="post">
SELECT JOB_ID FROM JOBS_TEMP WHERE JOB_ID=#job_id#
</selectKey>
</insert>
keyProperty는 반환되는 column, resultClass는 반환되는 타입을 이야기하고 type은 post와 pre(쿼리끝나기 전 후)
CDATA : 문법에 영향을 받지 않고 그냥 글자로 인식시키는 방법을 이야기한다
SQL은 연산자 <> = 가 존재하고 연산자 중 <은 markup tag에서 사용이 되기 때문에 오류가 발생할 가능성이 있음
CDATA 작성방법은 : <![CDATA[쿼리문]]> 이렇게 작성하면 된다 (<같은 연산자가 포함된 경우 CDATA)
Binding
Binding 기법 중에서 #변수#를 사용해서 처리하게 됨 JDBC(PreparedStatement) => '값'
$변수$를 사용해서 처리하면 => 값 (''없이)
<select id="type01" parameterClass="java.util.Map" resultClass="JDto">
SELECT JOB_ID, MAX_SALARY, MIN_SALARY
FROM JOBS_TEMP
WHERE $column$=#id#
</select>
#컬럼명# = #값# -> WHERE '컬럼명' = '값'
$컬럼명$ = #값# -> WHERE 컬럼명 = '값'
Dynamic Query
Iterator tag를 사용해서 SQL의 IN절을 사용
입력받는 Argumnet의 갯수를 알수 없다면 in을 통해서 생성할 때 사용
IN('A','B','C,') 이렇게 입력 받는다면 ( IN 다음 ( 값 , 값 , 값 ) ) 이렇게 오기 때문에
<iterate open="(" conjunction="," close=")"></iterate> 라고 작성해주면 (을 open으로 인식하고 ,을 계속 연결로 인식한 다음에 )이 나오면 닫기 때문에 Arguments의 갯수를 알 수 없을 때 사용이 가능한 것이다.
<select id="selDynamicMap" parameterClass="java.util.Map" resultClass="com.min.edu.dto.jobsDto">
<include refid="allColumn"/>
WHERE JOB_ID IN
<iterate open="(" conjunction="," close=")" property="id">
#id[]#
</iterate>
</select>
WHERE 조건절의 IN뒤에 작성해줘서 사용했다. 현재 parameterClass가 Map이기 때문에 map을 통해서 전달받는 key가 #id#라고 생각하면 된다.[]는 list로 받는다는 의미?이다
<include/>는 반복적으로 사용되는 쿼리를 refid를 부여하여 반복작업하지 않고 사용할 수 있도록 도와준다.
엄청나게 많은 컬럼명을 계속 작성해야할 때와 같이 반복적이어서 비효율적인 작업을 할 때 사용한다.
어떠한 값이 있다면 WHERE절을 생성하고, 값이 없다면 전체 검색 값을 판단해야함 => 판단이라는 의미는 변수에 묶여있어야 함 => 판단이라는 의미는 변수에 묶여있어야함 parameterClass가 DTO/ MAP
주의할 점은 Primitive (Boxing) 타입의 경우에는 묶여있는 값이 아니기 때문에 판별할 수 없음
시나리오
입력받은 값이 5000 이상이라면 WHERE절 실행시키겠다
<select id="selectDynamic01" parameterClass="java.util.Map"
resultClass="com.min.edu.dto.jobsDto">
<include refid="allColumn"/>
<dynamic prepend="WHERE">
<isGreaterEqual property="min_salary" compareValue="5000"><!-- property >= compareValue-->
MIN_SALARY = #min_salary#
</isGreaterEqual>
</dynamic>
</select>
<prepend> 만약에 하위의 tag의 기능이 true라면 동작시키겠다(여기서는 where절을)
<isGreaterEqual> : >= (이상 크거나 같다)
property 비교할 기준의 column, compareValue 비교할 기준의 값
'iBatis' 카테고리의 다른 글
Day 44 - iBatis(Dynamic Query) (0) | 2021.04.16 |
---|---|
Day 42 - iBatis (0) | 2021.04.14 |
Day 41 - iBatis(환경설정, 테스트) (0) | 2021.04.12 |