动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,稍有不慎,还会造成sql语法错误,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种烦恼。
说到Mybatis的动态sql,不得不提到foreach元素标签,它的功能非常强大,允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符!你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
具体属性介绍如下:
项目实战代码如下:
1.循环数组
dao中写法:
List<UserFile> getFileResult(@Param(value="queryArray")String[] queryArray);
xml中写法:
<select id="getFileResult" resultType="com.xx.entity.UserFile">
select uf.id,uf.file_id fileId,uf.file_name fileName,uf.file_size fileSize,uf.file_description fileDescription,
uf.parent_id parentId,uf.file_type fileType,uf.is_dir isDir,
from user_file uf left join file_label fl
on uf.id = fl.userfile_id where uf.del_flag=1
<if test="queryArray != null and queryArray.length > 0 ">
and fl.label_id in
<foreach collection="queryArray" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
ORDER by uf.id DESC
</select>
2.循环集合
dao中写法:
List<Label> findLabelInfoByFileIdList(@Param(value="fileIdList") List<Long> fileIdList);
xml中写法:
<select id="findLabelInfoByFileIdList" parameterType="java.util.List" resultType="com.xx.entity.Label">
select la.id,la.name,fl.userfile_id userFileId from label la,file_label fl
where la.id = fl.label_id
<if test="fileIdList != null and fileIdList.size() > 0 ">
and fl.userfile_id in
<foreach collection="fileIdList" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
备注:数组和集合对应的collection属性都有对应的默认值,分别是array和list,如果dao中的@Param注解中没有添加的话,需要将collection属性换成array或list,不过个人建议尽量使用注解声明为自己定义的参数,以便更好的知道参数的实际意义。
除此之外,Mybatis的动态sql还有更多其他属性标签,比如if、choose、when、otherwise、trim、where、set、bind等标签,这些属性对于条件判断、字符串去空、过滤筛选、以及创建变量绑定到上下文等,很好的支持了Mybatis的动态属性,如果大家有兴趣,可以一一去实践,此处不再额外赘述。希望这篇文章能够对你有所帮助,让你对Mybatis有个更好的理解和应用。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。