SQL片段:
MyBatis的SQL片段是一种将SQL语句片段进行抽象和封装的方式,它类似于函数或宏,在MyBatis的XML映射文件中,可以定义SQL片段并在多个SQL语句中重用。SQL片段的使用可以减少重复编写相同SQL代码的工作,提高代码的可维护性和重用性。
SQL片段的定义是通过<sql>
元素来完成的,在<sql>
元素中可以编写一段完整的SQL代码,然后通过<include>
元素在其他地方引用这个SQL片段。
- 定义SQL片段: 在MyBatis的XML映射文件中,使用
<sql>
元素定义一个SQL片段,指定一个唯一的id
属性来命名这个片段。
<sql id="commonSelect">
select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time
from emp
</sql>
在上面的例子中,我们定义了一个名为commonSelect
的SQL片段,其中包含了一条sql语句。
- 引用SQL片段: 在其他SQL语句中,使用
<include>
元素来引用之前定义的SQL片段。<select id="list" resultType="com.young.pojo.Emp"> -- 动态查询 <include refid="commonSelect"/> <where> <if test="name != null"> name like concat('%',#{name},'%') </if> <if test="gender != null"> and gender = #{gender} </if> <if test="begin != null and end != null"> and entrydate between #{begin} and #{end} </if> </where> order by update_time desc </select>
在上面的例子中,我们通过
<include refid="commonSelect" />
引用了之前定义的commonSelect
SQL片段,这样在list
查询中就会将commonSelect
的内容插入到SQL语句中。 -
传递参数: 如果SQL片段需要接受参数,可以在
<sql>
元素中使用#{}
来定义参数,并在引用时传入对应的值。
<sql id="selectByAge">
WHERE age = #{age}
</sql>
<select id="getUsersByAge" resultType="User">
SELECT
<include refid="selectColumns" />
FROM users
<include refid="selectByAge">
<property name="age" value="30"/>
</include>
</select>
在上面的例子中,我们定义了一个名为selectByAge
的SQL片段,它接受一个名为age
的参数,并将WHERE
子句拼接到SQL中。在getUsersByAge
查询中,我们通过<property>
元素传递了age
参数的值为30,这样就会将WHERE age = 30
拼接到SQL语句中。
注意:SQL片段是可以嵌套使用的,你可以在一个SQL片段中引用另一个SQL片段,并将它们组合在一起构建复杂的SQL语句。