动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操做,经过表达式进行判断,对sql进行灵活拼接、组装。就拿上一篇博文中对用户的综合查询一例来讲:sql
select * from user where user.sex = #{user.sex} and user.username like '%${user.username}%'
假如这个user是null咋整?或者user.sex或者user.username为null呢?因此更严谨的作法应该是在执行这个语句以前要先进行判断才对,确保都不为空,那么我再去查询。这就涉及到了mybatis中的动态sql了。
在mybatis中,动态sql可使用标签来表示,这很相似于jstl表达式,咱们能够将上面的sql语句改为动态sql,以下:mybatis
<select id="findUserList" parameterType="mybatis.po.UserQueryVo" resultType="mybatis.po.User"> select * from user <!-- where能够自动去掉条件中的第一个and --> <where> <if test="user!=null"> <if test="user.sex!=null and user.sex!=''"> and user.sex = #{user.sex} </if> <if test="user.username!=null and user.username!=''"> and user.username like '%${user.username}%' </if> </if> </where> </select>
上面的代码很好理解,主要就是加了一些判断,条件不为空,才进行查询条件的拼接,让mybatis动态的去执行。那么在测试代码中,咱们能够故意的将user.sex不赋初值,就能够看到查询的结果是不同的。测试
那么如今还有个问题,若是好几个statement都须要这样作,并且动态sql部分都同样,这就会致使一些代码的重复,因此若是遇到这种状况,咱们就应该抽取,动态sql也能够抽取,咱们能够将动态的这部分sql抽取成sql片断,而后在具体的statement中引用进来便可。以下:spa