Skip to content

sql

<sql> 是 MyBatis 里用来定义可复用 SQL 片段的标签,通常配合 <include> 使用。

基本语法

定义SQL片段

xml
<sql id="baseColumn">
    id, name, age, create_time
</sql>

引用 SQL 片段

sql
<select id="queryUser" resultType="User">
    SELECT 
    <include refid="baseColumn"/>
    FROM user
</select>
sql
SELECT id, name, age, create_time FROM user

传参

因为是字符串拼接,因此只能使用${}

xml
<sql id="orderBy">
    ORDER BY ${column} ${order}
</sql>
xml
<select id="queryUser">
    SELECT * FROM user
    <include refid="orderBy">
        <property name="column" value="create_time"/>
        <property name="order" value="DESC"/>
    </include>
</select>

使用场景

复用查询字段

xml
<sql id="userColumns">
    u.id, u.name, u.age, u.create_time
</sql>
xml
<select id="listUser" resultType="User">
    SELECT <include refid="userColumns"/>
    FROM user u
</select>

复用 JOIN

xml
<sql id="userJoinDept">
    LEFT JOIN dept d ON u.dept_id = d.id
</sql>
xml
<select id="query">
    SELECT u.*, d.name
    FROM user u
    <include refid="userJoinDept"/>
</select>

复用WHERE

sql
<sql id="userWhere">
    <where>
        <if test="name != null and name != ''">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</sql>
sql
<select id="queryUser" resultType="User">
    SELECT * FROM user
    <include refid="userWhere"/>
</select>