这个元素能够被用来定义可重用的 SQL 代码段,能够包含在其余语句中。它能够被静态地(在加载参数) 参数化. 不一样的属性值经过包含的实例变化. 好比:sql
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
这个sql片断能够被包含到其余语句当中,如:code
<select id="selectUsers" resultType="map"> select <include refid="userColumns"><property name="alias" value="t1"/></include>, <include refid="userColumns"><property name="alias" value="t2"/></include> from some_table t1 cross join some_table t2 </select>
以上即为调用id为userColumns的sql,并将其中的${alias}都替换为t一、t2。get
复杂版: 属性值也能够被用在 include 元素的 refid 属性里,如:table
<include refid="${include_target}"/>
或 include 内部语句中,如:select
${prefix}Table
调用sql,如:meta
<sql id="sometable"> ${prefix}Table </sql> <sql id="someinclude"> from <include refid="${include_target}"/> </sql> <select id="select" resultType="map"> select field1, field2, field3 <include refid="someinclude"> <property name="prefix" value="Some"/> <property name="include_target" value="sometable"/> </include> </select>
分析:
select语句中,先使用include标签直接调用id为someinclude的sql的代码块; 以后给${prefix}元素复制为Some,${include_target}元素赋值为sometable; id为someinclude的代码块中有包含了一个include标签,咱们已经经过元素赋值${include_target}变为sometable,所以内部的include将直接调用id为sometable的代码块。map
初步思考:
使用sql代码块,能够大量减小重复代码的编写。好比在根据id或name查询行时,咱们咱们的select域都是相同的,所以能够用sql代码块进行封装,再直接调用include标签便可。d3