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>