MyBatista Plus笔记-01

MyBatista Plus笔记-01

第1章 介绍和快速入门

1-1 官方文档

https://mp.baomidou.com/

1-5 快速入门案例

https://mp.baomidou.com/guide/quick-start.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B7%A5%E7%A8%8B

第2章 基本使用

2-1 新增方法

  • insert(T)

2-2 常用注解

https://mp.baomidou.com/guide/annotation.html#tablefield

2-3 排除非表中字段的三种方式

private transient String remark;
private static String remark;
    @TableField(exist = true)
    private static String remark;

第3章 查询方法

3-1 普通查询

package io.github.talelin.merak.mapper;

import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MpDemoUserMapperTest {

    @Resource
    private MpDemoUserMapper mapper;


    @Test
    public void selectById(){
//        MpDemoUser user = mapper.selectById(10000L);// 不存在返回null

        MpDemoUser user1 = mapper.selectById(1087982257332887553L);
        System.out.println(user1);
    }
    @Test
    public void selectBatchIds(){

//        数组中有错的也没事,不会报错
        List<Long> longs = Arrays.asList(1087982257332887553L, 12343452346L, 1088248166370832385L);
        List<MpDemoUser> users = mapper.selectBatchIds(longs);

        System.out.println(users);
    }

    @Test
    public void selectByMap(){
        HashMap<String, Object> stringStringHashMap = new HashMap<>();
        stringStringHashMap.put("name", "大boss");
        List<MpDemoUser> users = mapper.selectByMap(stringStringHashMap);

        System.out.println(users);
    }

}

3-2 条件构造器查询(1)

package io.github.talelin.merak.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 条件构造器查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest1 {

    @Resource
    private MpDemoUserMapper mapper;


    /**
     * 查询的时候一般用queryWrapper
     * 更新用UpdateWrapper
     * <p>
     * 1、名字中包含雨并且年龄小于40
     * name like '%雨%' and age<40
     */
    @Test
    public void selectByWrapper() {

//        两种构造方式,第二种写起来感觉怪怪的
        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();
//        QueryWrapper<MpDemoUser> q = wrapper1.like("雨","name");
        QueryWrapper<MpDemoUser> qw1 = wrapper1.like("name", "雨").lt("age", 40);
        QueryWrapper<MpDemoUser> qw2 = wrapper1.like("name", "雨").and(s -> s.lt("age", 40));


        List<MpDemoUser> users = mapper.selectList(qw1);
        System.out.println(users);
    }


    /**
     * 2、名字中包含雨年并且龄大于等于20且小于等于40并且email不为空
     * name like '%雨%' and age between 20 and 40 and email is not null
     */
    @Test
    public void selectByWrapper2() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper2.like("name", "雨").between("age", 20, 40).isNotNull("email");

        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


    /**
     *3、名字为王姓或者年龄大于等于25,按照年龄降序排列,年龄相同按照id升序排列
     *      name like '王%' or age>=25 order by age desc,id asc
     */
    @Test
    public void selectByWrapper3() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper1
                .likeRight("name", "王")
                .or(s->s.ge("age",25))
                .orderByDesc("age")
                .orderByAsc("id");


        QueryWrapper<MpDemoUser> qw2 = wrapper1
                .likeRight("name", "王")
                .or()
                .ge("age",25)
                .orderByDesc("age")
                .orderByAsc("id");

        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


}

3-3 条件构造器查询(2)

3-4 条件构造器查询(3)

3-5 条件构造器查询(4)

