2017-05-15 2 views
2

저는 myBatis에 대해 새삼스럽고 내 쿼리에 where 문을 넣어야합니다.MyBatis : dinamic where 조건

내 매퍼는이 방식으로 정의된다

<select id="findMyTableByWhereCondition" parameterType="map" resultMap="mytable"> 
    SELECT * 
    FROM mytable m 
    <where>#{whereCondition}</where> 
</select> 

내 다오 : 시도는이 쿼리를 실행하면

public List<MyTalbe> findMyTableByWhereCondition(String whereCondition) { 
     Map<String, Object> param = new HashMap<String, Object>(); 
     param.put("whereCondition", "m.name = 'Test' and m.surname= 'Test'"); 
     return sqlSession.selectList("findMyTableByWhereCondition", param); 
    } 

, 내가 "잘못된 관계 연산자"를 얻을 수 있습니다. 이러한 종류의 쿼리를 처리하는 가장 좋은 방법은 무엇입니까? 너무 자주 바뀔 수도 있고 매우 복잡 할 수도 있기 때문에 "where"위에 대체해야합니다. 사전에

감사

+0

예제에서'param' 변수는 사용되지 않았습니다. 'whereCondition' 문자열을'sqlSession.selectList()'에 전달하는 것은 무엇입니까? –

+0

API를 올바르게 사용하지 않는 것 같습니다. 이 질문의 예제를 살펴보십시오. [복잡한 객체를 사용하지 않고 SELECT에 여러 인수 전달] (http://stackoverflow.com/questions/9308210/passing-multiple-arguments-into-a-select-without- using-a-complex-object)는 WHERE 조건에서 map 요소 당 하나의 필드/값을 사용합니다. –

+0

@MickMnemonic하지만 조건을 모두 바꿔야 할 곳은 – Skizzo

답변

0

시도 매개 변수 whereCondition 참조 ${...}을 사용 :

<select id="findMyTableByWhereCondition" parameterType="map" resultMap="mytable"> 
    SELECT * 
    FROM mytable m 
    <where>${whereCondition}</where> 
</select> 

문서 쓴 :

기본적으로 #을 사용하여 {} 구문은 MyBatis로 생성하게됩니다 PreparedStatement 프로퍼티를 검증하고 PreparedStatement 매개 변수 (예 :?)에 대해 값을 안전하게 설정하십시오. 이것이 더 안전하고 빠르며 거의 항상 선호되는 경우가 있지만 때로는 수정되지 않은 문자열을 SQL 문에 직접 삽입하기를 원할 때가 있습니다. 예를 들어, ORDER BY의 경우 다음과 같이 사용할 수 있습니다.
ORDER BY ${columnName}
MyBatis는 문자열을 수정하거나 이스케이프 처리하지 않습니다.

참고 : 사용 $은 SQL 주입 공격의 원인이됩니다 당신은 더 나은 공식 문서에서 Dynamic SQL을 읽고 그와 같은 SQL을 구성하려고 것입니다.