2010-06-29 84 views
0

是否可以将动态查询传递给Ibatis并从中获取记录?Ibatis中的动态查询

E.g.我使用StringBuilder构建了我的查询,最后,我得到了以下查询“select emp_id,emp_name from employee where emp_id == 1”。现在我需要将这个完整的查询传递给Ibatis并获得记录。

注:这里列数和那里的条件将在各形成查询变化

编辑:如何查询传递给ibatis的,并得到它使用iBATIS执行?

回答

0

MyBatis自带SelectBuilder和SQLBuilder。您可以使用此SelectBuilder构建动态查询。有关SelectBuilder的更多信息,请参阅用户指南。

1

我不认为你可以,即使你可以,你也不应该那样做。 “使用StringBuilder构建查询”击败了iBatis的目的,并且容易出现很多问题(其中包括SQL注入),iBatis的设计目的是为了防止这些问题。

帮你一个忙:阅读关于dynamic queries in iBatis,并将你的SQL从Java转换为XML(如果你真的想使用iBatis)。

如果你真的坚持......好吧,我猜你可以将整个sql查询作为单个字符串传递给iBatis,例如调用一个存储过程来动态执行该sql代码。可怕但可想而知。

+0

我可以知道如何将字符串传递给I batis和处理其结果集。<选择ID = “SEARCH_QUERRY_DATA” parameterClass = “字符串” 设置remapResults = “真” resultClass = “System.Collections.Hashtable”> $ $ querryString 我试图与上述语句,但不知道如何传递查询字符串并处理结果集 – 2010-07-02 11:22:17

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); 
    } 

创建你的SELECT语句,并检查输入是无效的方法是否将它们包含在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>