2010-06-29 6 views
0

동적 쿼리를 Ibatis에 전달하고 레코드를 가져올 수 있습니까?Ibatis의 동적 쿼리

예. StringBuilder를 사용하여 쿼리를 작성한 후 마침내 "emp_id, employee에서 emp_name을 선택하십시오. emp_id == 1"이라는 쿼리가 생성되었습니다. 이제이 완벽한 쿼리를 Ibatis에 전달하고 레코드를 가져와야합니다. 여기에 열 수 및 조건은 각 쿼리 형성에 차이가 어디

편집 :

어떻게 iBatis를에 쿼리를 전달하고 iBATIS를을 사용하여 실행 얻을?

답변

0

MyBatis는 SelectBuilder 및 SQLBuilder와 함께 제공됩니다. 이 SelectBuilder을 사용하여 동적 쿼리를 구성 할 수 있습니다. SelectBuilder에 대한 자세한 내용은 사용 설명서를 참조하십시오.

1

나는 할 수 있다고 생각하지 않으며 가능한 경우에도 그렇게해서는 안됩니다. "StringBuilder를 사용하여 쿼리를 작성"하려면 iBatis의 목적을 위배하고 iBatis가 막을 수있는 많은 문제 (SQL 주입)가 발생하기 쉽습니다.

호감을 가지십시오. dynamic queries in iBatis에 대해 읽고 Java에서 XML로 SQL을 추출하십시오 (실제로 iBatis를 사용하려는 경우).

당신이 정말로 고집한다면 ... 글쎄, 나는 당신이 iBatis에 단일 문자열로 전체 sql 쿼리를 전달할 수 있다고 생각한다. 예를 들어 SQL 코드를 동적으로 실행하는 저장 프로 시저를 호출하는 것이다. 무시 무시하지만 상상할 수있는.

+0

문자열을 I로 전달하는 방법을 알고 있습니다. batis 그 결과 집합을 처리 할 수 ​​있습니다. <선택 ID는 = "SEARCH_QUERRY_DATA"의 parameterClass는 = "문자열"remapResults = "true"를 resultClass를 = "System.Collections.Hashtable"> $ querryString $ 내가 위에서와 시도 문을 사용하지만 쿼리 문자열을 전달하고 결과 집합을 처리하는 방법을 모릅니다. –

0

이전 문제이지만 저는 전화를 걸고 싶습니다. @leonbloy에 동의하며, ibatis는 당신이하려는 것을 피할 수있는 기능을 제공합니다. dynamic queries에 대한 ibatis 링크를 통해 알아낼 수 있습니다.

public IList<ITraceLogRecord> GetTraceLogRecords(string systemType, string plantName, int? deviceId, DateTime startTime, DateTime endTime, string logDescription, string loggerName, List<int> traceLevelIds) 
    { 
     IDictionary<string, object> traceQueryParameters = new Dictionary<string, object>(); 
     traceQueryParameters.Add("deviceId", deviceId); 
     traceQueryParameters.Add("startTime", startTime); 
     traceQueryParameters.Add("endTime", endTime); 
     traceQueryParameters.Add("logDescription", logDescription); 
     traceQueryParameters.Add("loggerName", loggerName); 
     traceQueryParameters.Add("traceLevelIds", traceLevelIds); 

     return DataSources.GetDbConnectionName(systemType, plantName).QueryForList<ITraceLogRecord>("SelectTraceLogRecords", traceQueryParameters); 
    } 

당신의 선택 문을 작성하고 입력이 null의 경우 검사 사전로 인수를 전달하는 방법 유무 : 여기

내가 사용한 간단한 예입니다 where 절에 포함할지 여부 :

<select id="SelectTraceLogRecords" parameterClass="System.Collections.IDictionary" resultMap="TraceLogRecordMap"> 
    SELECT TraceLevelId, Trace, DeviceId, LoggerName, CreatedTimeStamp, ThreadId 
    FROM Trace 
    <dynamic prepend="WHERE"> 
    <isNotNull prepend="AND" property="deviceId"> 
     DeviceId = #deviceId# 
    </isNotNull> 
    <isNotNull prepend="AND" property="startTime"> 
     CreatedTimeStamp >= #startTime# 
    </isNotNull> 
    <isNotNull prepend="AND" property="endTime"> 
     <![CDATA[CreatedTimeStamp <= #endTime#]]>  
    </isNotNull> 
    <isNotNull prepend="AND" property="logDescription"> 
     Trace LIKE #logDescription# 
    </isNotNull> 
    <isNotNull prepend="AND" property="loggerName"> 
     LoggerName LIKE #loggerName# 
    </isNotNull> 
    <isNotNull prepend="AND" property="traceLevelIds"> 
     <iterate property="traceLevelIds" open="(" close=")" conjunction="OR"> 
     TraceLevelId = #traceLevelIds[]# 
     </iterate> 
    </isNotNull> 
    </dynamic> 
</select>