入门mybatis时,做的demo都是借助一个pojo类来传递参数到sql语句中,但现实的项目场景中,查询条件往往很复杂,比如:查询条件可以有user信息,商品信息,订单信息等。
一般不能随意改动po包下的pojo类(即逆向工程自动生成的),此时就需要我们来编写pojo的包装类型来封装更多的查询条件字段。
准备:1.原始pojo类 2.原始pojo的子类 3.包装类
1、先在mapper.xml中定义sql语句,如下:
<!-- 自定义查询条件查询,借助定义pojo包装类型实现
parameterType:指定包装类型,将不同的参数(可以是pojo,也可以是简单类型)传入进去
包装类型的好处:
-->
<select id="findUserList" parameterType="userQueryVo" resultType="user">
select * from user where username like '%${userCustom.username}%'
</select>
2、定义包装器类型,借助原pojo类的子类型(具体的字段扩展在子类中进行,避免pojo类和查询条件类型的过度耦合)
2.1原始pojo类:
public class User {
private int id;
private String username;
private String sex;}
2.2.原始pojo扩展类,也即子类:
/**
* User扩展对象
* 用于继承user类,直接获取user对象的字段
* 并添加一些扩展字段
* @author jiangs
*
*/
public class UserCustom extends User{
//可以添加一些user类中没有的字段
//...
}
2.3.pojo包装类(parameterType中使用此类):
/**
* pojo包装类型,将来在使用时从页面传到controller、service、mapper
* 用于扩展mapper接口单一的参数类型
*
*/
public class UserQueryVo {
private UserCustom userCustom;
//提供get set方法,作为参数传进来
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
3、编写测试用例(主要代码)
-
@Test public void testFindUserList()throws Exception{ SqlSession session = sessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); //new UserQueryVo userQueryVo = new UserQueryVo(); //new UserCustom userCustom = new UserCustom(); userCustom.setSex("女"); userCustom.setUsername("小张"); //传对象 userQueryVo.setUserCustom(userCustom); List<User> userlist = userMapper.findUserList(userQueryVo); System.out.println(userlist); session.close(); }