2010-06-29 8 views
0

Est-il possible de transmettre une requête dynamique à Ibatis et d'en obtenir l'enregistrement?Requête dynamique dans Ibatis

E.g. J'ai construit ma requête en utilisant StringBuilder et enfin, j'ai obtenu la requête suivante "select emp_id, emp_name de employee où emp_id == 1". Maintenant, j'ai besoin de passer cette requête complète à Ibatis et obtenir l'enregistrement.

Note: Ici le nombre de colonnes et où les conditions varient à chaque formation de requête

EDIT: Comment passer la requête à Ibatis et l'obtenir exécuté à l'aide ibatis? MyBatis est livré avec SelectBuilder et SQLBuilder

Répondre

0

Vous pouvez utiliser ce SelectBuilder pour construire la requête dynamique. Vous trouverez plus d'informations sur SelectBuilder dans le guide de l'utilisateur.

1

Je ne pense pas que vous le pouvez, et même si vous le pouvez, vous ne devriez pas faire cela. "Construire votre requête en utilisant StringBuilder" va à l'encontre du but d'iBatis, et est sujette à de nombreux problèmes (injection SQL parmi eux) qu'iBatis est précisément conçu pour empêcher. Faites-vous plaisir: lisez le dynamic queries in iBatis et sortez votre SQL de Java en XML (si vous voulez vraiment utiliser iBatis). Si vous insistez vraiment ... eh bien, je suppose que vous pouvez passer toute la requête SQL en tant que chaîne unique à iBatis, par exemple en invoquant une procédure stockée qui exécute dynamiquement ce code SQL. Horride mais concevable.

+0

Puis-je savoir comment passer la chaîne à I batis et gérer son jeu de résultats. J'ai essayé avec ci-dessus instruction, mais pas sûr comment passer la chaîne de requête et gérer le jeu de résultats –

0

Ancien 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 dynamic queries devrait vous aider à le comprendre.

Voici un exemple simple que je l'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éer votre instruction select et vérifiez si les entrées sont nulles pour savoir si 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>