package io.github.talelin.merak.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 条件构造器查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest1 {

    @Resource
    private MpDemoUserMapper mapper;


    /**
     * 查询的时候一般用queryWrapper
     * 更新用UpdateWrapper
     * <p>
     * 1、名字中包含雨并且年龄小于40
     * name like '%雨%' and age<40
     */
    @Test
    public void selectByWrapper() {

//        两种构造方式,第二种写起来感觉怪怪的
        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();
//        QueryWrapper<MpDemoUser> q = wrapper1.like("雨","name");
        QueryWrapper<MpDemoUser> qw1 = wrapper1.like("name", "雨").lt("age", 40);
        QueryWrapper<MpDemoUser> qw2 = wrapper1.like("name", "雨").and(s -> s.lt("age", 40));


        List<MpDemoUser> users = mapper.selectList(qw1);
        System.out.println(users);
    }


    /**
     * 2、名字中包含雨年并且龄大于等于20且小于等于40并且email不为空
     * name like '%雨%' and age between 20 and 40 and email is not null
     */
    @Test
    public void selectByWrapper2() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper2.like("name", "雨").between("age", 20, 40).isNotNull("email");

        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


    /**
     * 3、名字为王姓或者年龄大于等于25,按照年龄降序排列,年龄相同按照id升序排列
     * name like '王%' or age>=25 order by age desc,id asc
     */
    @Test
    public void selectByWrapper3() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper1
                .likeRight("name", "王")
                .or(s -> s.ge("age", 25))
                .orderByDesc("age")
                .orderByAsc("id");


        QueryWrapper<MpDemoUser> qw2 = wrapper1
                .likeRight("name", "王")
                .or()
                .ge("age", 25)
                .orderByDesc("age")
                .orderByAsc("id");

        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


    /**
     * 4、创建日期为2019年2月14日并且直属上级为名字为王姓
     * date_format(create_time,'%Y-%m-%d')='2019-02-14' and manager_id in (select id from user where name like '王%')
     * <p>
     * <p>
     * <p>
     * apply
     * apply(String applySql, Object... params)
     * apply(boolean condition, String applySql, Object... params)
     * 拼接 sql
     * 注意事项:
     * <p>
     * 该方法可用于数据库函数 动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!
     * <p>
     * 例: apply("id = 1")--->id = 1
     * 例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
     * 例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
     */
    @Test
    public void selectByWrapper4() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper1
                .apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
                .inSql("manager_id", "select id from mp_demo_user where name like '王%'");

        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


    /**
     * 5、名字为王姓并且(年龄小于40或邮箱不为空)
     * name like '王%' and (age<40 or email is not null)
     * <p>
     * #nested
     * nested(Consumer<Param> consumer)
     * nested(boolean condition, Consumer<Param> consumer)
     * 正常嵌套 不带 AND 或者 OR
     * 例: nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着')
     * #apply
     */
    @Test
    public void selectByWrapper5() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper1
                .likeRight("name", "王")
                .nested(item -> item.lt("age", 40).or().isNotNull("email"));

        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


    /**
     * 6、名字为王姓或者(年龄小于40并且年龄大于20并且邮箱不为空)
     * name like '王%' or (age<40 and age>20 and email is not null)
     */
    @Test
    public void selectByWrapper6() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper1
                .likeRight("name", "王")
                .or(item -> item.between("age", 20, 40).isNotNull("email"));

        QueryWrapper<MpDemoUser> qw2 = wrapper1
                .likeRight("name", "王")
                .or(item -> item.gt("age", 20).lt("age", 40).isNotNull("email"));


        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }


    /**
     *7、(年龄小于40或邮箱不为空)并且名字为王姓
     *     (age<40 or email is not null) and name like '王%'
     */
    @Test
    public void selectByWrapper7() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw = wrapper1
                .nested(item -> item.lt("age", 40).or().isNotNull("email"))
                .likeRight("name", "王");


        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }
    /**
     *8、年龄为30、31、34、35
     *     age in (30、31、34、35)
     *
     */
    @Test
    public void selectByWrapper8() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        List<Integer> list = Arrays.asList(30, 31, 32, 33, 34, 35);
        QueryWrapper<MpDemoUser> qw = wrapper1
                .in("age", list);



        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }



    /**
     * 9、只返回满足条件的其中一条语句即可
     * limit 1
     */
    @Test
    public void selectByWrapper9() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        List<Integer> list = Arrays.asList(30, 31, 32, 33, 34, 35);
        QueryWrapper<MpDemoUser> qw = wrapper1
                .in("age", list)
                .last("limit 1");



        List<MpDemoUser> users = mapper.selectList(qw);
        System.out.println(users);
    }




}

3-6 select不列出全部字段

