我是靠谱客的博主 娇气绿茶,这篇文章主要介绍MyBatis中in的使用,现在分享给大家,希望可以做个参考。

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有 item,index,collection,open,separator,close。
    item表示集合中每一个元素进行迭代时的别名,
    index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
    open表示该语句以什么开始,
    separator表示在每次进行迭代之间以什么符号作为分隔 符,
    close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
    1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
    2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
    3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:

<select id="dynamicForeachTest" resultType="Blog">
select * from t_blog where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

2.单参数array数组的类型:

<select id="dynamicForeach2Test" resultType="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

3.自己把参数封装成Map的类型

<select id="dynamicForeach3Test" resultType="Blog">
select * from t_blog where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>

错误示例:

使用in的时候,不能这样写 in ${skuIds}
应该使用foreach标签

参考示例:

(一)、selectByIdSet(List idList)

 

如果参数的类型是List, 则在使用时,collection属性要必须指定为 list

List<User> selectByIdSet(List idList);
<select id="selectByIdSet" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
from t_user
WHERE id IN
<foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>

(二)、List<User> selectByIdSet(String[] idList)

 

如果参数的类型是Array,则在使用时,collection属性要必须指定为 array

List<User> selectByIdSet(String[] idList);
<select id="selectByIdSet" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
from t_user
WHERE id IN
<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>

 (三)、参数有多个时

 

当查询的参数有多个时,有两种方式可以实现,一种是使用@Param("xxx")进行参数绑定,另一种可以通过Map来传参数。

 

3.1 @Param("xxx")方式

List<User> selectByIdSet(@Param("name")String name, @Param("ids")String[] idList);
<select id="selectByIdSet" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
from t_user
WHERE
name=#{name,jdbcType=VARCHAR} and id IN
<foreach collection="idList" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</select>

3.2 Map方式

Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("idList", ids);
mapper.selectByIdSet(params);
<select id="selectByIdSet" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_user where
name = #{name}
and ID in
<foreach item="item" index="index" collection="idList" open="(" separator="," close=")">
#{item}
</foreach>
</select>

 mybatis判断list为空

在传入的map或者对象里面存在一个list,此时想要判断list是否为空,可以

<if test="spids.size()>0 " >
and
SPid not in
<foreach collection="spids" item="id" index="index"
open="(" close=")" separator=",">
#{id}
</foreach>
</if>

List中存放的是对象类型的情况

public Page<YwbStudent> findStuCoursePage(Page<YwbStudent> ywbStudentPage, YwbStudent ywbStudent)
YwbStudent类
public class YwbStudent extends DataEntity<YwbStudent> {
private static final long serialVersionUID = 1L;
private User user;
// 用户表id
private String name;
// 姓名
private String sex;
// 性别
private String mobile;
// 手机
private List<YwbCourse> stuCourseList; //学生选课list

…………

<if test="stuCourseList!= null and stuCourseList.size()>0">
AND stucou.course_id IN
<foreach collection="stuCourseList" item="Course" index="index"
open="(" close=")" separator=",">
#{Course.id}
</foreach>
</if>

最后

以上就是娇气绿茶最近收集整理的关于MyBatis中in的使用的全部内容,更多相关MyBatis中in内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部