学科分类
目录
SSM框架

<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 运行结果

点击此处
隐藏目录