TIPS:全文测试用的mybatis版本为: 3.5.3
include标签的作用
- 通过include标签使SQL片段达到代码复用的目的。
<select id="selectById" resultMap="BaseResultMap">
select
my.*
FROM
sys_user my
<include refid="test_where"/>
</select>
<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 = ${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
应用场景
<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 version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="base">
<sql id="test">
WHERE my.id = ${fieldPrefix}
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.*.*.*.*.testMapper">
<select id="selectById" resultMap="BaseResultMap">
select
my.*
FROM
sys_user my
<include refid="base.test">
<property name="testVal" value="1"/>
</include>
</select>
</mapper>
这个用法的缺点也很明显:会降低可读性、局限性也比较大。
但还是要有个概念,说不定哪天就能用到也说不定呢。
希望这篇文章对大家有所启发☺