Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)
首先 我们先看到的这个方法入参是:Function<? super Object , V> mapper ,这是jdk1.8为了统一简化书写格式引进的函数式接口 。
简单 解释一下我对Function函数的理解 , 就以上面的写法为例,可以看到Function函数要传入两个类型:
1. ? super Object 这个类型限制了下限 , 即 传入的类型必须是Object的超类,或者是Object ,所以 ,函数的第一个类型必然是 Object类型 ,后面会说为什么会是Object类型
2. V 没有限制泛型的上下边界 , 所以可以为任何类型
3. 每个函数式接口的典型特点就是有且仅有一个可以实现的接口 , Function也不例外;看下接口部分源码: @FunctionalInterface
public interface Function<T, R> {
R apply(T t);
...
}
4. 看到这里应该明白,这个接口做的就是类型之间 T和R 的转换 ,传入T类型 ,返回R类型。
5. 那么上面的Function<? super Object, V>写法 就是说 传入Object类型 , 返回 V 类型 。 对Function接口,就说这么多 ,这里不做详细解释 ,想了解可以去自行搜索。 对于mp的业务方法listObjs()方法 ,我们只讨论它的泛型方法 ,下面是方法介绍
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());
});
Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)的更多相关文章
- MyBatis学习--mybatis开发dao的方法
简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...
- 四 mybatis开发dao的方法
mybatis开发dao的方法 1.1 SqlSession使用范围 1.1.1 SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...
- spring与mybatis五种整合方法
1.采用数据映射器(MapperFactoryBean)的方式 不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1)Spring配置文件: <!-- 引入jdbc ...
- MyBatis(3)开发dao方法
本次全部学习内容:MyBatisLearning SqlSession SqlSession是一个面向用户(程序员)的接口. SqlSession中提供了很 ...
- 为什么不应该重写service方法?
故事通常是这样开始的: 从前,有一个程序猿,他语重心长地对孙子说:“孩子,要是你以后写servlet,最好不要重写service方法啊” 孙子大为不解,程序猿又说:“听爷爷的,准没错,爷爷的爷爷就 ...
- mybatis学习记录二——mybatis开发dao的方法
4.1 SqlSession使用范围 4.1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSession ...
- Mybatis学习记录(二)----mybatis开发dao的方法
1 SqlSession使用范围 1.1 SqlSessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory 将Sq ...
- Mybatis 开发 dao 的方法
1.分析SqlSession使用范围 1.1.SqlSessionFactoryBuilder 通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory ...
- spring与mybatis三种整合方法
spring与mybatis三种整合方法 本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接 http://code.googl ...
随机推荐
- ios真机使用fixed定位页面滚动时fixed定位的元素也会跟着滚动
到了ios真机APP中,页面向下滚动,fixed的元素也跟着滚,虽然最后它还是到了它该在的地方,但是它跟着滚动也很影响页面的流畅性和交互性好伐.
- 【DKNN】Distilling the Knowledge in a Neural Network 第一次提出神经网络的知识蒸馏概念
原文链接 小样本学习与智能前沿 . 在这个公众号后台回复"DKNN",即可获得课件电子资源. 文章已经表明,对于将知识从整体模型或高度正则化的大型模型转换为较小的蒸馏模型,蒸馏非常 ...
- 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器
[GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...
- 教学之Treap
放在前面的话 本蒟蒻因为最近的题目总是搞点奇奇怪怪的平衡树,就去学了下\(Treap\) 现在来总结一下 由于本人是个蒟蒻,本文可能有部分错误,麻烦各位读者大佬在评论区提醒 什么是\(Treap\) ...
- 20190713_windows 2008 R2在启动网站时报错_另一个程序正在使用此文件,进程无法访问
80端口已经被占用了; 换个端口就好了, 如果你是云服务器, 记得控制台也要开放对应的端口
- Synchronized和ReentTrantLock二者区别
写在前面 Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock.这两种锁以及后面提到 ...
- 第12.6节 Python标准库其他内置模块导览
一. 文本处理服务 string模块 : 常见的字符串操作 difflib模块: 计算差异的辅助工具 textwrap模块: 文本自动换行与填充,能够格式化文本段落,以适应给定的屏幕宽度: unico ...
- PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的text属性
text属性保存按钮上显示的文字,如果按钮未设置文字则为空字符串.如果文字中包含有与符号('&'),则该按钮会自动设置一个快捷键,快捷键就是'&'后第一个字符,显示时会在该字符下加下划 ...
- [BJDCTF 2nd]简单注入
[BJDCTF 2nd]简单注入 hint.txt出现了内容. 大概意思和国赛一道题相同. username处注入\来转义单引号,password处使用sql语句整数型注入. 例如: 传入admin\ ...
- .Net Core ABP应用如何在阿里云Linux Docker中开启Https
.Net Core应用开启Https本身就有很多种方式:1.代码配置2.环境变量3.反向代理 这里主要记录下阿里云的ECS,加阿里云免费的SSL证书,通过程序代码,如何进行配置. 首先从阿里云下载证书 ...