Динамический запрос в Ibatis - PullRequest
0 голосов
/ 29 июня 2010

Можно ли передать динамический запрос в Ibatis и получить от него запись?

Например, я построил свой запрос с использованием StringBuilder и, наконец, получил следующий запрос "select emp_id, emp_name from сотрудника, где emp_id== 1 ".Теперь мне нужно передать этот полный запрос Ibatis и получить запись.

Примечание: Здесь количество столбцов и условия, которые будут меняться при каждом формировании запроса

РЕДАКТИРОВАТЬ: Как передать запрос в Ibatis ивыполнить его с помощью ibatis?

Ответы [ 3 ]

1 голос
/ 29 июня 2010

Я не думаю, что вы можете, и даже если бы вы могли, вы не должны этого делать. «Построение вашего запроса с использованием StringBuilder» побеждает цель iBatis и подвержено множеству проблем (в том числе SQL-инъекциям), которые iBatis точно разработан для предотвращения.

Сделайте себе одолжение: прочитайте о динамических запросах в iBatis и перенесите свой SQL из Java в XML (если вы действительно хотите использовать iBatis).

Если вы действительно настаиваете ... ну, я думаю, вы можете передать весь SQL-запрос в виде одной строки в iBatis, например, вызвать хранимую процедуру, которая динамически выполняет этот SQL-код. Ужасно, но возможно.

0 голосов
/ 19 марта 2012

Старая проблема, но я хотел вмешаться. Я согласен с @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>
0 голосов
/ 29 июня 2010

MyBatis поставляется с SelectBuilder и SQLBuilder. Вы можете использовать этот SelectBuilder для построения динамического запроса. Более подробную информацию о SelectBuilder можно найти в руководстве пользователя.

...