动态SQL
为什么要用动态SQL?
如果使用JDBC或者类似Hibernate等其他框架,很多时候需要去根据需要去拼接SQL语句,这是一个很麻烦的事情。因为在某些查询中,需要多个条件,在使用其他框架的时候,需要用大量的Java代码进行判断,可读性比较差。而Mybatis不一样,其中提供了对SQL语句动态的组装能力,使用XML的几个简单的元素就可以去实现动态拼接SQL语句。对条件的判断都放在了XML配置文件中,大大减少了代码量。但因为注解的配置功能受限,在此也不对注解中配置SQL作讲解。
if元素
此元素相当于Java代码中的if语句,与test属性联合一起使用,用个示例去描述即可理解:首先有一个表是User表,我根据User表的username去寻找user,那么如果使用者并没有填入username,那么我就不用username作为查询条件。这样的动态SQL如果是要用java代码去写,就要用到判断去if——else,而在此,我是这么写的:
<select id="findUserByUsernameOrNull" parameterType="String" resultType="com.demain.User">
select * from user where 1=1
<if test="username != null and username != ''">
and username like concat('%' , #{
username} , '%')
<if>
</select>
非常的简单易懂,test属性中存放着判断条件,如果符合则将<if></if>
里的语句拼接到前面的SQL语句中,如果不符合则不拼接。
choose / when / otherwise元素
这三个元素一般都在一起使用,所以我归为一类放在一起。如果在判断条件多于两个,即三个以上的时候,在Java代码中一般会使用到switch/case/default语句,但是在Mybatis中提供了这三个元素去支持此功能。示例:首先还是在刚刚的User表中查询用户,但是我不仅仅是用username,我还得用用户的address和备注note去查询,在给查询的页面中有三个选填条件:①username②address③note。
当username不为空时则使用username去模糊查询
当username为空,address不为空时,用address去模糊查询,
当前两个条件都为空是,则要求备注note不能为空
<select id="chooseWhenOtherwiseTest" parameterType="user" resultMap="userMap">
select * from user where 1=1
<choose>
<when test="username != null and username != ''">
and username like concat('%' , #{
username