向sql传递数组或List,mybatis使用foreach解析,如下:
需求:
传入多个id查询用户信息,用下边的sql实现:
select * from user where id in(1,10,24);
1.在QueryVo类中定义:
private List<Integer> ids; public List<Integer> getIds() {
return ids;
}
2.在UserMapper接口中定义方法:
public List<User> findUserByIds(QueryVo vo);
3.在UserMapper.xml中进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper接口代理实现编写规则:
1.映射文件中namespace要等于接口的全路径
2.通过sql语句实现数据库的操作
3.映射文件中sql语句id要等与于接口的方法名称
4.映射文件中传入参数类型要等于接口方法的传入参数类型
5.映射文件中返回结果集类型要等于接口方法的返回值类型
-->
<mapper namespace="com.huida.mapper.UserMapper"> <select id="findUserByIds" parameterType="com.huida.vo.QueryVo" resultType="com.huida.po.User">
<!-- select * from user where id in(1,10,24) -->
select * from user
<where>
<!-- id in(1,10,24) -->
<if test="ids!=null">
<foreach collection="ids" item="id" open="id in(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select> </mapper>
collection属性:对谁进行遍历,在这里是对ids进行遍历
item属性:遍历的结果放到哪里,这里将ids的遍历结果放到id中。
open属性:从何处开始进行遍历
close属性:从何处结束遍历
separator属性:分隔符是什么,这里的分隔符为‘,’,通过‘,’将id分离开来。
占位符只需要写#{id}即可,花括号里面的放的为我们将遍历结果放置的地方,也就是id。
3.测试代码:
package com.huida.test; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import javax.management.Query; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.omg.PortableInterceptor.USER_EXCEPTION; import com.huida.mapper.UserMapper;
import com.huida.po.User;
import com.huida.vo.QueryVo; public class UserMapperTest { private SqlSessionFactory factory=null;
@Before
public void init() throws Exception{
//通过流将核心配置文件读取进来
InputStream inputStream=Resources.getResourceAsStream("config/SqlMapConfig.xml");
//通过核心配置文件输入流来创建工厂
factory=new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testfindUserByIds(){
//创建SqlSession
SqlSession openSession=factory.openSession();
//通过会话的getMapper方法来实例化接口(实现类的对象)
UserMapper userMapper=openSession.getMapper(UserMapper.class);//参数放接口的字节码文件
QueryVo vo=new QueryVo();
List<Integer> ids=new ArrayList<>();
ids.add(1);
ids.add(10);
ids.add(22);
ids.add(24);
vo.setIds(ids);
List<User> list=userMapper.findUserByIds(vo);
System.out.println(list);
}
}