0 votes

Requête dymanique dans Ibatis

Est-il possible de passer une requête dynamique à Ibatis et d'en extraire l'enregistrement ?

Par exemple, j'ai construit ma requête en utilisant StringBuilder et finalement, j'ai obtenu la requête suivante "select emp_id, emp_name from employee where emp_id==1" . Maintenant, je dois passer cette requête complète à Ibatis et obtenir l'enregistrement.

Note : Ici, le nombre de colonnes et les conditions de recherche varient en fonction de la formation de la requête.

EDIT : Comment passer la requête à Ibatis et la faire exécuter par Ibatis ?

1voto

leonbloy Points 27119

Je ne pense pas que tu puisses, et même si tu pouvais, tu ne devrais pas faire ça. Le fait de "construire votre requête en utilisant StringBuilder" va à l'encontre de l'objectif d'iBatis, et est sujet à de nombreux problèmes (dont l'injection SQL) qu'iBatis est précisément conçu pour éviter.

Faites-vous une faveur : lisez ce qui suit Requêtes dynamiques dans iBatis et faites passer votre SQL de Java à XML (si vous voulez vraiment utiliser iBatis).

Si vous insistez vraiment... eh bien, je suppose que vous pouvez passer la requête sql entière comme une seule chaîne à iBatis, par exemple en invoquant une procédure stockée qui exécute dynamiquement ce code sql. Horrible mais concevable.

1voto

Killnine Points 971

C'est un vieux problème mais je voulais intervenir. Je suis d'accord avec @leonbloy, ibatis fournit des fonctionnalités pour éviter ce que vous essayez de faire. Le lien ibatis pour requêtes dynamiques devrait vous aider à comprendre.

Voici un exemple simple que j'ai utilisé :

Avoir une méthode pour passer vos arguments comme un dictionnaire

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

Créez votre instruction select et vérifiez si les entrées sont nulles pour savoir si vous devez les inclure dans votre clause 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>

0voto

chedine Points 1692

MyBatis est livré avec SelectBuilder et SQLBuilder. Vous pouvez utiliser ces SelectBuilder pour construire la requête dynamique. Vous trouverez de plus amples informations sur SelectBuilder dans le guide d'utilisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X