mp官网接口介绍
// 查询全部记录 1. <V> List<V> listObjs(Function<? super Object, V> mapper); // 根据 Wrapper 条件,查询全部记录 2. <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);接口源码
1. default List<Object> listObjs() { return this.listObjs(Function.identity()); } 2. default <V> List<V> listObjs(Function<? super Object, V> mapper) { return this.listObjs(Wrappers.emptyWrapper(), mapper); } 3. default List<Object> listObjs(Wrapper<T> queryWrapper) { return this.listObjs(queryWrapper, Function.identity()); } 4. default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) { return (List)this.getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); }可以看到接口源码中 方法2 调用了方法4
方法4的意义是 : this.getBaseMapper().selectObjs(queryWrapper): 拿到BaseMapper,再调用它的selectObjs方法传入queryWrapper条件,查出数据list, stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()): 再利用流处理,过滤掉空值,筛选出mapper类型的数据,重新组成一个集合。就得到了我们所需要的List<V>数据。 这个V类型就是我们上面所说的Function中所传的泛型V,就是我们想要转换的类型。接下来看一下我们在Service业务方法中 对Function的方法实现以及对listObjs()方法的调用。
1.先实例化出Function接口 ,实现apply接口,进行类型转换, 其中Object类型的参数是我们实体类中使用Mp的@TableId注解标注的属性, ## 由于主键属性的类型不定,所以mp只能定为Object类型来限制传参。 ## 如果没有标注注解,则根据属性名对应数据库表的字段进行匹配查找(参数一般都是主键id,除非你使用@TableId注解标注了其他字段) Function<Object,Long> function = new Function<Object, Long>() { @Override public Long apply(Object id) { //进行一系列转换操作 ,最终返回我们所需要的类型V , 这里只做简单演示。 return Long.valueOf(id.toString()); } }; 2.调用listObjs(queryWarpper,function)方法,这里queryWrapper就不做介绍。 List<Long> longs1 = listObjs(null, function); 3.经过Function的处理我们会得到表中数据的所有主键做组成的list集合。另两种写法 , 和上面的写法一致 ,推荐最后一种。
//匿名类写法 List<Long> longs = listObjs(null, new Function<Object, Long>() { @Override public Long apply(Object id) { //进行一系列转换操作 ,最终返回我们所需要的类型V , 这里只做简单演示。 return Long.valueOf(id.toString()); } }); //简写 List<Long> longs = listObjs(null, a ->{ return Long.valueOf(a.toString()); });先写这么多 , 上面的理解如有错误 ,还请大佬们多多指教。