0x00:介绍
我们在配置 MyBatis 映射文件的时候,会遇到以下几种情况,例如说要根据一些查询条件去选择不同的 sql 语句,或者说把那些使用频率特别高的 sql 语句单独的配置出来,然后在需要它的地方直接引用即可。这就需要用到了 MyBatis 的动态配置 sql 语句机制。
0x01:代码示例
当碰到需要根据查询条件选择不同的 sql 语句情况时,我们可以使用 where 标签来配置,在 where 标签中有一个 if 标签,它就是用来判断查询的条件然后分配不同的 sql 语句的。例如以下示例:
<select id="findUserList" parameterType="com.mybatis.dao.UserQuery" resultType="com.mybatis.dao.User">
select * from user
<where>
<if test="UserQuery != null">
<if test="UserQuery.gender != null and UserQuery.gender != ''">
and user.sex = #{UserQuery.gender}
</if>
<if test="UserQuery.username != null and UserQuery.username != ''">
and user.username like '%${UserQuery.username}%'
</if>
</if>
</where>
</select>
在以上代码中,查询就使用了动态配置,当 gender 和 username 都不为空时就同时两个条件,当其为空时,就不会作为查询条件了。
这时介绍中说的第一种情况,根据查询条件去选择不同的 sql 语句。第二种是配置频率特别高的 sql 语句。我们叫配置 sql 片段,配置方式很简单,需要在使用该 sql 片段的映射配置文件中声明即可,格式如下:
<sql id="user_query">
<!-- 复用的sql -->
</sql>
以上代码中,id 是唯一标识不可重复的。引入的时候,通过 include 引入即可,示例如下:
<include refid="user_query"></include>
其中 refid 的值是需要引用 sql 片段的 id 值,MyBatis 中很多标签都可以用 id 来指定别名,然后用 refid 在其他地方引用。
0x02:sql 片段拓展
除了可以使用同一个文件中的 sql 片段,也可以引用其他文件的 sql 片段,其引入方式是在 id 标识前加入配置文件所在的 namespace,也就是空间名,例如空间名为 test,则配置示例如下:
<include refid="test.user_query"></include>
0x03: 总结
MyBatis 动态配置 sql 语句,通过 where 标签来配置,where 标签中的 if 标签来决定是否使用其 sql 语句,有点像程序中的判断语句。当需要用到频率特别高的 sql 语句时,需要将其配置成 slq 片段,通过 include 标签即可,include 不仅可以引用自己映射文件中的 sql 片段,也可以引用其他文件中的 sql 片段,当需要引用其他映射文件中的 sql 片段时,只需要加上 namespace 名称即可。
公众号推荐:aFa攻防实验室
分享关于信息搜集、Web安全、内网安全、代码审计、红蓝对抗、Java、Python等方面的东西。