Mybatis中foreach的用法简介

本文介绍如何使用MyBatis进行批量用户ID查询,并通过一个具体示例展示了配置文件及测试方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis是Apache公司产品.使用起来非常的方便.好,废话不多说直接进入正文

<!-- 传入多个id,查询多个用户 -->
<select id="findMulUserByIds" parameterType="com.jin.viewObject.VOUser" resultType="user">
<!-- sql语句是select * from user where id in (param1,param2,param3,,,) -->
select * from user
<where>
<foreach collection="ids" item="id" open="id in(" separator="," close=")">
#{id}
</foreach>
</where>

</select>

大家先来看看这个配置.首先id属性是<select>查询标签的唯一标识符.parameterType是一个VO.也就是一个view层的bean对象.

他的代码是这样的

public class VOUser implements Serializable {    //实现Serializable的原因是为了反序列化,此处用不到.
/**

*/
private static final long serialVersionUID = 7137345595072626969L;        //这一行加不加都行.

private List<Integer> ids;                //这是定义一个List集合.当有一个需求,要传入多个用户id,查询出多个用户对象时,要用到.如果此处不理解,请耐心往下看,(兄弟,请静下心来,急躁是解决不了问题的)


//提供setter和getter方法,

/*

此处多说一点,当你使用eclipse和MyEclipse这样的IDE(IDE:Integrated Development Environment,翻译为集成开发环境)开发工具时,当你定义一个变量.比如: private Integer id;    你要快速创建该属性的setter和getter方法时,可以按快捷键 Alt+shift+s+r.

*/

public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}

}

自己写一个测试方法


SqlSessionFactoryUtil是自己封装的一个工具类,为了获取Mybatis的session会话方便,是这样定义的

public class SqlSessionFactoryUtil {

private static SqlSessionFactory sessionFactory;

private SqlSessionFactoryUtil(){}
static{
String resource = "SqlMapConfig.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

} catch (IOException e) {
e.printStackTrace();
}

}
public static SqlSession getSession(){
return sessionFactory.openSession();

}

}


自己定义测试方法.

@Test
public void testFindUsersByIds(){
SqlSession session = SqlSessionFactoryUtil.getSession();
try{
/*
* 利用Mybatis的Mapper动态代理获取接口的实例类


*/
UserDao userDao = session.getMapper(UserDao.class);
List<Integer> ids = new ArrayList<>();
ids.add(1);
ids.add(8);
ids.add(9);
ids.add(26);


VOUser voUser = new VOUser();
voUser.setIds(ids);

List<User> users = userDao.findMulUserByIds(voUser);

System.out.println(users.size());
if(!users.isEmpty()){
for(User u : users){
System.out.println(u);
}
}
}finally{
session.close(); //关闭打开的session
}

}

下面再来看UserDao.xml(配置文件)


<!-- 传入多个id,查询多个用户 -->
<select id="findMulUserByIds" parameterType="com.jin.viewObject.VOUser" resultType="user">
<!-- sql语句是select * from user where id in (param1,param2,param3,,,) -->
select * from user
<where>
<foreach collection="ids" item="id" open="id in(" separator="," close=")">
#{id}
</foreach>
</where>

</select>

这里是foreach的用法:首先有一个<select>查询,id特性,是唯一标识符.parameterType是参数类型的总称,这里用到的是引用类型.resultType是返回值类型.

下面是一个select 查询语句,

然后是拼接where查询语句.

下面是foreach标签.这个时候,foreach标签的collection属性值要和parameterType参数类型VOUser的字段ids一致,也就是说collection属性值为VOUser的字段ids.刚好ids变量类型为List,是collection集合.

item:是每次循环遍历出来的集合的元素,也就是List集合的每个元素值,

open是拼接字符串的前端部分,比如:sql语句 select * from customer where id in (1,8,9,5);这个是open的值就为 id in (

注意,包括后面那个左括号

separator:是运算符,在这个例子中就是逗号.

close:是结尾的字符串.在本例中相当于右括号



### MyBatis 中 `foreach` 标签用于批量更新 在 MyBatis 中,可以利用 `<foreach>` 标签实现批量更新操作。这通常涉及到构建动态 SQL 来处理多个记录的同时修改。 对于批量更新而言,SQL 的结构会有所不同,主要体现在如何构造 SET 子句以及 WHERE 条件来匹配要更新的目标行。下面是一个具体的例子展示怎样通过传递列表对象来进行批量更新: ```xml <update id="batchUpdateUsers"> UPDATE user u, <foreach collection="list" item="userItem" index="index" separator="," open="(" close=")"> (#{userItem.id,jdbcType=BIGINT}, #{userItem.username,jdbcType=VARCHAR}, #{userItem.password,jdbcType=VARCHAR}, #{userItem.age,jdbcType=TINYINT}) as temp_user(id,username,password,age) </foreach> SET u.username = CASE <foreach collection="list" item="userItem" index="index" separator="WHEN"> WHEN u.id=#{userItem.id,jdbcType=BIGINT} THEN #{userItem.username,jdbcType=VARCHAR} </foreach> END, u.password = CASE <foreach collection="list" item="userItem" index="index" separator="WHEN"> WHEN u.id=#{userItem.id,jdbcType=BIGINT} THEN #{userItem.password,jdbcType=VARCHAR} </foreach> END, u.age = CASE <foreach collection="list" item="userItem" index="index" separator="WHEN"> WHEN u.id=#{userItem.id,jdbcType=BIGINT} THEN #{userItem.age,jdbcType=TINYINT} </foreach> END WHERE u.id IN ( <foreach collection="list" item="userItem" index="index" separator="," open="(" close=")"> #{userItem.id,jdbcType=BIGINT} </foreach>) </update> ``` 上述代码片段展示了如何使用 `<foreach>` 构建复杂的批处理语句[^1]。这里的关键在于理解如何将输入集合中的每一项映射到相应的列上,并确保只有当 ID 匹配时才会应用新的值给对应的字段。 值得注意的是,在实际项目开发过程中可能还需要考虑数据库性能优化等问题,比如分批次提交事务以减少锁表时间等措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值