在平时的开发中,不一定就是单纯的对一个实体进行增删改查,例如完成用户信息的综合查询,有时需要传入查询条件很复杂,可能包括用户信息、关联表的其它信息等。针对这种需求,在mybatis中我们可以使用自定义的包装类型的pojo,在包装类型的pojo中将复杂的查询条件包装进去。
/**
* 用户包装类型
* @author Arlene-xu
*
*/
public class UserQueryVo {
//在这里包装所需要的查询条件
//用户查询条件
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//可以包装其他的查询条件,比如订单、商品
//....
}
mapper.xml:
<!-- 用户信息综合查询
#{userCustom.sex}:取出pojo包装对象中性别值
${userCustom.username}:取出pojo包装对象中用户名称
-->
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom">
SELECT * FROM USER WHERE user.sex=#{userCustom.sex} AND user.username=#{userCustom.username}
</select>
Mapper.java:
//用户信息综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
说明:这里使用的是mapper代理方法,只需要写mapper接口,mapperx.ml映射文件和mapper接口在同一命名空间下。目的是为了对下边的代码进行统一生成。
User user= sqlSession.selectOne("test.findUserById", id);
sqlSession.insert("test.insertUser",user);
。。。。
但是需要遵循一些开发规范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
测试代码
//用户信息的综合查询
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper= sqlSession.getMapper(UserMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("张三丰");
userQueryVo.setUserCustom(userCustom);
//调用userMapper的方法
List<UserCustom> list=userMapper.findUserList(userQueryVo);
sqlSession.close();
System.out.println(list);
}
对mapper.xml文件进行了规范之后,在dao层接口中就不用再mapper.xml文件了,因为它们在同一个命名空间之下。不必再写Dao接口和实现类,只需要一个mapper接口类就可以。而使用自定义的包装类后,就可以对一些复杂的查询条件进行扩展,相当于一个实体对象对另外一个对象的引用,对两个对象或者说是对一些需要的属性进行封装,这样就可以给查询条件或者查询结果一个载体。