my batis 프레임 워 크 orderby 가 매개 변수 로 들 어 올 때 효력 을 잃 는 해결

my batis order by 매개 변수 로 들 어 오 는 실효
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 주입 공격 을 초래 할 수 있 으 므 로 사용자 가 이 필드 를 입력 하거나 스스로 의 미 를 바 꾸 어 검사 하 는 것 을 허용 해 서 는 안 된다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기