<sql>元素
在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username、jobs字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量,导致映射文件过于臃肿。那么有没有什么办法将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用呢?答案是肯定的,我们可以在映射文件中使用MyBatis所提供的<sql>元素来解决上述问题。
<sql>元素的作用就是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段。例如,定义一个包含id、username、jobs和phone字段的代码片段如下:
<sql id="customerColumns">id,username,jobs,phone</sql>
这一代码片段可以包含在其他语句中使用,具体如下:
<select id="findCustomerById" parameterType="Integer"
resultType="com.itheima.po.Customer">
select <include refid="customerColumns"/>
from t_customer
where id = #{id}
</select>
在上述代码中,使用<include>元素的refid属性引用了自定义的代码片段,refid的属性值为自定义代码片段的id。
上面示例只是一个简单的引用查询。在实际开发中,可以更加灵活的定义SQL片段,其示例如下:
<!--定义表的前缀名 -->
<sql id="tablename">
${prefix}customer
</sql>
<!--定义要查询的表 -->
<sql id="someinclude">
from
<include refid="${include_target}" />
</sql>
<!--定义查询列 -->
<sql id="customerColumns">
id,username,jobs,phone
</sql>
<!--根据id查询客户信息 -->
<select id="findCustomerById" parameterType="Integer"
resultType="com.itheima.po.Customer">
select
<include refid="customerColumns"/>
<include refid="someinclude">
<property name="prefix" value="t_" />
<property name="include_target" value="tablename" />
</include>
where id = #{id}
</select>
上述代码中,定义了3个代码片段,分别为表的前缀名、要查询的表和需要查询的列。前2个代码片段中,分别获取了<include>子元素<property>中的值,其中第1个代码片段中的“${prefix}”会获取name为prefix的值“t_”,获取后所组成的表名为“t_customer”;而第2个代码片段中的“${include_target}”会获取name为include_target的值“tablename”,由于tablename为第1个SQL片段的id值,所以最后要查询的表为“t_customer”。所有的SQL片段在程序运行时,都会由MyBatis组合成SQL语句来执行需要的操作。
执行程序后,控制台的输出结果如图1所示。
图1 运行结果