是否可以将动态查询传递给Ibatis并从中获取记录?
E.g。我使用StringBuilder构建了我的查询,最后,我得到了以下查询“select emp_id,emp_name from employee where emp_id == 1”。现在我需要将这个完整的查询传递给Ibatis并获取记录。
注意:此处列数和每个查询形式的条件会有所不同
编辑:如何将查询传递给Ibatis并使用ibatis执行?
答案 0 :(得分:1)
我认为你不能,即使你可以,你也不应该这样做。 “使用StringBuilder构建查询”会破坏iBatis的目的,并且容易出现很多问题(其中包括SQL注入),而iBatis正是为了防止这种问题而设计的。
帮自己一个忙:阅读dynamic queries in iBatis并将SQL从Java转移到XML(如果你真的想使用iBatis)。
如果你真的坚持......好吧,我猜你可以将整个sql查询作为单个字符串传递给iBatis,例如调用一个动态执行sql代码的存储过程。可怕,但可以想象。
答案 1 :(得分:0)
MyBatis附带SelectBuilder和SQLBuilder。您可以使用此 SelectBuilder 来构建动态查询。有关SelectBuilder的更多信息,请参阅用户指南。
答案 2 :(得分: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语句并检查输入是否为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>