1.输入映射
通过parameterType指定输入参数类型,类型可以是简单类型,hashmap,pojo的包装类型
但是有时我们的需求传入的查询条件很复杂(可能包括用户信息,商品,订单信息等)
此时我们可以根据这个需求来自定义包装类型的pojo
在包装类型的pojo中将复杂的查询条件包装进去
package com.ddd.mybatis.pojo;
/**
* 一般的user是使用逆向工程代码来生成,不可变,那如果想要扩展可以使用继承
* @author Dan
*
*/
public class UserCustom extends User{
//自定义一些扩展属性
}
package com.ddd.mybatis.pojo;
/**
* 根据特殊需求自定义的包装类
* @author Dan
*
*/
public class UserQueryVo {
private UserCustom userCustom;
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
这两个特殊需要的pojo类我们就算完成了,那么接下来就是编写sql,修改mapper.xml
首先在这个数据库中走一遍
代码实现如下:
<!-- 综合查询用户信息 -->
<select id="findUserList" parameterType="com.ddd.mybatis.pojo.UserQueryVo" resultType="com.ddd.mybatis.pojo.UserCustom">
SELECT * FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'
</select>
接下来写相应的mapper接口方法:
//综合查询用户信息
public List<UserCustom> findUserList(UserQueryVo userQueryVo);
然后测试:
@Test
public void testFindUserList() {
//由于之前是在UserDaoImpl中每次获取sqlSession,所以这里需要我们手动写
SqlSession sqlSession=sqlSessionFactory.openSession();
//mybatis自动生成mapper代理对象,代理对象内部调用selectOne或者selectList
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法,但这里如果不小心用一个单个user来接收,那会报错
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setSex("男");
userCustom.setUsername("张伟");
userQueryVo.setUserCustom(userCustom);
List<UserCustom> list=userMapper.findUserList(userQueryVo);
System.out.println(list);
}
测试结果:
日志就不打印了…
下面这个是结果
[User [id=6, username=大张伟, sex=男, birthday=Mon Jul 17 00:00:00 CST 2017, address=广州佛山], User [id=8, username=大张伟, sex=男, birthday=Mon Jul 17 00:00:00 CST 2017, address=广州佛山], User [id=10, username=大张伟, sex=男, birthday=Mon Jul 17 00:00:00 CST 2017, address=广州佛山]]