• Java--MybatisPlus Wrapper构造器;分页;MP代码生成器(四)


    阅读前可先参考

    https://blog.csdn.net/MinggeQingchun/article/details/126521908

    https://blog.csdn.net/MinggeQingchun/article/details/126533536

    https://blog.csdn.net/MinggeQingchun/article/details/126539292

    一、Wrapper构造器

    条件构造器 | MyBatis-Plus

    条件构造器 Wrapper 就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:

    QueryWrapper:用来删改查

    UpdateWrapper:在修改操作时不必创建实体类对象的操作

    LambdaQueryWrapper LambdaUpdateWrapper 则是在字段参数的调用上进行了升级,其他都一样。因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的

    AbstractWrapper: 

    QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
    用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件

    函数名(条件)说明
    allEq基于map的相等
    eq等于=
    ne不等于>
    gt大于>
    ge大于等于>=
    lt小于<
    le小于等于<=
    betweenBETWEEN 值1AND值⒉
    notBetweenNOT BETWEEN 值1AND值2
    likeLIKE '%值%'
    notlikeNOT LIKE'%值%'
    likeLeftLIKE '%值'
    likeRightLIKE '值%'
    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,4,5,6)

    例: insql(" id" , "select id from table where id <3")--sidin (select id from table where id <3)

    notInSql字段NOT IN ( sql语句)
    groupByGROUP BY字段
    orderByAsc升序ORDER BY字段,...ASC
    orderByDesc降序ORDER BY字段,... DESC
    orderBy

    自定义字段排序

    having条件分组
    orOR语句,拼接+OR字段=值
    andAND语句,拼接+AND字段=值
    apply拼接sql
    last在sql语句后拼接自定义条件
    exists拼接EXISTS ( sql语句)
    notExists拼接NOT EXISTS ( sql语句)
    nested正常嵌套不带AND或者OR

    1、allEq;基于map的相等

    1. @Test
    2. public void testAllEq() {
    3. QueryWrapper qw = new QueryWrapper<>();
    4. //组装条件
    5. Map param = new HashMap<>();
    6. //map key列名 , value:查询的值
    7. param.put("name", "张三");
    8. param.put("age", 22);
    9. param.put("status", null);
    10. qw.allEq(param);
    11. //调用MP自己的查询方法
    12. //SELECT id,name,age,email,status FROM student WHERE name = ? AND age = ?
    13. List students = studentMapper.selectList(qw);
    14. students.forEach(stu -> System.out.println(stu));
    15. }
    16. /**
    17. * 1、Map对象中有 key的value是null
    18. * 使用的是 qw.allEq(param,true);
    19. * 结果:WHERE name = ? AND age IS NULL
    20. *
    21. * 2、Map对象中有 key的value是null
    22. * qw.allEq(param,false);
    23. * 结果:WHERE name = ?
    24. *
    25. * 总结:
    26. * allEq(map,boolean)
    27. * true:处理null值,where 条件加入 字段 is null
    28. * false:忽略null ,不作为where 条件
    29. */
    30. @Test
    31. public void testAllEq1() {
    32. QueryWrapper qw = new QueryWrapper<>();
    33. //组装条件
    34. Map param = new HashMap<>();
    35. //map key列名 , value:查询的值
    36. param.put("name", "张三");
    37. param.put("age", 22);
    38. param.put("status", null);
    39. qw.allEq(param,false);
    40. //调用MP自己的查询方法
    41. //SELECT id,name,age,email,status FROM student WHERE name = ? AND age = ?
    42. List students = studentMapper.selectList(qw);
    43. students.forEach(stu -> System.out.println(stu));
    44. }

    2、eq;等于=

    1. /**
    2. * eq 等于=
    3. * eq("列名",值)
    4. */
    5. @Test
    6. public void testEq() {
    7. QueryWrapper qw = new QueryWrapper<>();
    8. //组成条件
    9. qw.eq("name", "李四");
    10. //WHERE name = ?
    11. List students = studentMapper.selectList(qw);
    12. students.forEach(stu -> System.out.println("查询eq:" + stu));
    13. }

    3、ne;不等于 <>

    1. /**
    2. * ne 不等于 <>
    3. * ne("列名",值)
    4. */
    5. @Test
    6. public void testNe() {
    7. QueryWrapper qw = new QueryWrapper<>();
    8. //组成条件
    9. qw.ne("name", "张三");
    10. // WHERE name <> ?
    11. List students = studentMapper.selectList(qw);
    12. students.forEach(stu -> System.out.println("查询ne:" + stu));
    13. }

    4、gt;大于 >

    1. /**
    2. * gt 大于( > )
    3. */
    4. @Test
    5. public void testGt() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.gt("age", 30); //age > 30
    8. // WHERE age > ?
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(stu -> System.out.println("stu:" + stu));
    11. }

    5、ge;大于等于 >=

    1. /**
    2. * ge 大于等于 ( >=)
    3. */
    4. @Test
    5. public void testGe() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.ge("age", 31);// >=31
    8. //WHERE age >= ?
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(stu -> System.out.println("student:" + stu));
    11. }

    6、lt;小于

    1. /**
    2. * lt 小于 <
    3. */
    4. @Test
    5. public void testLt() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.lt("age", 32);
    8. // WHERE age < ?
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(stu -> System.out.println("student:" + stu));
    11. }

    7、le 小于等于 <=

    1. /**
    2. * le 小于等于 <=
    3. */
    4. @Test
    5. public void testLe() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.le("age", 32);
    8. // WHERE age <= ?
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(stu -> System.out.println("student:" + stu));
    11. }

    8、between ( ? and ? )

    1. /**
    2. * between ( ? and ? )
    3. */
    4. @Test
    5. public void testBetween() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. //between("列名",开始值,结束值)
    8. qw.between("age", 22, 28);
    9. // where age >= 12 and age < 28
    10. List students = studentMapper.selectList(qw);
    11. students.forEach(stu -> System.out.println(stu));
    12. }

    9、notBetween(不在范围区间内)

    1. /**
    2. * notBetween(不在范围区间内)
    3. */
    4. @Test
    5. public void testNotBetween() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.notBetween("age", 18, 28);
    8. //WHERE age NOT BETWEEN ? AND ?
    9. // where age < 18 or age > 28
    10. List students = studentMapper.selectList(qw);
    11. students.forEach(stu -> System.out.println(stu));
    12. }

    10、like 匹配某个值

    1. /**
    2. * like 匹配某个值
    3. */
    4. @Test
    5. public void testLike() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.like("name", "张");
    8. // WHERE name LIKE %张%
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(stu -> System.out.println(stu));
    11. }

    11、notLike 不匹配某个值

    1. /**
    2. * notLike 不匹配某个值
    3. */
    4. @Test
    5. public void testNotLike() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.notLike("name", "张");
    8. // WHERE name NOT LIKE ? %张%
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(stu -> System.out.println(stu));
    11. }

    12、likeLeft "%值"

    1. /**
    2. * likeLeft "%值"
    3. */
    4. @Test
    5. public void testLikeLeft() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.likeLeft("name", "张");
    8. //WHERE name LIKE %张
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(student -> System.out.println(student));
    11. }

    13、likeRight "%值"

    1. /**
    2. * likeRight "%值"
    3. */
    4. @Test
    5. public void testLikeRight() {
    6. QueryWrapper qw = new QueryWrapper<>();
    7. qw.likeRight("name", "李");
    8. //WHERE name LIKE 李%
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(student -> System.out.println(student));
    11. }

    14、isNull , 判断字段是 null

    1. /**
    2. * isNull , 判断字段是 null
    3. */
    4. @Test
    5. public void testIsNull(){
    6. QueryWrapper qw = new QueryWrapper<>();
    7. //判断email is null
    8. //WHERE email IS NULL
    9. qw.isNull("email");
    10. List students = studentMapper.selectList(qw);
    11. students.forEach(student -> System.out.println(student));
    12. }

    15、isNotNull , 判断字段是 is not null

    1. /**
    2. * isNotNull , 判断字段是 is not null
    3. */
    4. @Test
    5. public void testIsNotNull(){
    6. QueryWrapper qw = new QueryWrapper<>();
    7. // WHERE email IS NOT NULL
    8. qw.isNotNull("email");
    9. List students = studentMapper.selectList(qw);
    10. students.forEach(student -> System.out.println(student));
    11. }

    16、in 值列表

    1. /**
    2. * in 值列表
    3. */
    4. @Test
    5. public void testIn(){
    6. QueryWrapper qw = new QueryWrapper<>();
    7. //in(列名,多个值的列表)
    8. //WHERE name IN (?,?,?)
    9. qw.in("name","张三","李四","周丽");
    10. List students = studentMapper.selectList(qw);
    11. students.forEach(student -> System.out.println(student));
    12. }
    13. /**
    14. * in 值列表
    15. */
    16. @Test
    17. public void testIn2(){
    18. QueryWrapper qw = new QueryWrapper<>();
    19. List list = new ArrayList<>();
    20. list.add(1);
    21. list.add(2);
    22. //WHERE status IN (?,?)
    23. qw.in("status",list);
    24. List students = studentMapper.selectList(qw);
    25. students.forEach(student -> System.out.println(student));
    26. }
    27. 17、notIn 不在值列表

      1. /**
      2. * notIn 不在值列表
      3. */
      4. @Test
      5. public void testNoIn(){
      6. QueryWrapper qw = new QueryWrapper<>();
      7. //in(列名,多个值的列表)
      8. //WHERE name NOT IN (?,?,?)
      9. qw.notIn("name","张三","李四","周丽");
      10. List students = studentMapper.selectList(qw);
      11. students.forEach(student -> System.out.println(student));
      12. }

      18、inSql() : 使用子查询

      1. /**
      2. * inSql() : 使用子查询
      3. */
      4. @Test
      5. public void testInSQL(){
      6. QueryWrapper qw = new QueryWrapper<>();
      7. //WHERE age IN (select age from student where id=1)
      8. qw.inSql("age","select age from student where id=1");
      9. List students = studentMapper.selectList(qw);
      10. students.forEach(student -> System.out.println(student));
      11. }

      19、notInSql() : 使用子查询

      1. /**
      2. * notInSql() : 使用子查询
      3. */
      4. @Test
      5. public void testNotInSQL(){
      6. QueryWrapper qw = new QueryWrapper<>();
      7. //WHERE age NOT IN (select age from student where id=1)
      8. qw.notInSql("age","select age from student where id=1");
      9. List students = studentMapper.selectList(qw);
      10. students.forEach(student -> System.out.println(student));
      11. }

      20、groupBy:分组

      1. /**
      2. * groupBy:分组
      3. */
      4. @Test
      5. public void testGroupby(){
      6. QueryWrapper qw = new QueryWrapper<>();
      7. qw.select("name,count(*) personNumbers");//select name,count(*) personNumbers
      8. qw.groupBy("name");
      9. // SELECT name,count(*) personNumbers FROM student GROUP BY name
      10. List students = studentMapper.selectList(qw);
      11. students.forEach(student -> System.out.println(student));
      12. }

      21、orderbyAsc : 按字段升序

      1. /**
      2. * orderbyAsc : 按字段升序
      3. */
      4. @Test
      5. public void testOrderByAsc(){
      6. QueryWrapper qw= new QueryWrapper<>();
      7. //FROM student ORDER BY name ASC , age ASC
      8. qw.orderByAsc("name","age");
      9. List students = studentMapper.selectList(qw);
      10. students.forEach(student -> System.out.println(student));
      11. }

      22、orderbyDesc : 按字段降序

      1. /**
      2. * orderbyDesc : 按字段降序
      3. */
      4. @Test
      5. public void testOrderByDesc(){
      6. QueryWrapper qw= new QueryWrapper<>();
      7. // ORDER BY name DESC , id DESC
      8. qw.orderByDesc("name","id");
      9. List students = studentMapper.selectList(qw);
      10. students.forEach(student -> System.out.println(student));
      11. }

      23、order :指定字段和排序方向

      1. /**
      2. * order :指定字段和排序方向
      3. *
      4. * boolean condition : 条件内容是否加入到 sql语句的后面。
      5. * true:条件加入到sql语句
      6. * FROM student ORDER BY name ASC
      7. *
      8. * false:条件不加入到sql语句
      9. * FROM student
      10. */
      11. @Test
      12. public void testOrder(){
      13. QueryWrapper qw = new QueryWrapper<>();
      14. qw.orderBy(true,true,"name")
      15. .orderBy(true,false,"age")
      16. .orderBy(true,false,"email");
      17. // name asc, age desc , email desc
      18. //FROM student ORDER BY name ASC , age DESC , email DESC
      19. List students = studentMapper.selectList(qw);
      20. students.forEach(student -> System.out.println(student));
      21. }

      24、and ,or

      1. /**
      2. * and ,or方法
      3. */
      4. @Test
      5. public void testOr(){
      6. QueryWrapper qw= new QueryWrapper<>();
      7. //WHERE name = ? OR age = ?
      8. qw.eq("name","张三")
      9. .or()
      10. .eq("age",22);
      11. List students = studentMapper.selectList(qw);
      12. students.forEach(student -> System.out.println(student));
      13. }

      25、last : 拼接sql语句到MP的sql语句的最后

      1. /**
      2. * last : 拼接sql语句到MP的sql语句的最后
      3. */
      4. @Test
      5. public void testLast(){
      6. QueryWrapper qw = new QueryWrapper<>();
      7. //SELECT id,name,age,email,status FROM student WHERE name = ? OR age = ? limit 1
      8. qw.eq("name","张三")
      9. .or()
      10. .eq("age",22)
      11. .last("limit 1");
      12. List students = studentMapper.selectList(qw);
      13. students.forEach(student -> System.out.println(student));
      14. }

      26、exists : 判断条件

      1. /**
      2. * exists : 判断条件
      3. *
      4. * notExists
      5. */
      6. @Test
      7. public void testExists(){
      8. QueryWrapper qw= new QueryWrapper<>();
      9. //SELECT id,name,age,email,status FROM student
      10. // WHERE EXISTS (select id from student where age > 20)
      11. //qw.exists("select id from student where age > 90");
      12. //SELECT id,name,age,email,status FROM student WHERE
      13. // NOT EXISTS (select id from student where age > 90)
      14. qw.notExists("select id from student where age > 90");
      15. List students = studentMapper.selectList(qw);
      16. students.forEach(student -> System.out.println(student));
      17. }

      二、分页

      分页插件 | MyBatis-Plus

      1、配置分页,实现物理分页(默认内存分页)

      1. /**
      2. * @Configuration: 标注的类就相当于xml配置文件
      3. */
      4. @Configuration
      5. public class Config {
      6. /***
      7. * 定义方法,返回的返回值是java 对象,这个对象是放入到spring容器中
      8. * 使用@Bean修饰方法
      9. * @Bean 等同于
      10. */
      11. @Bean
      12. public PaginationInnerInterceptor paginationInnerInterceptor(){
      13. return new PaginationInnerInterceptor();
      14. }
      15. }

      2、 测试

      1. /**
      2. * 分页:
      3. * 1.统计记录数,使用count(1)
      4. * SELECT COUNT(1) FROM student WHERE age > ?
      5. * 2.实现分页,在sql语句的末尾加入 limit 0,3
      6. * SELECT id,name,age,email,status FROM student WHERE age > ? LIMIT 0,3
      7. */
      8. @Test
      9. public void testPage(){
      10. QueryWrapper qw = new QueryWrapper<>();
      11. qw.gt("age",22);
      12. IPage page = new Page<>();
      13. //设置分页的数据
      14. page.setCurrent(1);//第一页
      15. page.setSize(3);// 每页的记录数
      16. IPage result = studentMapper.selectPage(page,qw);
      17. //获取分页后的记录
      18. List students = result.getRecords();
      19. System.out.println("students.size()="+students.size());
      20. //分页的信息
      21. long pages = result.getPages();
      22. System.out.println("页数:"+pages);
      23. System.out.println("总记录数:"+result.getTotal());
      24. System.out.println("当前页码:"+result.getCurrent());
      25. System.out.println("每页的记录数:"+result.getSize());
      26. }

      三、MP代码生成器

      代码生成器(旧) | MyBatis-Plus

      代码生成器(新) | MyBatis-Plus

      AutoGenerator MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率 

      1、添加依赖

      1. <dependency>
      2. <groupId>org.apache.velocitygroupId>
      3. <artifactId>velocity-engine-coreartifactId>
      4. <version>2.0version>
      5. dependency>
      6. <dependency>
      7. <groupId>com.baomidougroupId>
      8. <artifactId>mybatis-plus-generatorartifactId>
      9. <version>3.3.0version>
      10. dependency>

      2、自动生成类

      1. import com.baomidou.mybatisplus.annotation.IdType;
      2. import com.baomidou.mybatisplus.generator.AutoGenerator;
      3. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
      4. import com.baomidou.mybatisplus.generator.config.GlobalConfig;
      5. import com.baomidou.mybatisplus.generator.config.PackageConfig;
      6. import com.baomidou.mybatisplus.generator.config.StrategyConfig;
      7. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
      8. public class AutoMapper {
      9. public static void main(String[] args) {
      10. //创建AutoGenerator ,MP中对象
      11. AutoGenerator ag = new AutoGenerator();
      12. /**-------- 设置全局配置 --------*/
      13. GlobalConfig gc = new GlobalConfig();
      14. //设置代码的生成位置, 磁盘的目录
      15. String path = System.getProperty("user.dir");
      16. gc.setOutputDir(path+"/src/main/java");
      17. //设置生成的类的名称(命名规则)
      18. gc.setMapperName("%sMapper");//所有的Dao类都是Mapper结尾的,例如DeptMapper
      19. //设置Service接口的命名
      20. gc.setServiceName("%sService");//DeptService
      21. //设置Service实现类的名称
      22. gc.setServiceImplName("%sServiceImpl");//DeptServiceImpl
      23. //设置Controller类的命名
      24. gc.setControllerName("%sController");//DeptController
      25. //设置作者
      26. gc.setAuthor("ming");
      27. //设置主键id的配置
      28. gc.setIdType(IdType.ASSIGN_ID);
      29. ag.setGlobalConfig(gc);
      30. /**-------- 设置数据源DataSource --------*/
      31. DataSourceConfig ds = new DataSourceConfig();
      32. //驱动
      33. ds.setDriverName("com.mysql.cj.jdbc.Driver");
      34. //设置url
      35. ds.setUrl("jdbc:mysql://localhost:3306/mybatisplusdb");
      36. //设置数据库的用户名
      37. ds.setUsername("root");
      38. //设置密码
      39. ds.setPassword("admin123456");
      40. //把DataSourceConfig赋值给AutoGenerator
      41. ag.setDataSource(ds);
      42. /**-------- 设置Package信息 --------*/
      43. PackageConfig pc = new PackageConfig();
      44. //设置模块名称, 相当于包名, 在这个包的下面有 mapper, service, controller。
      45. pc.setModuleName("user");
      46. //设置父包名,order就在父包的下面生成
      47. pc.setParent("com.company"); //com.company.user
      48. ag.setPackageInfo(pc);
      49. /**-------- 设置策略 --------*/
      50. StrategyConfig sc = new StrategyConfig();
      51. sc.setNaming(NamingStrategy.underline_to_camel);
      52. //设置支持驼峰的命名规则
      53. sc.setColumnNaming(NamingStrategy.underline_to_camel);
      54. ag.setStrategy(sc);
      55. //执行代码的生成
      56. ag.execute();
      57. }
      58. }

      可能会报错

      mp 报错‘AutoGenerator ()‘ has private access in ‘com.baomidou.mybatisplus.generator.AutoGenerator‘

      我用的 mybatis-plus-generator 依赖 是 3.5.0,我用的 mybatis-Plus 依赖版本是 3.5.1, 在网上查了下,应该就是版本问题,后来我把 mybatis-plus-generator 依赖 换成 3.3.0 即可

      生成完成,且会自动打开生成文件所在文件夹

    28. 相关阅读:
      OpenJDK提案将提供Java类文件API
      Centos7完全离线环境安装Nvidia Tesla A100 40G显卡驱动(含CUDA Toolkit)和Anaconda3虚拟环境
      代码审计基础php_bugs
      使用nginx方向代理部署Vue项目刷新页面404的问题解决
      欧几里得算法证明,最小公倍数求法证明
      【缓存分类以及常见的缓存淘汰策略】
      E117-经典赛题-主机发现与信息收集
      容器运行时 笔记 / CRI-O / CRI-O 安装说明
      Day51|动态规划part12:309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
      webGL编程指南 第五章 MultiAttributeSize
    29. 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126541574