记一次MyBatis动态sql的foreach标签实战应用 |Java 开发实战

这是我参与更文挑战的第 3 天,活动详情查看:更文挑战

本文正在参加「Java主题月 – Java 开发实战」,详情查看:活动链接

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,
稍有不慎,还会造成sql语法错误,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种烦恼。

说到Mybatis的动态sql,不得不提到foreach元素标签,它的功能非常强大,允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符!你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

具体属性介绍如下:

mybatis.png

项目实战代码如下:

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有个更好的理解和应用。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享