0

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

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

注意:这里的列数和位置条件会因每个查询形式而异

编辑:如何将查询传递给 Ibatis 并使用 ibatis 执行它?

4

3 回答 3

1

我不认为你可以,即使你可以,你也不应该那样做。“使用 StringBuilder 构建查询”违背了 iBatis 的目的,并且容易出现许多 iBatis 旨在防止的问题(其中包括 SQL 注入)。

帮自己一个忙:阅读iBatis 中的动态查询并将您的 SQL 从 Java 转换为 XML(如果您真的想使用 iBatis)。

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

于 2010-06-29T14:49:34.693 回答
0

MyBatis 带有 SelectBuilder 和 SQLBuilder。您可以使用此SelectBuilder来构造动态查询。有关 SelectBuilder 的更多信息可以在用户指南中找到。

于 2010-06-29T08:21:11.360 回答
0

老问题,但我想插话。我同意@leonbloy,ibatis 提供的功能可以避免您尝试做的事情。用于动态查询的 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);
    }

创建您的选择语句并检查输入是否为空,以确定是否将它们包含在您的 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>
于 2012-03-19T16:35:11.760 回答