package io.github.talelin.merak.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 条件构造器查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest2 {

    @Resource
    private MpDemoUserMapper mapper;


    /**
     * select中字段不全部出现的查询
     * 10、名字中包含雨并且年龄小于40(需求1加强版)
     * 第一种情况:select id,name
     * 	           from user
     * 	           where name like '%雨%' and age<40
     * 第二种情况:select id,name,age,email
     * 	           from user
     * 	           where name like '%雨%' and age<40
     *
     */
    @Test
    public void selectByWrapper10() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
        QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();

        QueryWrapper<MpDemoUser> qw1 = wrapper1
                .like("name", "雨")
                .lt("age", 40)
                .select("id", "name");


        QueryWrapper<MpDemoUser> qw2 = wrapper1
                .like("name", "雨")
                .lt("age", 40)
                .select(MpDemoUser.class, item -> !item.getColumn().equals("create_time") && !item.getColumn().equals("manager_id"));

        List<MpDemoUser> users = mapper.selectList(qw1);
        System.out.println(users);
    }



}

3-7 condition作用

    /**
     * LIKE '%值%'
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return children
     */
    Children like(boolean condition, R column, Object val);

如果是false就不会拼接这个子句。

之前我们如果遇到字段名称没有的时候,我们会写两条语句来实现这个查询

现在只需要一条就行了。

一般这样用

wrapper1.like(StringUtils.isEmpty(username), "name", "王");

3-8 实体作为条件构造器构造方法的参数

package io.github.talelin.merak.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 条件构造器查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest2 {

    @Resource
    private MpDemoUserMapper mapper;

    /**
     * Preparing: SELECT id,name,age,email,manager_id,create_time,update_time,version,deleted
     * FROM mp_demo_user
     * WHERE name=? AND deleted=0 
     */
    @Test
    public void selectByWrapperEntity() {
        MpDemoUser user = new MpDemoUser();
        user.setName("王大大");

        QueryWrapper<MpDemoUser> wrapper = new QueryWrapper<>(user);

        List<MpDemoUser> users = mapper.selectList(wrapper);
        System.out.println(users);
    }






}

3-9 AllEq用法

package io.github.talelin.merak.mapper;

import com.amdelamar.jhash.Hash;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 条件构造器查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest2 {

    @Resource
    private MpDemoUserMapper mapper;

    /**
     *allEq
     * Preparing: SELECT id,name,age,email,manager_id,create_time,update_time,version,deleted
     * FROM mp_demo_user
     * WHERE deleted=0 AND (name = ?)
     */
    @Test
    public void selectByWrapperAllEq() {

        QueryWrapper<MpDemoUser> wrapper = new QueryWrapper<>();
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "王大大");

        QueryWrapper<MpDemoUser> wrapper1 = wrapper.allEq(map);
//        QueryWrapper<MpDemoUser> wrapper1 = wrapper.allEq(map,true); //对null的忽略拼接SQL

        List<MpDemoUser> users = mapper.selectList(wrapper1);
        System.out.println(users);
    }


}

