my batis 프레임 워 크 orderby 가 매개 변수 로 들 어 올 때 효력 을 잃 는 해결
mxl 의 문 구 는 다음 과 같다.
<select id="statToday" resultType="com.dahua.la.business.model.vo.StatSysResultVO">
select a,
b,
count(1) as total
from table
where a is not null
and b is not null
and operateTime >= #{startTime,jdbcType=TIMESTAMP}
and operateTime <= #{endTime,jdbcType=TIMESTAMP}
group by a, b
order by
<foreach collection="orderItems" item="item" separator=",">
#{item.orderBy} #{item.order}
</foreach>
</select>
실행 시 로 그 를 통 해 sql 로 그 를 다음 과 같이 출력 합 니 다.
select a, b, count(1) as total
from table
where a is not null and b is not null
and operateTime >= ? and operateTime <= ?
group by a, b
order by ? ?
파 라 메 터 를 보충 해 네 이 비 케 이 트 로 가 져 가 실 행 했 을 때 는 전혀 문제 가 없 었 고 정렬 도 정상 이 었 다.그러나 코드 에서 실행 하면 안 되 고 마지막 정렬 은 전혀 유효 하지 않 습 니 다.
실제로 저 는 인 자 를 추가 할 때 따옴표 가 빠 졌 습 니 다.\#{item.orderby}은 들 어 오 는 데이터 에 따옴표 를 추가 할 것 입 니 다.따옴표 를 가지 고 Navicat 에 가서 실행 하면 정렬 이 유효 하지 않 습 니 다.
문제 의 원인 을 찾 았 다
${item.orderby}형식 으로 직접 바 꿉 니 다.단순 한 문자열 은 따옴표 없 이 바 꿉 니 다.
<foreach collection="orderItems" item="item" separator=",">
${item.orderBy} ${item.order}
</foreach>
이 때 는 프로그램 이 정상이다.MyBatis 정렬 시 order by 동적 매개 변 수 를 사용 할 때 주의 하 셔 야 합 니 다.\#대신$를 사용 하 십시오.
문자열 바 꾸 기
기본적으로\#{}형식의 문법 을 사용 하면 MyBatis 가 사전 처리 문 속성 을 만 들 고 배경 으로 안전 한 값 을 설정 합 니 다(예 를 들 어?).
이렇게 하 는 것 은 매우 안전 하고 빠 르 며 가장 좋 은 방법 입 니 다.가끔 은 SQL 구문 에 변 하지 않 는 문자열 을 직접 삽입 하고 싶 을 때 도 있 습 니 다.
예 를 들 어 ORDER BY 처럼 이렇게 사용 할 수 있 습 니 다.
ORDER BY ${columnName}
여기 MyBatis 는 문자열 을 수정 하거나 바 꾸 지 않 습 니 다.중요:
사용자 가 출력 한 내용 을 받 아들 이 고 문장 에 변 하지 않 는 문자열 을 제공 하 는 것 은 안전 하지 않 습 니 다.
이 는 잠재 적 인 SQL 주입 공격 을 초래 할 수 있 으 므 로 사용자 가 이 필드 를 입력 하거나 스스로 의 미 를 바 꾸 어 검사 하 는 것 을 허용 해 서 는 안 된다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.