From ebe54da9895cc56fccb29135d27a655fe4bc28aa Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Tue, 9 Nov 2021 19:04:34 +0800 Subject: [PATCH] =?UTF-8?q?simple-query=20=E8=AE=A9=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=9B=B4=E7=AE=80=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extension/toolkit/SimpleQuery.java | 148 ++++++++++++++++++ .../test/toolkit/SimpleQueryTest.java | 102 ++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java create mode 100644 mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/toolkit/SimpleQueryTest.java diff --git a/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java b/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java new file mode 100644 index 000000000..87acf8388 --- /dev/null +++ b/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java @@ -0,0 +1,148 @@ +package com.baomidou.mybatisplus.extension.toolkit; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * simple-query 让简单的查询更简单 + * + * @author + * @since 2021/11/9 18:27 + */ +public class SimpleQuery { + private SimpleQuery() { + /* Do not new me! */ + } + + /** + * 通过lambda获取Class + * + * @param sFunction 可序列化的lambda + * @param Class类型 + * @return 对应的Class + */ + @SuppressWarnings("unchecked") + public static Class getType(SFunction sFunction) { + return (Class) LambdaUtils.extract(sFunction).getInstantiatedClass(); + } + + /** + * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map + * + * @param wrapper 条件构造器 + * @param sFunction key + * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 + * @param 实体类型 + * @param 实体中的属性类型 + * @return Map<实体中的属性, 实体> + */ + @SafeVarargs + public static Map keyMap(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { + return list2Map(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, Function.identity(), peeks); + } + + /** + * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map + * + * @param wrapper 条件构造器 + * @param keyFunc key + * @param valueFunc value + * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 + * @param 实体类型 + * @param 实体中的属性类型 + * @param

实体中的属性类型 + * @return Map<实体中的属性, 实体> + */ + @SafeVarargs + public static Map map(LambdaQueryWrapper wrapper, SFunction keyFunc, SFunction valueFunc, Consumer... peeks) { + return list2Map(SqlHelper.getMapper(getType(keyFunc)).selectList(wrapper), keyFunc, valueFunc, peeks); + } + + /** + * 传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map + * + * @param wrapper 条件构造器 + * @param sFunction 分组依据 + * @param peeks 后续操作 + * @param 实体类型 + * @param 实体中的属性类型 + * @return Map<实体中的属性, List < 实体>> + */ + @SafeVarargs + public static Map> group(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { + return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks); + } + + /** + * 传入wrappers和需要的某一列,从数据中根据条件查询出对应的列,转换成list + * + * @param wrapper 条件构造器 + * @param sFunction 需要的列 + * @param peeks 后续操作 + * @return java.util.List + * @author + * @since 2021/11/9 17:59 + */ + @SafeVarargs + public static List list(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { + return list2List(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks); + } + + + /** + * 对list进行map、peek操作 + * + * @param list 数据 + * @param sFunction 需要的列 + * @param peeks 后续操作 + * @return java.util.List + * @author + * @since 2021/11/9 18:01 + */ + @SafeVarargs + public static List list2List(List list, SFunction sFunction, Consumer... peeks) { + return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).map(sFunction).collect(Collectors.toList()); + } + + /** + * 对list进行groupBy操作 + * + * @param list 数据 + * @param sFunction 分组的key,依据 + * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 + * @param 实体类型 + * @param 实体中的属性类型 + * @return Map<实体中的属性, List < 实体>> + */ + @SafeVarargs + public static Map> listGroupBy(List list, SFunction sFunction, Consumer... peeks) { + return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(Collectors.groupingBy(sFunction)); + } + + + /** + * list转换为map + * + * @param 实体类型 + * @param 实体中的属性类型 + * @param

实体中的属性类型 + * @param list 数据 + * @param keyFunc key + * @param peeks 封装成map时可能需要的后续操作,不需要可以不传 + * @return Map<实体中的属性, 实体> + */ + @SafeVarargs + public static Map list2Map(List list, SFunction keyFunc, Function valueFunc, Consumer... peeks) { + return Stream.of(peeks).reduce(list.parallelStream(), Stream::peek, Stream::concat).collect(Collectors.toMap(keyFunc, valueFunc, (l, r) -> l)); + } + + +} diff --git a/mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/toolkit/SimpleQueryTest.java b/mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/toolkit/SimpleQueryTest.java new file mode 100644 index 000000000..08457a577 --- /dev/null +++ b/mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/toolkit/SimpleQueryTest.java @@ -0,0 +1,102 @@ +package com.baomidou.mybatisplus.test.toolkit; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import com.baomidou.mybatisplus.test.BaseDbTest; +import com.baomidou.mybatisplus.test.rewrite.Entity; +import com.baomidou.mybatisplus.test.rewrite.EntityMapper; +import org.junit.jupiter.api.Test; + +import java.util.*; + +/** + * 简单查询工具类测试 + * + * @author + * @since 2021/11/9 18:30 + */ +public class SimpleQueryTest extends BaseDbTest { + + @Test + public void testList() { + // 我要这张表里的ids + List entityIds = SimpleQuery.list(Wrappers.lambdaQuery(), Entity::getId); + + Assert.isTrue(entityIds.equals(Arrays.asList(1L, 2L)), "Ops!"); + // 可叠加后续操作 + List names = SimpleQuery.list(Wrappers.lambdaQuery(), Entity::getName, e -> Optional.ofNullable(e.getName()).map(String::toUpperCase).ifPresent(e::setName)); + + Assert.isTrue(names.equals(Arrays.asList("RUBEN", "A CHAO")), "Ops!"); + } + + @Test + public void testMap() { + // 我要这个表里对应条件的用户,用id作为key给我一个map + Map idEntityMap = SimpleQuery.keyMap(Wrappers.lambdaQuery().eq(Entity::getId, 1L), Entity::getId); + // 校验结果 + Entity entity = new Entity(); + entity.setId(1L); + entity.setName("ruben"); + Assert.isTrue(idEntityMap.equals(Collections.singletonMap(1L, entity)), "Ops!"); + + // 如果我只想要id和name组成的map + Map idNameMap = SimpleQuery.map(Wrappers.lambdaQuery(), Entity::getId, Entity::getName); + // 校验结果 + Map map = new HashMap<>(1 << 2); + map.put(1L, "ruben"); + map.put(2L, "a chao"); + Assert.isTrue(idNameMap.equals(map), "Ops!"); + + // 同样支持叠加后续操作 +// SimpleQuery.keyMap(Wrappers.lambdaQuery(), Entity::getId, System.out::println, System.out::println); + + } + + @Test + public void testGroup() { + // 我需要相同名字的用户的分为一组,再造一条数据 + BaseMapper mapper = SqlHelper.getMapper(Entity.class); + Entity entity = new Entity(); + entity.setId(3L); + entity.setName("ruben"); + mapper.insert(entity); + + // 简单查询 + Map> nameUsersMap = SimpleQuery.group(Wrappers.lambdaQuery(), Entity::getName); + + // 校验结果 + Map> map = new HashMap<>(1 << 2); + Entity chao = new Entity(); + chao.setId(2L); + chao.setName("a chao"); + map.put("a chao", Collections.singletonList(chao)); + + Entity ruben = new Entity(); + ruben.setId(1L); + ruben.setName("ruben"); + Entity ruben2 = new Entity(); + ruben2.setId(3L); + ruben2.setName("ruben"); + map.put("ruben", Arrays.asList(ruben, ruben2)); + Assert.isTrue(nameUsersMap.equals(map), "Ops!"); + + } + + @Override + protected String tableDataSql() { + return "insert into entity(id,name) values(1,'ruben'),(2,'a chao');"; + } + + @Override + protected List tableSql() { + return Arrays.asList("drop table if exists entity", "CREATE TABLE IF NOT EXISTS entity (" + + "id BIGINT NOT NULL," + + "name VARCHAR(30) NULL DEFAULT NULL," + + "PRIMARY KEY (id))"); + } + +} + -- Gitee