3-10 其他使用条件构造器的方法

  • List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);

    使用场景是:我们查询实体部分字段的时候,其他字段都是null,

    这时候我们只需要返回一个需要字段组成的map就行了。

    package io.github.talelin.merak.mapper;
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.toolkit.Wrappers;
    import io.github.talelin.merak.entity.MpDemoUser;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 条件构造器查询
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class WrapperTest3 {
    
        @Resource
        private MpDemoUserMapper mapper;
    
    
        /**
         * select中字段不全部出现的查询
         * 10、名字中包含雨并且年龄小于40(需求1加强版)
         *
         *      * 根据 Wrapper 条件,查询全部记录
         *      *
         *      * @param queryWrapper 实体对象封装操作类(可以为 null)
         *
         *    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
         *
         *
         */
        @Test
        public void selectByWrapperMaps() {
    
            QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
            QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();
    
            QueryWrapper<MpDemoUser> qw1 = wrapper1
                    .select("name","age")
                    .like("name", "雨");
    
            List<Map<String, Object>> maps = mapper.selectMaps(qw1);
    
            System.out.println(maps);
        }
    
    
    
    }
    
    2020-03-18 18:54:28.700 DEBUG 11448 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectMaps    : ==>  Preparing: SELECT name,age FROM mp_demo_user WHERE deleted=0 AND (name LIKE ?) 
    2020-03-18 18:54:28.700 DEBUG 11448 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectMaps    : ==> Parameters: %雨%(String)
    2020-03-18 18:54:28.701 DEBUG 11448 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectMaps    : <==      Total: 3
    [{name=张雨琪, age=31}, {name=刘红雨, age=32}, {name=雨狗蛋, age=12}]
    
  • slectMaps 可以实现一些查询结果的分组 聚合统计操作

    package io.github.talelin.merak.mapper;
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.toolkit.Wrappers;
    import io.github.talelin.merak.entity.MpDemoUser;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 条件构造器查询
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class WrapperTest3 {
    
        @Resource
        private MpDemoUserMapper mapper;
        /**
         * 三、统计查询:
         * 11、按照直属上级分组,查询每组的平均年龄、最大年龄、最小年龄。
         * 并且只取年龄总和小于500的组。
         * select avg(age) avg_age,min(age) min_age,max(age) max_age
         * from user
         * group by manager_id
         * having sum(age) <500
         */
        @Test
        public void selectByWrapper11() {
    
            QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();
            QueryWrapper<MpDemoUser> wrapper2 = Wrappers.<MpDemoUser>query();
    
            QueryWrapper<MpDemoUser> qw1 = wrapper1
                    .select("avg(age) avg_age", "min(age) min_age", "max(age) max_age")
                    .groupBy("manager_id")
                    .having("sum(age) < {0}", 500);
    
            List<Map<String, Object>> maps = mapper.selectMaps(qw1);
            System.out.println(maps);
        }
    
    }
    
    2020-03-18 18:59:58.389 DEBUG 11604 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectMaps    : ==>  Preparing: SELECT avg(age) avg_age,min(age) min_age,max(age) max_age FROM mp_demo_user WHERE deleted=0 GROUP BY manager_id HAVING sum(age) < ? 
    2020-03-18 18:59:58.390 DEBUG 11604 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectMaps    : ==> Parameters: 500(Integer)
    2020-03-18 18:59:58.392 DEBUG 11604 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectMaps    : <==      Total: 3
    [{max_age=40, avg_age=25.6667, min_age=12}, {max_age=25, avg_age=25.0000, min_age=25}, {max_age=32, avg_age=30.3333, min_age=28}]
    
    
  • /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
  • 计数

        /**
         * 根据 Wrapper 条件,查询总记录数
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         * Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
         */
        @Test
        public void selectByWrapperCount() {
    
            QueryWrapper<MpDemoUser> wrapper = new QueryWrapper<>();
    
            QueryWrapper<MpDemoUser> wrapper1 = wrapper.like("name", "王");
    
            Integer count = mapper.selectCount(wrapper1);
            System.out.println(count);
        }
    
    
    2020-03-18 19:06:27.543 DEBUG 11789 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectCount   : ==>  Preparing: SELECT COUNT( 1 ) FROM mp_demo_user WHERE deleted=0 AND (name LIKE ?) 
    2020-03-18 19:06:27.544 DEBUG 11789 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectCount   : ==> Parameters: %王%(String)
    2020-03-18 19:06:27.545 DEBUG 11789 --- [           main] i.g.t.m.m.MpDemoUserMapper.selectCount   : <==      Total: 1
    2
    
    
  • selectOne 注意查不出来返回null,查到多个报错

       /**
         /**
         * 根据 entity 条件,查询一条记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         *  T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
         *                
         */
        @Test
        public void selectByWrapperOne() {
    
            QueryWrapper<MpDemoUser> wrapper = new QueryWrapper<>();
    
            QueryWrapper<MpDemoUser> wrapper1 = wrapper.eq("name", "王大大");
    
            MpDemoUser user = mapper.selectOne(wrapper1);
            System.out.println(user);
        }
    

3-11 lambda条件构造器

    /**
     * LambdaQueryWrapper可以防止字段输入错误
     */
    @Test
    public void selectLambda() {


        LambdaQueryWrapper<MpDemoUser> lambdaQueryWrapper1 = new QueryWrapper<MpDemoUser>().lambda();
        LambdaQueryWrapper<MpDemoUser> lambdaQueryWrapper2 = new LambdaQueryWrapper<MpDemoUser>();
        LambdaQueryWrapper<MpDemoUser> lambdaQueryWrapper3 = Wrappers.lambdaQuery(MpDemoUser.class);


//        QueryWrapper<MpDemoUser> wrapper1 = Wrappers.<MpDemoUser>query();
//
//        QueryWrapper<MpDemoUser> qw1 = wrapper1
//                .like("name", "雨")
//                .lt("age", 40)
//                .select("id", "name");


        LambdaQueryWrapper<MpDemoUser> wr = lambdaQueryWrapper1
                .like(MpDemoUser::getName, "雨")
                .lt(MpDemoUser::getAge, 40)
                .select(MpDemoUser::getId, MpDemoUser::getName);


        List<MpDemoUser> users = mapper.selectList(wr);
        System.out.println(users);
    }

