天天看点

mybatis-plus-查询和分页1.查询构造器:wapper2.查询3.分页

mybatis-plus-查询和分页

  • 1.查询构造器:wapper
  • 2.查询
    • 2.1初始化表MyStudent
    • 2.2进行查询
  • 3.分页

1.查询构造器:wapper

mybatis-plus-查询和分页1.查询构造器:wapper2.查询3.分页

QueryWrapper(LambdaQueryWrapper)和UpdateWrapper(LambdaUpdateWrapper)的父类用于生成sql的where条件,entity属性也用于生成sql的where条件。MP3.X开始支持lambda表达式,LambdaQueryWrapper,LambdaUpdateWrapper支持lambda表达式的构造条件查询。

  • 条件:
条件 说明
allEq 基于map的相等
eq 等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于 <
le 小于等于<=
between BETWEEN 值1 AND 值2
notBetween NOT BETWEEN 值1 AND 值2
like LIKE ‘%值%’
notLike NOT LIKE ‘%值%’
likeLeft LIKE ‘%值’
likeRight LIKE ‘值%’
isNull 字段 IS NULL
isNotNull 字段 IS NOT NULL
in 字段 IN(value1,value2,…)
notIn 字段 NOT IN(value1,value2,…)
inSql 字段 IN(sql语句) 例:InSql(“age”,“1,2,3”) --> age in(1,2,3) 例:inSql(“id”,“select id from table where id<3”) --> id in (select id from table where id<3)
notInSql 字段 NOT IN (sql语句)
groupBy GROUP BY 字段
orderByAsc 升序 ORDER BY 字段,…ASC
orderByDesc 降序 ORDER BY 字段,…DESC
orderBy 自定义字段排序 orderBy(true,true,“id”,“name”) --> order by id ASC,name ASC
having 条件分组
or OR语句,拼接 +OR 字段=值
and AND语句,拼接 +AND 字段加值
apply 拼接sql
last 在sql语句后拼接自定义条件
exists 拼接EXISTS(sql语句)例:exists(“select id from table where age = 1”) --> exists(select id from table where age = 1)
notExists 拼接 NOT EXISTS(sql语句)
nested 正常嵌套 不带AND或者OR
  • 1)QueryWrapper:查询条件封装类
方法 说明
select 设置查询字段select后面的内容
  • 2)UpdateWrapper:更新条件封装类
方法 说明
set 设置要更新的字段,MP拼接sql语句
setSql 参数是sql语句,MP不再处理语句

2.查询

2.1初始化表MyStudent

mybatis-plus-查询和分页1.查询构造器:wapper2.查询3.分页

2.2进行查询

  • 1)allEq

    以Map为参数条件

@Test
    public void testAllEq(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //组装条件
        Map<String,Object> param = new HashMap<>();
        //map<key,value> key列名,value:查询的值
        param.put("name","张三");
        param.put("age","22");
        param.put("status",1);

        qw.allEq(param);
        //调用MP自己的查询方法
        //SELECT id,name,age,email,status FROM my_student WHERE name = ? AND age = ?
        //WHERE name = ? AND age = ? AND status = ?
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println(item));
    }
           

1.Map对象中有key的value是null

使用的是qw.allEq(param,true);

结果:WHERE name = ? AND age IS NULL

2.Map对象中有key的value是null

qw.allEq(param,false);

结果:WHERE name = ?

结论:

allEq(map,boolean)

true:处理null值,where条件加入字段is null

false:忽略null,不作为where条件

@Test
   public void testAllEq2(){
       QueryWrapper<MyStudent> qw = new QueryWrapper<>();
       //组装条件
       Map<String,Object> param = new HashMap<>();
       //map<key,value> key列名,value:查询的值
       param.put("name","张三");
       //age是null
       param.put("age",null);

       //allEq第二个参数为true
       qw.allEq(param,false);
       //调用MP自己的查询方法
       List<MyStudent> myStudents = myStudentsDao.selectList(qw);
       myStudents.forEach(item-> System.out.println(item));
   }
           
  • 2)eq
/**
     * eq使用
     * eq("列名",值)
     */
    @Test
    public void testEq(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //组成条件
        qw.eq("name","李四");
        //WHERE name = ?
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println("查询eq:"+item));
    }
           
  • 3)ne
