Factorisation de code SQL dans un fichier XML de description Ibatis : mode d’emploi !

Il est fréquent de réutiliser du code SQL identique dans plusieurs requêtes. Voici un petit exemple permettant de factoriser ce code à l'intérieur d'un fichier XML de description Ibatis grâce aux fragments SQL.

Considérons les 3 requêtes suivantes, différentes mais qui comportent d'importantes similitudes :

<select id="Select.1" resultClass="fr.netapsys.www.demo.Object1">
    select champs1,
    champs2,
    champs3,
    champs4,            
    champs5,
    champs6,
    champs7
 
    from table1
 
    where champs1 = 10
 
</select>
 
<select id="Select.2" resultClass="fr.netapsys.www.demo.Object2">
    select champs1,
    champs2,
    champs3,
    champs4,            
    champs5,
    champs6,
    count(*) as total
 
    from table1
 
</select>
 
<select id="Select.3" resultClass="fr.netapsys.www.demo.Object3">
    select champs1,
    champs2,
    champs3,
    champs4,            
    champs5,
    champs6,
    champs7
 
    from table1
 
    <dynamic prepend="where">
        <isNotEqual prepend="and" property="param1" compareValue="0">
            champs1 = $param1$
        </isNotEqual>           
    </dynamic>
 
</select>

Pour y remédier, utilisons le mécanisme des fragments SQL proposé par Ibatis :

<sql id="monFragment">
    // mon code SQL
</sql>

Nous pouvons ensuite utiliser le fragment où bon nous semble dans le fichier XML de description Ibatis.
Attention : le fragment SQL doit être déclaré avant d'être utilisé.

<include refid="monFragment"/>

Exemple simple :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
 
<sqlMap namespace="Demo_ibatis_fragment_code">
 
    <sql id="fragment.1">
      select champs1,
         champs2,
         champs3,
         champs4,            
         champs5,
         champs6    
    </sql>
 
    <sql id="fragment.2">
          from table1
    </sql>
 
    <!-- Reprenons nos requêtes du début et appliquons nos fragments SQL -->
    <select id="Select.1" resultClass="fr.netapsys.www.demo.Object1">
         <include refid="fragment.1"/>
         ,champs7
         <include refid="fragment.2"/>
         where champs1 = 10 
    </select>
 
    <select id="Select.2" resultClass="fr.netapsys.www.demo.Object2">
        <include refid="fragment.1"/>
        count(*) as total
        <include refid="fragment.2"/>
    </select>
 
    <select id="Select.3" resultClass="fr.netapsys.www.demo.Object3">
         <include refid="fragment.1"/>
         ,champs7
         <include refid="fragment.2"/>
 
         <dynamic prepend="where">
             <isNotEqual prepend="and" property="param1" compareValue="0">
                 champs1 = $param1$
             </isNotEqual>        
         </dynamic>
    </select>
 
    <!-- Ce fragment ne peut pas être utilisé dans les requêtes précédentes ou alors il faut le déclarer avant celles-ci -->
    <sql id="fragment.3">
        from table2;
    </sql>
 
</sqlMap>

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.