第4章 自定义sql及分页查询

本章介绍MyBatis-Plus中自定义sql和分页查询的内容。

4-1 自定义sql

又想使用条件构造器,又想自定义sql咋办

package io.github.talelin.merak.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import io.github.talelin.merak.entity.MpDemoUser;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author allen
 */
public interface MpDemoUserMapper extends BaseMapper<MpDemoUser> {


    /**
     * @param wrapper
     * @return
     */
    @Select("select * from mp_demo_user")
    List<MpDemoUser> findAllUser(@Param(Constants.WRAPPER) Wrapper<MpDemoUser> wrapper);
}

或者使用xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="io.github.talelin.merak.mapper.MpDemoUserMapper">

    <select id="findAllUser" resultType="io.github.talelin.merak.entity.MpDemoUser">
                select * from mp_demo_user 
    </select>


</mapper>
    @Test
    public void selectMy() {
        LambdaQueryWrapper<MpDemoUser> lambdaQueryWrapper1 = new QueryWrapper<MpDemoUser>().lambda();
//
        List<MpDemoUser> allUser = mapper.findAllUser(lambdaQueryWrapper1);
        System.out.println(allUser);
    }

4-2 分页查询

    @Test
    public void selectPage() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();

        QueryWrapper<MpDemoUser> qw1 = wrapper1
                .select("name","age")
                .like("name", "雨");

        Page<MpDemoUser> page = new Page<MpDemoUser>(1,2);

        Page<MpDemoUser> res = mapper.selectPage(page, null);
//        IPage<MpDemoUser> mpDemoUserPage = mpDemoUserPage1

        System.out.println(res);
    }

image-20200318201437842

第5章 更新及删除

介绍MyBatis-Plus中更新和删除功能的使用。

5-1 更新方法

 @Test
    public void update() {

        MpDemoUser user = new MpDemoUser();
        user.setId(1240100589369425925L);
        user.setName("王大大22");

        int res = mapper.updateById(user);


        System.out.println(res);
    }

    @Test
    public void updateByWrapper1() {

        LambdaUpdateWrapper<MpDemoUser> wrapper = new LambdaUpdateWrapper<>();
        LambdaUpdateWrapper<MpDemoUser> query = wrapper.eq(MpDemoUser::getId, "1240100589369425925");
        MpDemoUser user = new MpDemoUser();
        user.setEmail("王大大@33.com");

        int res = mapper.update(user, query);


        System.out.println(res);
    }

    /**
     * 上面的需要创建一个空的对象,不够优雅
     *   * 根据 whereEntity 条件,更新记录
     *      *
     *      * @param entity        实体对象 (set 条件值,可以为 null)
     *      * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    @Test
    public void updateByWrapper2() {

        LambdaQueryWrapper<MpDemoUser> objectLambdaQueryWrapper = Wrappers.lambdaQuery();
        LambdaUpdateWrapper<MpDemoUser> wrapper = new LambdaUpdateWrapper<>();
        LambdaUpdateWrapper<MpDemoUser> query = wrapper
                .eq(MpDemoUser::getId, "1240100589369425925")
                .set(MpDemoUser::getName, "王小小");

        int res = mapper.update(null, query);


        System.out.println(res);
    }

5-2 删除方法

  @Test
    public void deleteByList() {

        LambdaQueryWrapper<MpDemoUser> wrapper = Wrappers.lambdaQuery();

        LambdaQueryWrapper<MpDemoUser> query = wrapper.like(MpDemoUser::getName, "雨");
        List<Object> objects = mapper.selectObjs(query);
        System.out.println(objects);

        List<Long> collect = objects.stream().map(item -> Long.valueOf(String.valueOf(item))).collect(Collectors.toList());

        int i = mapper.deleteBatchIds(collect);
        System.out.println(i);


    }
    @Test
    public void deleteByWrapper() {

        LambdaQueryWrapper<MpDemoUser> wrapper = Wrappers.lambdaQuery();

        LambdaQueryWrapper<MpDemoUser> query = wrapper.like(MpDemoUser::getName, "雨");


        int delete = mapper.delete(query);
        System.out.println(delete);


    }

第6章 AR模式、主键策略和基本配置

本章介绍MyBatis-Plus中的AR模式、主键策略和基本配置等内容。

6-1 AR模式

AR模式类似于django中的ORM,一个模型类具备CURD的功能

package io.github.talelin.merak.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;


/**
 * (MpDemoUser)实体类
 *
 * @author makejava
 * @since 2020-03-18 09:56:00
 */
