侧边栏壁纸
博主头像
爱探索

行动起来,活在当下

  • 累计撰写 42 篇文章
  • 累计创建 11 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

mybatis-plus-SimpleQuery

jelly
2024-08-19 / 0 评论 / 0 点赞 / 74 阅读 / 0 字

Mybatis-plus-SimpleQuery

官方文档

本文与官网大多数一致,只是在示例中加入了一些实际验证的代码,日志可能和与官网略有出入(预估是因为版本原因)

本文测试代码中mybatis-plus依赖:


    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>3.5.7</version>
    </dependency>

SimpleQuery 是 Mybatis-Plus 提供的一个工具类,它对 selectList 查询后的结果进行了封装,使其可以通过 Stream 流的方式进行处理,从而简化了 API 的调用。

SimpleQuery 的一个特点是它的 peeks 参数,这是一个可变参数,类型为 Consumer...,意味着你可以连续添加多个操作,这些操作会在查询结果被处理时依次执行。

注:使用 SimpleQuery 前,需要确保项目中已注入对应实体的 BaseMapper。

常用函数

keyMap

keyMap函数签名

SimpleQuery 的 keyMap 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 Map,其中实体的某个属性作为键(key),实体本身作为值(value)。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。

  • public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks)

  • public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... peeks)

keyMap参数说明

类型参数名描述
Eentity实体对象类型,即查询结果的实体类型。
Aattribute实体属性类型,也是返回的 Map 中键(key)的类型。
LambdaQueryWrapper<E>wrapper支持 lambda 表达式的条件构造器,用于构建查询条件。
SFunction<E, A>sFunction实体中属性的 getter 方法引用,用于确定 Map 中键(key)的值。
booleanisParallel如果设置为 true,则底层使用并行流执行查询,可以提高处理大量数据时的效率。
Consumer<E>…peeks可变参数,用于指定在处理查询结果时执行的额外操作,如打印日志、更新缓存等。

map

SimpleQuery 的 map 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 Map,其中实体的某个属性作为键(key),另一个属性作为值(value)。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。

map函数签名

  • public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, Consumer<E>... peeks)

  • public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, boolean isParallel, Consumer<E>... peeks)

map参数说明

类型参数名描述
Eentity实体对象类型,即查询结果的实体类型。
Aattribute实体属性类型,作为返回的 Map 中键(key)的类型。
Pattribute实体属性类型,作为返回的 Map 中值(value)的类型。
LambdaQueryWrapper<E>wrapper支持 lambda 表达式的条件构造器,用于构建查询条件。
SFunction<E, A>keyFunc实体中属性的 getter 方法引用,用于确定 Map 中键(key)的值。
SFunction<E, P>valueFunc实体中属性的 getter 方法引用,用于确定 Map 中值(value)的值。
booleanisParallel如果设置为 true,则底层使用并行流执行查询,可以提高处理大量数据时的效率。
Consumer<E>…peeks可变参数,用于指定在处理查询结果时执行的额外操作,如打印日志、更新缓存等。

group

SimpleQuery 的 group 方法提供了一种便捷的方式来查询数据库,并将查询结果按照实体的某个属性进行分组,封装成一个 Map。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。此外,它还允许你使用 Collector 对分组后的集合进行进一步的处理。

group函数签名

  • public static <E, A> Map<A, List<E>> group(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks)
  • public static <T, K> Map<K, List<T>> group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, boolean isParallel, Consumer<T>... peeks)
  • public static <T, K, D, A> Map<K, D> group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, Collector<T, A, D> downstream, Consumer<T>... peeks)
  • public static <T, K, D, A> Map<K, D> group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, Collector<T, A, D> downstream, boolean isParallel, Consumer<T>... peeks)

group参数说明

类型参数名描述
Tentity实体对象类型,即查询结果的实体类型。
Kattribute实体属性类型,作为返回的 Map 中键(key)的类型。
D-下游收集器返回类型,作为 Map 中值(value)的类型。
A-下游操作中间类型,用于 Collector 的中间结果。
M-最终结束返回的 Map<K, D> 类型。
LambdaQueryWrapper<T>wrapper支持 lambda 表达式的条件构造器,用于构建查询条件。
SFunction<T, K>sFunction分组依据,实体中属性的 getter 方法引用,用于确定 Map 中键(key)的值。
Collector<T, A, D>downstream下游收集器,用于对分组后的集合进行进一步的处理。
booleanisParallel如果设置为 true,则底层使用并行流执行查询,可以提高处理大量数据时的效率。
Consumer<T>…peeks可变参数,用于指定在处理查询结果时执行的额外操作,如打印日志、更新缓存等。

list

list函数签名

  • public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks)
  • public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... peeks)

list参数说明

SimpleQuery 的 list 方法提供了一种便捷的方式来查询数据库,并将查询结果封装成一个 List,其中列表的元素是实体的某个属性。这个方法还支持在处理查询结果时执行额外的副作用操作,如打印日志或更新缓存。

类型参数名描述
Eentity实体对象类型,即查询结果的实体类型。
Aattribute实体属性类型,作为返回的 List 中元素的类型。
LambdaQueryWrapper<E>wrapper支持 lambda 表达式的条件构造器,用于构建查询条件。
SFunction<E, A>sFunction实体中属性的 getter 方法引用,用于确定 List 中元素的值。
booleanisParallel如果设置为 true,则底层使用并行流执行查询,可以提高处理大量数据时的效率。
Consumer<E>…peeks可变参数,用于指定在处理查询结果时执行的额外操作,如打印日志、更新缓存等。

