写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
之前几篇中其实一直都在使用MP的条件构造器的,并且官方文档对它介绍的很详细了,不过之前也提到,平时用的时候一般都是将查询条件封装到一个对象中,所以就没怎么用,不过还是没忍住试了使用Wrapper自定义SQl的使用方式,顺便也记下来吧,我试了下使用它分页查询单表和多表,它这个${ew.customSqlSegment}不用我们再自己写where条件了还是挺方便的。
先看下单表分页查询,UserMapper中添加测试方法:
@Select("select * from t_user ${ew.customSqlSegment}")
Page<User> selectByWrapper(Page<User> page, @Param(Constants.WRAPPER) Wrapper wrapper);
CurdTest测试类中增加测试方法:
@Test
public void gWrapper(){
LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda()
.ge(User::getAge,10).like(User::getUserName,"zhang");
Page<User> page = new Page<User>(1,3);
Page<User> userPage = userMapper.selectByWrapper(page, wrapper);
System.out.println(userPage.getPages() + "---" + userPage.getRecords());
}
执行结果:
再试一下多表查询,多表查询就不能使用像上面单表一样的lambda表达式形式的写法了,只能使用QueryWrapper或者UpdateWrapper,也就是说设置查询条件的时候只能是表字段,官网也有说,
UserMapper类中增加测试方法:
Page<UserOrdersDto> selectByWrappers(Page<UserOrdersDto> page, @Param(Constants.WRAPPER) Wrapper wrapper);
UserMapper.xml中:
<resultMap id="userOrderResultMap" type="com.example.springbootmp.dto.user.UserOrdersDto">
<id property="userId" column="user_id" />
<result property="userName" column="user_name" />
<result property="age" column="age" />
<collection property="orders" column="user_id" ofType="com.example.springbootmp.domain.Order">
<id property="orderId" column="order_id" />
<result property="userId" column="user_id" />
<result property="number" column="number" />
</collection>
</resultMap>
<sql id="user_orders">
select u.*,od.* from t_user u left join t_orders od on u.user_id = od.user_id
</sql>
<select id="selectByWrappers" resultMap="userOrderResultMap" >
<include refid="user_orders"></include>
${ew.customSqlSegment}
</select>
测试类中新增测试方法:
@Test
public void gWrapper(){
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("u.user_id",1);
wrapper.ne("od.number","100000");
Page<UserOrdersDto> page = new Page<UserOrdersDto>(1,3);
Page<UserOrdersDto> userPage = userMapper.selectByWrappers(page, wrapper);
System.out.println(userPage.getPages() + "---" + userPage.getRecords());
}
执行结果:
多表查询的时候构造查询条件的时候居然要使用数据库字段才可以,有点不太好用了,关于KtQueryWrapper是够可以使用对象属性以后再补充,暂时先到这里,之后还是以对象的形式传递查询条件。