@TableName("mp_demo_user")
@Data
public class MpDemoUser extends Model<MpDemoUser> {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.NONE)  //默认的 NONE
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 直属上级id
     */
    private Long managerId;
    /**
     * 创建时间
     * 需要自动填充
     */
    @TableField(fill = FieldFill.UPDATE)
    private Date createTime;
    /**
     * 修改时间
     * 需要自动填充
     */
    @TableField(fill = FieldFill.INSERT)
    private Date updateTime;
    /**
     * 版本
     */
    private Integer version;
    /**
     * 逻辑删除标识(0.未删除,1.已删除)
     * 需要配置逻辑删除
     */

    @TableLogic(value = "0", delval = "1")
    private Integer deleted;


    @TableField(exist = true)
    private static String remark;


}

package io.github.talelin.merak.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 条件构造器查询
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class ARTest5 {

    @Resource
    private MpDemoUserMapper mapper;



    @Test
    public void arTest() {

        QueryWrapper<MpDemoUser> wrapper1 = new QueryWrapper<>();

        QueryWrapper<MpDemoUser> qw1 = wrapper1
                .like("name", "雨");



        MpDemoUser user = new MpDemoUser();
        Integer count = user.selectCount(qw1);
        System.out.println(count);

    }


}

其他的API看源码就好

6-2 主键策略

@TableId

  • 描述:主键注解
属性 类型 必须指定 默认值 描述
value String “” 主键字段名
type Enum IdType.NONE 主键类型

#IdType

描述
AUTO 数据库ID自增
NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT insert前自行set主键值
ASSIGN_ID 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)
ID_WORKER 分布式全局唯一ID 长整型类型(please use ASSIGN_ID)
UUID 32位UUID字符串(please use ASSIGN_UUID)
ID_WORKER_STR 分布式全局唯一ID 字符串类型(please use ASSIGN_ID)

6-3 基本配置

https://mp.baomidou.com/config/#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE

第7章 通用service

本章介绍通用service的内容。

7-1 通用service

定义service接口

package io.github.talelin.merak.service;

import com.baomidou.mybatisplus.extension.service.IService;
import io.github.talelin.merak.entity.MpDemoUser;

public interface MpDemoUserService extends IService<MpDemoUser> {
}

实现serviceImpl类

package io.github.talelin.merak.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.github.talelin.merak.entity.MpDemoUser;
import io.github.talelin.merak.mapper.MpDemoUserMapper;
import io.github.talelin.merak.service.MpDemoUserService;
import org.springframework.stereotype.Service;


/**
 * @author allen
 *
 * 通用service
 */
@Service
public class MpDemoUserServiceImpl extends ServiceImpl<MpDemoUserMapper, MpDemoUser> implements MpDemoUserService {

}

测试代码:

package io.github.talelin.merak.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import io.github.talelin.merak.entity.MpDemoUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

import java.util.List;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MpDemoUserServiceImplTest {

    @Resource
    private MpDemoUserServiceImpl service;


    @Test
    public void testService(){
        LambdaQueryWrapper<MpDemoUser> wrapper = Wrappers.lambdaQuery();
        MpDemoUser user = service.getOne(wrapper.like(MpDemoUser::getName, "雨"),false);
        System.out.println(user);
    }

    @Test
    public void testService2(){
        List<MpDemoUser> res = service.lambdaQuery().like(MpDemoUser::getName, "雨").list();
        System.out.println(res);
    }

}

通用service源码

/*
 * Copyright (c) 2011-2020, baomidou ([email protected]).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * <p>
 * https://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.baomidou.mybatisplus.extension.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 顶级 Service
 *
 * @author hubin
 * @since 2018-06-23
 */