使用示例

    /*************************************************************************/
    //执行一个检查的查询
    @Test
    public void testKeyMap1() {
        Map<Integer, PurchaseOrderPo> integerPurchaseOrderPoMap = SimpleQuery.keyMap(
                Wrappers.lambdaQuery(PurchaseOrderPo.class), // 使用 lambda 查询构建器
                PurchaseOrderPo::getId// 提取的字段,这里是 User 的 id
        );
        log.info("integerPurchaseOrderPoMap:{}",integerPurchaseOrderPoMap);
    }
    // ==>  Preparing: SELECT id,username,state,create_time,update_time FROM purchase_order
    // ==> Parameters: 
    //这里我只写了sql日志,查询结果比较多。这里就不在写了
    //返回结果是一个map key是PurchaseOrderPo::getId的值(也就是主键ID),Value是PurchaseOrderPo
    

    /*************************************************************************/
    //执行一个简单查询,并打印日志
    @Test
    public void testKeyMap2() {
        Map<Integer, PurchaseOrderPo> integerPurchaseOrderPoMap = SimpleQuery.keyMap(
                Wrappers.lambdaQuery(PurchaseOrderPo.class), // 使用 lambda 查询构建器
                PurchaseOrderPo::getId,// 提取的字段,这里是 User 的 id
                System.out::println
        );
    }

    // ==>  Preparing: SELECT id,username,state,create_time,update_time FROM purchase_order
    // ==> Parameters: 
    // <==    Columns: id, username, state, create_time, update_time
    // <==        Row: 3, 王五, 0, null, 03:21:36
    // <==        Row: 4, 王小红, 1, null, null
    // <==        Row: 5, 王麻子, 1, null, null
    // <==        Row: 6, 李小雨, 2, null, null
    // <==        Row: 9, 王二狗, 1, 03:04:21, 03:04:21
    // <==      Total: 5
    // Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7eefaca0]
    // PurchaseOrderPo(id=3, username=王五, state=0, createTime=null, updateTime=Thu Jan 01 03:21:36 CST 1970)
    // PurchaseOrderPo(id=4, username=王小红, state=1, createTime=null, updateTime=null)
    // PurchaseOrderPo(id=5, username=王麻子, state=1, createTime=null, updateTime=null)
    // PurchaseOrderPo(id=6, username=李小雨, state=2, createTime=null, updateTime=null)
    // ...
    //这里使用 System.out::println答应了每一行内容


    /*************************************************************************/
    @Test
    public void testMap1() {
        Map<String, Date> map = SimpleQuery.map(
                Wrappers.lambdaQuery(PurchaseOrderPo.class).eq(PurchaseOrderPo::getState,0), // 使用 lambda 查询构建器
                PurchaseOrderPo::getUsername,// 提取的字段,这里是 User 的 id
                PurchaseOrderPo::getCreateTime,
                System.out::println
        );
    }


    // ==>  Preparing: SELECT id,username,state,create_time,update_time FROM purchase_order WHERE (state = ?)
    // ==> Parameters: 0(Integer)
    // <==    Columns: id, username, state, create_time, update_time
    // <==        Row: 3, 王五, 0, null, 03:21:36
    // <==      Total: 1

    // 这个函数中使用Wrappers.lambdaQuery(PurchaseOrderPo.class).eq(PurchaseOrderPo::getState,0)过滤
    //返回的map中PurchaseOrderPo::getUsername的结果为key,PurchaseOrderPo::getCreateTime结果为value
    //打印了查询的结果

    /*************************************************************************/
    @Test
    public void testGroup1() {
        Map<Integer, List<PurchaseOrderPo>> group = SimpleQuery.group(
                Wrappers.lambdaQuery(PurchaseOrderPo.class), // 使用 lambda 查询构建器
                PurchaseOrderPo::getState,// 提取的字段,这里是 User 的 id
                System.out::println
        );
    }

    // ==>  Preparing: SELECT id,username,state,create_time,update_time FROM purchase_order
    // ==> Parameters: 
    // <==    Columns: id, username, state, create_time, update_time
    // <==        Row: 3, 王五, 0, null, 03:21:36
    // <==        Row: 4, 王小红, 1, null, null
    // ···
    //这里返回的Map key是PurchaseOrderPo::getState值,value是PurchaseOrderPo

     /*************************************************************************/
    @Test
    public void testList1() {
        List<String> usernames = SimpleQuery.list(
                Wrappers.lambdaQuery(PurchaseOrderPo.class), // 使用 lambda 查询构建器
                PurchaseOrderPo::getUsername,
                System.out::println
        );
        log.info("usernames:{}",usernames);
    }
    // ==>  Preparing: SELECT id,username,state,create_time,update_time FROM purchase_order
    // ==> Parameters: 
    // <==    Columns: id, username, state, create_time, update_time
    // <==        Row: 3, 王五, 0, null, 03:21:36
    // <==        Row: 4, 王小红, 1, null, null
    // <==        Row: 5, 王麻子, 1, null, null
    //....
    //这里返回的List中值是PurchaseOrderPo::getUsername中的


可以看出上面接个函数转换出来的sql都基本一样,主要是对查询到的结果进行了的二次操作封装

0

评论区