/**
    * ne使用
    * ne表示不等于<>
    * ne("列名",值)
    */
   @Test
   public void testNe(){
       QueryWrapper<MyStudent> qw = new QueryWrapper<>();
       //组成条件
       qw.ne("name","张三");
       //WHERE name <> ?
       List<MyStudent> myStudents = myStudentsDao.selectList(qw);
       myStudents.forEach(item-> System.out.println("查询ne:"+item));
   }
           
  • 4)gt
/**
     * gt使用
     * gt表示大于(>)
     */
    @Test
    public void testGt(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.gt("age",30);//age>30
        //WHERE age > ?
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println("stu:"+item));
    }
           
  • 5)ge
/**
     * ge 大于等于 (>=)
     */
    @Test
    public void testGe(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.ge("age",31);//>=31
        //WHERE age >= ?
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println("stu:"+item));
    }
           
  • 6)lt
/**
     * lt 小于 (<)
     */
    @Test
    public void testLt(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.lt("age",32);//age<32
        //WHERE age < ?
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println("stu:"+item));
    }
           
  • 7)le
/**
     * le 小于等于 (<=)
     */
    @Test
    public void testLe(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.le("age",32);//age<=32
        //WHERE age <= ?
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println("stu:"+item));
    }
           
  • 8)between
/**
     * between (? and ?)
     */
    @Test
    public void testBetween(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //between("列名",开始值,结束值)
        qw.between("age",22,28);
        //WHERE age BETWEEN ? AND ?
        //WHERE age >= 22 and age <= 28
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println("stu:"+item));
    }
           
  • 9)notBetween
/**
     * notBetween(不在范围区间内)
     */
    @Test
    public void tsetNotBetween(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.notBetween("age",18,28);
        //WHERE age NOT BETWEEN ? AND ?
        //where age < 18 or age >28
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println(item));
    }
           
  • 10)like
/**
     * like 匹配某个值
     */
    @Test
    public void testLike(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.like("name","张");
        //WHERE name LIKE %张%
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println(item));
    }
           
  • 11)notLike
/**
     * notLike 不匹配某个值
     */
    @Test
    public void testNotLike(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.notLike("name","张");
        //WHERE name NOT LIKE %张%
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println(item));
    }
           
  • 12)likeLeft
/**
     * likeLeft "%值"
     */
    @Test
    public void testLikeLeft(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.likeLeft("name","张");
        //WHERE name LIKE %张
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println(item));
    }
           
  • 13)likeRight
/**
     * likeRight "%值"
     */
    @Test
    public void testLikeRight(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.likeRight("name","李");
        //WHERE name LIKE 李%
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(item-> System.out.println(item));
    }
           
  • 14)isNull
/**
     * isNull,判断换字段是null
     */
    @Test
    public void testIsNull(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //判断email is null
        //WHERE email IS NULL
        qw.isNull("email");
        print(qw);
    }
           
  • 15)isNotNull
/**
     * isNotNull,判断换字段不是null
     */
    @Test
    public void testIsNotNull(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //判断email is not null
        //WHERE email IS NOT NULL
        qw.isNotNull("email");
        print(qw);
    }
           
  • 16)in
/**
     *in 值列表
     */
    @Test
    public void testIn(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //in(列名,多个值的列表)
        //WHERE name IN (?,?,?)
        qw.in("name","张三","李四","周丽");
        print(qw);
    }
    /**
     *in 值列表
     */
    @Test
    public void testIn2(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        List<Object> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        //WHERE status IN (?,?)
        qw.in("status",list);
        print(qw);
    }
           
  • 17notIn
/**
     *notIn 值列表
     */
    @Test
    public void testNotIn(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //notIn(列名,多个值的列表)
        //WHERE name NOT IN (?,?,?)
        qw.notIn("name","张三","李四","周丽");
        print(qw);
    }
           
  • 18)inSql
/**
     *inSql():使用子查询
     */
    @Test
    public void testInSql(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //WHERE age IN (select age from my_student where id=1)
        qw.inSql("age","select age from my_student where id=1");
        print(qw);
    }
           
  • 19)notInSql
