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 = {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>