在编写SqlMaps的时候,经常需要把一个sql拆分成多个片段。IBatis提供了一个简单有很实用的分割节点来进行SQL的分割。举个简单的例子,假设需要查询一些学生的信息。
原来的写法是:
<!--查询所有信息--> <select id="SelectAllCraft" resultMap="StudentMap"> SELECT Id, Name, Age, Address, ClassID from Student </select> <!--根据学生编号查询信息--> <select id="SelectAllCraft" resultMap="StudentMap" parameterClass="Int">> SELECT Id, Name, Age, Address, ClassID from Student Where Id=#Value# </select>
现在用sql标签可以这样写:
<sql id ="selectAll"> select Id, Name, Age, Address, ClassID,ClassName from Student </sql> <!--查询所有信息--> <select id="SelectAllCraft" resultMap="StudentMap"> <include refid ="SelectALL"/> </select> <!--根据编号查询信息--> <select id="SelectAllCraft" resultMap="StudentMap" parameterClass="Int"> <include refid ="SelectALL"/> where id=#Value# </select>
<include refid ="SelectALL"/> refid:就是指要调用sql标签的id。
sql标签就相当于C#里的定义一个字符串,里面存着一些值,可以被其他标签调用。这样一来就可以减少重复代码的书写。
IBatis动态拼接sql
实例:
<!--动态加载sql语句-->
<select id ="SelectByWhere" resultMap="StudentMap" resultClass="Hashtable">
<include refid ="SelectALL"/>
<include refid="s"></include>
<dynamic prepend="where">
<isParameterPresent>
<isNotEmpty prepend="and" property="Name">
Name like '%$Name$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="Address">
Address like '%$Address$%'
</isNotEmpty>
<isGreaterThan prepend="and" property="ClassID" compareValue="0">
<!--大于-->
ClassID=#ClassID#
</isGreaterThan>
<isNotEqual prepend="and" property="Age" compareValue="0">
<!--不等于-->
Age=#Age#
</isNotEqual>
</isParameterPresent>
</dynamic>
order by Id $Orderby$
</select>