/**
     *notInSql():使用子查询
     */
    @Test
    public void testNotInSql(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //WHERE age NOT IN (select age from my_student where id=1)
        qw.notInSql("age","select age from my_student where id=1");
        print(qw);
    }

    private void print(QueryWrapper qw){
        List<MyStudent> myStudents = myStudentsDao.selectList(qw);
        myStudents.forEach(System.out::println);
    }
           
  • 20)groupBy
/**
     * groupBy:分组
     */
    @Test
    public void testGroupBy(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.select("name,count(*) personNumbers");//select name count(*) personNumbers
        qw.groupBy("name");
        //SELECT name,count(*) personNumbers FROM my_student GROUP BY name
        print(qw);
    }
           
  • 21)orderByAsc
/**
     * orderByAsc:按升序排序
     */
    @Test
    public void testOrderByAsc(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.orderByAsc("name","age");
        //FROM my_student ORDER BY name ASC , age ASC
        print(qw);
    }
           
  • 22)orderByDesc
/**
     * orderByDesc:按降序排序
     */
    @Test
    public void testOrderByDesc(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.orderByDesc("name","id");
        //FROM my_student ORDER BY name DESC , id DESC
        print(qw);
    }
           
  • 23)orderBy

    orderBy:指定字段和排序的方向

    boolean condition:条件内容是否加入到sql语句的后面。

    true:条件添加到sql语句

    FROM my_student ORDER BY name ASC

    false:条件不添加到sql语句

    FROM my_student

@Test
    public void testOrderBy(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.orderBy(true,true,"name")
                .orderBy(true,false,"age")
                .orderBy(true,false,"email");
        //name asc,age desc,email desc
        //FROM my_student ORDER BY name ASC , age DESC , email DESC
        print(qw);
    }
           
  • 24)and,or
/**
     * and,or方法
     */
    @Test
    public void testOr(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //WHERE name = ? OR age = ?
        qw.eq("name","张三")
                .or()
                .eq("age",22);
        print(qw);
    }
           
  • 25)last
/**
     * last:拼接sql语句到MP的sql语句的最后
     */
    @Test
    public void testLast(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //SELECT id,name,age,email,status FROM my_student WHERE name = ? OR age = ? limit 1
        qw.eq("name","张三")
                .or()
                .eq("age",22)
                .last("limit 1");
        print(qw);
    }
           
  • 26)exists
/**
     * exists:判断条件
     *
     * notExists
     */
    @Test
    public void testExists(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        //SELECT id,name,age,email,status FROM my_student
        // WHERE EXISTS (select id from my_student where age > 20)
        qw.exists("select id from my_student where age > 20");

        //SELECT id,name,age,email,status FROM my_student
        //WHERE NOT EXISTS (select id from my_student where age > 90)
        qw.notExists("select id from my_student where age > 90");
        print(qw);
    }
           

3.分页

  • 前提:配置分页插件,实现物理分页。默认是内存分页
package com.putao.plus.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration标注是类就相当于xml配置文件
 */
@Configuration
public class Config {
    /**
     * 定义方法,返回值是java对象,这个对象放入到spring容器中
     * 使用@Bean修饰方法
     * @Bean等同于<bean></bean>
     */
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}
           
  • 分页查询

    分页:

    1.统计记录数,使用count(1)

    SELECT COUNT(1) FROM my_student WHERE age > ?

    2.实现分页,在sql语句末尾加入limit0,3

    SELECT id,name,age,email,status FROM my_student WHERE age > ? LIMIT 0,3

@Test
    public void testPage(){
        QueryWrapper<MyStudent> qw = new QueryWrapper<>();
        qw.gt("age",22);
        IPage<MyStudent> page = new Page<>();
        //设置分页的数据
        page.setCurrent(1);//第一页
        page.setSize(3);//每页的记录数
        IPage<MyStudent> result = myStudentsDao.selectPage(page, qw);
        //获取分页后的记录
        List<MyStudent> myStudents = result.getRecords();
        System.out.println("myStudents.size:"+myStudents.size());
        //分页的信息
        long pages = result.getPages();
        System.out.println("页数:"+pages);
        System.out.println("总记录"+result.getTotal());
        System.out.println("当前页码:"+result.getCurrent());
        System.out.println("每页的记录"+result.getSize());
    }
           

继续阅读