public interface IService<T> {

    /**
     * 默认批次提交数量
     */
    int DEFAULT_BATCH_SIZE = 1000;

    /**
     * 插入一条记录(选择字段,策略插入)
     *
     * @param entity 实体对象
     */
    default boolean save(T entity) {
        return SqlHelper.retBool(getBaseMapper().insert(entity));
    }

    /**
     * 插入(批量)
     *
     * @param entityList 实体对象集合
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean saveBatch(Collection<T> entityList) {
        return saveBatch(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 插入(批量)
     *
     * @param entityList 实体对象集合
     * @param batchSize  插入批次数量
     */
    boolean saveBatch(Collection<T> entityList, int batchSize);

    /**
     * 批量修改插入
     *
     * @param entityList 实体对象集合
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean saveOrUpdateBatch(Collection<T> entityList) {
        return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 批量修改插入
     *
     * @param entityList 实体对象集合
     * @param batchSize  每次的数量
     */
    boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    default boolean removeById(Serializable id) {
        return SqlHelper.retBool(getBaseMapper().deleteById(id));
    }

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    default boolean removeByMap(Map<String, Object> columnMap) {
        Assert.notEmpty(columnMap, "error: columnMap must not be empty");
        return SqlHelper.retBool(getBaseMapper().deleteByMap(columnMap));
    }

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体包装类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default boolean remove(Wrapper<T> queryWrapper) {
        return SqlHelper.retBool(getBaseMapper().delete(queryWrapper));
    }

    /**
     * 删除(根据ID 批量删除)
     *
     * @param idList 主键ID列表
     */
    default boolean removeByIds(Collection<? extends Serializable> idList) {
        if (CollectionUtils.isEmpty(idList)) {
            return false;
        }
        return SqlHelper.retBool(getBaseMapper().deleteBatchIds(idList));
    }

    /**
     * 根据 ID 选择修改
     *
     * @param entity 实体对象
     */
    default boolean updateById(T entity) {
        return SqlHelper.retBool(getBaseMapper().updateById(entity));
    }

    /**
     * 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
     *
     * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    default boolean update(Wrapper<T> updateWrapper) {
        return update(null, updateWrapper);
    }

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象
     * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    default boolean update(T entity, Wrapper<T> updateWrapper) {
        return SqlHelper.retBool(getBaseMapper().update(entity, updateWrapper));
    }

    /**
     * 根据ID 批量更新
     *
     * @param entityList 实体对象集合
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean updateBatchById(Collection<T> entityList) {
        return updateBatchById(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 根据ID 批量更新
     *
     * @param entityList 实体对象集合
     * @param batchSize  更新批次数量
     */
    boolean updateBatchById(Collection<T> entityList, int batchSize);

    /**
     * TableId 注解存在更新记录,否插入一条记录
     *
     * @param entity 实体对象
     */
    boolean saveOrUpdate(T entity);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    default T getById(Serializable id) {
        return getBaseMapper().selectById(id);
    }

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表
     */
    default List<T> listByIds(Collection<? extends Serializable> idList) {
        return getBaseMapper().selectBatchIds(idList);
    }

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    default List<T> listByMap(Map<String, Object> columnMap) {
        return getBaseMapper().selectByMap(columnMap);
    }

    /**
     * 根据 Wrapper,查询一条记录 <br/>
     * <p>结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")</p>
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default T getOne(Wrapper<T> queryWrapper) {
        return getOne(queryWrapper, true);
    }

    /**
     * 根据 Wrapper,查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @param throwEx      有多个 result 是否抛出异常
     */
    T getOne(Wrapper<T> queryWrapper, boolean throwEx);

    /**
     * 根据 Wrapper,查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    Map<String, Object> getMap(Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper,查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @param mapper       转换函数
     */
    <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

    /**
     * 查询总记录数
     *
     * @see Wrappers#emptyWrapper()
     */
    default int count() {
        return count(Wrappers.emptyWrapper());
    }

    /**
     * 根据 Wrapper 条件,查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default int count(Wrapper<T> queryWrapper) {
        return SqlHelper.retCount(getBaseMapper().selectCount(queryWrapper));
    }

    /**
     * 查询列表
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default List<T> list(Wrapper<T> queryWrapper) {
        return getBaseMapper().selectList(queryWrapper);
    }

    /**
     * 查询所有
     *
     * @see Wrappers#emptyWrapper()
     */
    default List<T> list() {
        return list(Wrappers.emptyWrapper());
    }

