Mybatis include入参实现sql可复用

1,499 阅读1分钟

include标签的作用 通过include标签使SQL片段达到代码复用的目的。 select my.* FROM sys_user my

<sql id="test_where">
    WHERE
        my.id = 1
</sql>
-- 执行结果:select my.* FROM sys_user my WHERE my.id = 1 

进阶用法 通过property标签动态传参,使用时用 {PROPERTY_NAME} 在 if 等标签和代码段中都可使用 注意: mybatis中有两种传入动态参数的方式:#{}和{} #{} 占位符:对传入的参数会做预编译,也就是会当做字符串来处理

   ${} 拼接符:对传入的参数不会做任何的处理,也就是说传递什么就是什么

举例: 1. select * from sys_user where id = #{id} and name = #{name} 最后执行的sql:select * from sys_user where id = ‘1’ and name = ‘zhangsan’ 2. select * from sys_user where id = idandname={id} and name = {name} 最后执行的sql:select * from sys_user where id = 1 and name = zhangsan (这里zhangsan没有单引号,因此会报错。如果需要加单引号,则需要手动在传参时传入。)

<select id="selectById" resultMap="BaseResultMap">
    select
        my.*
    FROM
        sys_user my
    <include refid="test">
        <property name="testVal" value="1"/>
    </include>
</select>

<sql id="test">
    <if test="${testVal} != null">
        WHERE my.id = ${testVal}
    </if>
</sql>
-- 执行结果:select my.* FROM sys_user my WHERE my.id = 1 

应用场景 常用WHERE子句,但是可能不同地方用的别名不同

<select id="selectById" resultMap="BaseResultMap">
    select
        my.*
    FROM
        sys_user my
    <include refid="test">
        <property name="fieldPrefix" value="my."/>
    </include>
</select>
-- 执行结果 select my.* FROM sys_user my WHERE my.id = 1 

<select id="selectByDepartment" resultMap="BaseResultMap">
    select
        my.*
    FROM
    	sys_user my
        LEFT JOIN sys_department dep ON my.department_id = dep.id
    <include refid="test">
        <property name="fieldPrefix" value="dep."/>
    </include>
</select>
/* 执行结果
	 select my.* FROM sys_user my 
	 LEFT JOIN sys_department dep ON my.department_id = dep.id
	 WHERE dep.id = 1 
*/
<sql id="test">
    WHERE ${fieldPrefix}id = 1
</sql>

如果觉得每次都要传参比较麻烦,可以先创建几个常用模板

<select id="selectAll" resultMap="BaseResultMap">
    select
        my.*
    FROM
        sys_user my
    <include refid="test_1"/>
</select>

<sql id="test_1">
    <include refid="test">
        <property name="fieldPrefix" value="1"/>
    </include>
</sql>

<sql id="test_2">
    <include refid="test">
        <property name="fieldPrefix" value="2"/>
    </include>
</sql>

<sql id="test">
    <if test="${fieldPrefix} != null">
        WHERE  my.id = ${fieldPrefix}
    </if>
</sql>

如果在多个xml中都要使用,则可以新建一个xml,引用时用 NAMESPACE.ID

WHERE my.id = ${fieldPrefix}
<select id="selectById" resultMap="BaseResultMap">
    select
        my.*
    FROM
        sys_user my
    <include refid="base.test">
        <property name="testVal" value="1"/>
    </include>
</select>