//通过包装类来进行复杂的用户信息综合查询
public List findUserList(UserQueryVO userQueryVO);
//综合查询用户总数
public int findUsersCount(UserQueryVO userQueryVO);
(4)测试代码
不传用户名:
@Test
public void testFindUserList() throws Exception{
// 创建UserMapper对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 由mybatis通过sqlsession来创建代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
QueryUserVO vo = new QueryUserVO();
User user = new User();
//此处使用动态SQL,不传username参数
user.setSex("1");
// user.setUsername("小明");
vo.setUser(user);
List list = mapper.findUserList(vo);
System.out.println(user);
sqlSession.close();
}
输出的SQL如下(也不包含用户名):
通过测试可以得知,打印出的SQL语句确实会随着条件的满足情况而不一样。
2、SQL片段
Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。
2.1定义SQL片段
使用sql标签来定义一个SQL片段:
AND sex = #{userExt.sex}
AND username LIKE '%${userExt.username}%'
2.2引用SQL片段
使用 来引用SQL片段:
SELECT * FROM USER
SELECT count(1) FROM USER
3、foreach
向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到SQL中。
(1)传递pojo对象中的list集合
1.1需求
在用户查询列表和查询总数的statement中增加多个id输入查询。
1.2SQL
SELECT * FROM user WHERe id IN (1,10,16)
1.3定义pojo中的list属性
package com.itheima.mybatis.po;
import java.util.List;
public class UserQueryVO {
//用户信息
private UserExt userExt;
//商品ID集合
private List idList;
//商品信息
public List getIdList() {
return idList;
}
public void setIdList(List idList) {
this.idList = idList;
}
public UserExt getUserExt() {
return UserExt;
}
public void setUserExt(UserExt userExt) {
this.UserExt = UserExt;
}
//订单信息
}
1.4映射文件
#{id}
1.5Mapper接口
//根据用户ID的集合查询用户列表(学习foreach标签之通过POJO对象传ID集合)
public List findUserList(UserQueryVO vo);
1.6测试代码
@Test
public void testFindUserList() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 构造QueryUserVO对象
QueryUserVO vo = new QueryUserVO();
// UserExt ext = new UserExt();
// ext.setUsername("小明");
// ext.setSex("1");
// vo.setUserExt(ext);
// 创建用户ID集合,然后设置到QueryUserVO对象中
List idList = new ArrayList();
idList.add(1);
idList.add(10);
idList.add(16);
vo.setIdList(idList);
// 调用mapper代理对象的方法
List list = mapper.findUserList(vo);
System.out.println(list);
// 关闭SqlSession
sqlSession.close();
}
(2)直接传递List集合
2.1需求
根据用户ID的集合查询用户列表
2.2SQL
SELECt * FROM user WHERe id IN (1,10,16)
2.3映射文件
SELECT * FROM USER
#{id}
2.4Mapper接口
//根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合)
public List findUsersByIdList (List idList);
2.5测试代码
@Test
public void findUsersByIdListTest() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 构造List集合
List idList = new ArrayList();
idList.add(1);
idList.add(10);
idList.add(16);
// 调用mapper对象的方法
List list = userMapper.findUsersByIdList (idList);
System.out.println(list);
// 关闭SqlSession
sqlSession.close();
}