    /**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
        return getBaseMapper().selectPage(page, queryWrapper);
    }

    /**
     * 无条件翻页查询
     *
     * @param page 翻页对象
     * @see Wrappers#emptyWrapper()
     */
    default <E extends IPage<T>> E page(E page) {
        return page(page, Wrappers.emptyWrapper());
    }

    /**
     * 查询列表
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper) {
        return getBaseMapper().selectMaps(queryWrapper);
    }

    /**
     * 查询所有列表
     *
     * @see Wrappers#emptyWrapper()
     */
    default List<Map<String, Object>> listMaps() {
        return listMaps(Wrappers.emptyWrapper());
    }

    /**
     * 查询全部记录
     */
    default List<Object> listObjs() {
        return listObjs(Function.identity());
    }

    /**
     * 查询全部记录
     *
     * @param mapper 转换函数
     */
    default <V> List<V> listObjs(Function<? super Object, V> mapper) {
        return listObjs(Wrappers.emptyWrapper(), mapper);
    }

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default List<Object> listObjs(Wrapper<T> queryWrapper) {
        return listObjs(queryWrapper, Function.identity());
    }

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     * @param mapper       转换函数
     */
    default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
        return getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
    }

    /**
     * 翻页查询
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper) {
        return getBaseMapper().selectMapsPage(page, queryWrapper);
    }

    /**
     * 无条件翻页查询
     *
     * @param page 翻页对象
     * @see Wrappers#emptyWrapper()
     */
    default <E extends IPage<Map<String, Object>>> E pageMaps(E page) {
        return pageMaps(page, Wrappers.emptyWrapper());
    }

    /**
     * 获取对应 entity 的 BaseMapper
     *
     * @return BaseMapper
     */
    BaseMapper<T> getBaseMapper();

    /**
     * 以下的方法使用介绍:
     *
     * 一. 名称介绍
     * 1. 方法名带有 query 的为对数据的查询操作, 方法名带有 update 的为对数据的修改操作
     * 2. 方法名带有 lambda 的为内部方法入参 column 支持函数式的
     *
     * 二. 支持介绍
     * 1. 方法名带有 query 的支持以 {@link ChainQuery} 内部的方法名结尾进行数据查询操作
     * 2. 方法名带有 update 的支持以 {@link ChainUpdate} 内部的方法名为结尾进行数据修改操作
     *
     * 三. 使用示例,只用不带 lambda 的方法各展示一个例子,其他类推
     * 1. 根据条件获取一条数据: `query().eq("column", value).one()`
     * 2. 根据条件删除一条数据: `update().eq("column", value).remove()`
     *
     */

    /**
     * 链式查询 普通
     *
     * @return QueryWrapper 的包装类
     */
    default QueryChainWrapper<T> query() {
        return ChainWrappers.queryChain(getBaseMapper());
    }

    /**
     * 链式查询 lambda 式
     * <p>注意:不支持 Kotlin </p>
     *
     * @return LambdaQueryWrapper 的包装类
     */
    default LambdaQueryChainWrapper<T> lambdaQuery() {
        return ChainWrappers.lambdaQueryChain(getBaseMapper());
    }

    /**
     * 链式更改 普通
     *
     * @return UpdateWrapper 的包装类
     */
    default UpdateChainWrapper<T> update() {
        return ChainWrappers.updateChain(getBaseMapper());
    }

    /**
     * 链式更改 lambda 式
     * <p>注意:不支持 Kotlin </p>
     *
     * @return LambdaUpdateWrapper 的包装类
     */
    default LambdaUpdateChainWrapper<T> lambdaUpdate() {
        return ChainWrappers.lambdaUpdateChain(getBaseMapper());
    }

    /**
     * <p>
     * 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
     * 此次修改主要是减少了此项业务代码的代码量(存在性验证之后的saveOrUpdate操作)
     * </p>
     *
     * @param entity 实体对象
     */
    default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
        return update(entity, updateWrapper) || saveOrUpdate(entity);
    }
}

发布了13 篇原创文章 · 获赞 0 · 访问量 46

猜你喜欢

转载自blog.csdn.net/lose_alan/article/details/105043422