在编写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>