Mybatis中foreach的用法简介

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:是结尾的字符串.在本例中相当于右括号



猜你喜欢

转载自blog.csdn.net/jin2111843364/article/details/79952847