当前位置:   article > 正文

2022/5/30 Mybatis-Plus详解_mybatisplus 实体字段默认值

mybatisplus 实体字段默认值

目录

1.Mybatis-Plus简介

2.特性 

3.支持数据库

4.框架结构

5.快速开始 

        5.1 创建数据库mybatis_plus

        5.2 搭建项目

                5.2.1 创建Spring Boot工程

                5.2.2 导入依赖

                5.2.3 配置yml 

                5.2.4 entity实体类

                5.2.5 mapper 

                5.2.6 service 

                5.2.7  service实现类

6.使用Mybatis-Plus简化CURD 

        6.1编写测试类

        6.1 增加

        6.2 删除

        6.3 修改

        6.4 查询

                6.4.1模糊查询 

                6.4.2  区间查询

7. 自定义ID生成器

8. 自动填充  

         8.1 数据库新增两个字段(create_time,update_time)

         8.2 实体类新增两个字段(createTime,updateTime)

         8.3 编写Mybatis-Plus自动填充配置类

         8.4 结果

 9.乐观锁

        9.1 数据库新增字段(version)

        9.2  实体类新增字段(version)

        9.3 编写MyBatisPlus的配置类

        9.4 测试 

10.逻辑删除 

        10.1 数据库新增字段(deleted)

        10.2 实体类新增字段(deleted)

        10.3 yml配置 

        10.4 测试 

11. 代码生成器

12.高级条件查询(条件构造器)

        12.1 条件构造器关系介绍

        12.2 介绍 

        12.3 wapper介绍

        12.3 API

        12.4 示例

13.分页插件 

        13.1 编写MyBatisPlus的配置类

        13.2 Page<>对象API

        13.3 示例


写在前面:

  • 下面文章大部分是手敲和官网复制
  • 不喜勿喷

1.Mybatis-Plus简介

官网:MyBatis-Plus

代码托管:Gitee | Github

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

愿景:

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

2.特性 

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

3.支持数据库

任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb

  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库

4.框架结构

5.快速开始 

        5.1 创建数据库mybatis_plus

现有一张 User 表,其表结构如下:

idnameageemail
1Jone18test1@baomidou.com
2Jack20test2@baomidou.com
3Tom28test3@baomidou.com
4Sandy21test4@baomidou.com
5Billie24test5@baomidou.com

其对应的数据库 Schema 脚本如下: 

  1. DROP TABLE IF EXISTS user;
  2. CREATE TABLE user
  3. (
  4. id BIGINT(20) NOT NULL COMMENT '主键ID',
  5. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
  6. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
  7. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
  8. PRIMARY KEY (id)
  9. );
  10. -- 真实开发中,version(乐观锁),deleted(逻辑删除)、gmt_create、gem_mo

        5.2 搭建项目

                5.2.1 创建Spring Boot工程

                5.2.2 导入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-jdbc</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>mysql</groupId>
  12. <artifactId>mysql-connector-java</artifactId>
  13. <scope>runtime</scope>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.projectlombok</groupId>
  17. <artifactId>lombok</artifactId>
  18. <optional>true</optional>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-test</artifactId>
  23. <scope>test</scope>
  24. </dependency>
  25. <!--引入MybatisPlus核心配置文件-->
  26. <dependency>
  27. <groupId>com.baomidou</groupId>
  28. <artifactId>mybatis-plus-boot-starter</artifactId>
  29. <version>3.5.1</version>
  30. </dependency>
  31. <!--代码生成器-->
  32. <!--当前包未传递依赖 MP 包,需要自己引入!-->
  33. <dependency>
  34. <groupId>com.baomidou</groupId>
  35. <artifactId>mybatis-plus-generator</artifactId>
  36. <version>3.5.2</version>
  37. </dependency>
  38. <!-- 模板生成器引擎配合代码生成器一起使用 -->
  39. <dependency>
  40. <groupId>org.apache.velocity</groupId>
  41. <artifactId>velocity-engine-core</artifactId>
  42. <version>2.3</version>
  43. </dependency>
  44. </dependencies>

                5.2.3 配置yml 

  1. mybatis-plus:
  2. configuration:
  3. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启日志打印
  4. map-underscore-to-camel-case: true #开启驼峰命名法 数据库中的字段为create_time单词之间用_隔开
  5. mapper-locations: classpath*:/mapper/*Mapper.xml #扫描接口
  6. type-aliases-package: com.example.mybatisplusday1.entity #别名
  7. global-config:
  8. db-config:
  9. logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
  10. logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  11. logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

                5.2.4 entity实体类

  1. package com.example.mybatisplusday1.entity;
  2. import com.baomidou.mybatisplus.annotation.*;
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. import java.util.Date;
  7. @Data
  8. @AllArgsConstructor
  9. @NoArgsConstructor
  10. public class User {
  11. @TableId(type = IdType.AUTO) //设置id为自增长,跟随数据库表中列,默认为UUid需要手动改
  12. private Long id;
  13. private String name;
  14. private Integer age;
  15. private String email;
  16. }

                5.2.5 mapper 

  1. package com.example.mybatisplusday1.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.example.mybatisplusday1.entity.User;
  4. import org.apache.ibatis.annotations.Mapper;
  5. @Mapper
  6. // 在对应的Mapper上面继承基本的类 BaseMapper
  7. public interface UserMapper extends BaseMapper<User> {
  8. // 所有的CRUD操作都已经编写完成了
  9. // 你不需要像以前的配置一大堆文件了!
  10. }

                5.2.6 service 

  1. package com.example.mybatisplusday1.service;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import com.example.mybatisplusday1.entity.User;
  4. public interface UserService extends IService<User> {
  5. }

                5.2.7  service实现类

  1. package com.example.mybatisplusday1.service.impl;
  2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  3. import com.example.mybatisplusday1.entity.User;
  4. import com.example.mybatisplusday1.mapper.UserMapper;
  5. import com.example.mybatisplusday1.service.UserService;
  6. import org.springframework.stereotype.Service;
  7. /**
  8. * UserServiceImpl的实现类
  9. * @ClassName UserServiceImpl
  10. * @Description TODO
  11. * @Author ACER
  12. * @Date 2022/5/17 17:05
  13. * @Version 1.0
  14. **/
  15. @Service
  16. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  17. }

6.使用Mybatis-Plus简化CURD 

        6.1编写测试类

  1. package com.example.mybatisplusday1;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.example.mybatisplusday1.entity.User;
  4. import com.example.mybatisplusday1.mapper.UserMapper;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import java.sql.Wrapper;
  9. import java.util.Arrays;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. @SpringBootTest
  14. class MybatisPlusday1ApplicationTests {
  15. @Autowired
  16. private UserMapper usermapper;
  17. }

        6.1 增加

  1. @Test
  2. /*
  3. * 添加用户信息
  4. * */
  5. void contextLoads() {
  6. User user = new User();
  7. user.setName("方哥");
  8. user.setAge(19);
  9. user.setEmail("1149876322@qq.com");
  10. int result = usermapper.insert(user); // 雪花算法帮我们自动生成id
  11. System.out.println(result); // 受影响的行数
  12. System.out.println(user); // 发现,id会自动回填
  13. }

        6.2 删除

  1. /**
  2. * 功能描述:
  3. * MybatisPlus的一些删除方式
  4. * @Param: []
  5. * @Return: void
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/17 15:57
  8. */
  9. @Test
  10. void delete(){
  11. //1.按id删除,既可以按id删除,也可以按对象删除
  12. int result=usermapper.deleteById(1L);
  13. //int result usermapper.deleteById(User);
  14. //2.批量删除
  15. int delete = usermapper.deleteBatchIds(Arrays.asList(1l, 2l, 3l));
  16. //3.通过map删除
  17. Map<String,Object>map=new HashMap<>();
  18. map.put("name","方哥");
  19. int result2=usermapper.deleteByMap(map);
  20. //条件构造,高级操作
  21. //usermapper.delete(Wrapper);
  22. }

        6.3 修改

  1. /**
  2. * 功能描述:
  3. * MybatisPlus的一些修改方式
  4. * @Param: []
  5. * @Return: void
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/17 15:25
  8. */
  9. @Test
  10. void update(){
  11. //通过id修改,可以实现动态修改
  12. User user=new User();
  13. user.setId(7L);
  14. user.setName("fang");
  15. usermapper.updateById(user);
  16. //通过条件进行修改,高级部分
  17. //usermapper.update(User,wrapper);
  18. }

        6.4 查询

  1. /**
  2. * 功能描述:
  3. * MybatisPlus的一些查询方式
  4. * @Param: []
  5. * @Return: void
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/17 15:27
  8. */
  9. @Test
  10. void select(){
  11. //1.根据id获取一个User对象
  12. User user1 = usermapper.selectById(6L);
  13. //2.按map条件查询
  14. Map<String,Object>map=new HashMap<>();
  15. map.put("name","fang");
  16. map.put("age",19);
  17. List<User> users = usermapper.selectByMap(map);
  18. //jdk8的lambda表达式 ::方法引用
  19. users.forEach(System.out::println);
  20. //3.查询全部
  21. List<User> users1 = usermapper.selectList(null);
  22. users1.forEach(System.out::println);
  23. }

                6.4.1模糊查询 

  1. /**
  2. * 功能描述:
  3. * MybatisPlus(条件构造器)模糊查询
  4. * @Param: []
  5. * @Return: void
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/18 9:29
  8. **/
  9. @Test
  10. void selectBylike(){
  11. String name="";
  12. //wrapper.likeRight(); %在右边
  13. //wrapper.likeLeft(); %在左边
  14. //wrapper.like(); %%左右两边都有
  15. // wrapper.like(true,"name",name);
  16. //第一个参数为判断name是否为空为空查全部不为空则按要求查
  17. QueryWrapper<User>wrapper=new QueryWrapper<>();
  18. wrapper.like(true,"name",name);
  19. List<User> users = usermapper.selectList(wrapper);
  20. users.forEach(System.out::println);
  21. }

                6.4.2  区间查询

  1. /**
  2. * 功能描述:
  3. * MybatisPlus(条件构造器)区间查询
  4. * @Param: []
  5. * @Return: void
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/30 10:09
  8. **/
  9. @Test
  10. void selectByBetween(){
  11. QueryWrapper<User> wrapper=new QueryWrapper<>();
  12. wrapper.between("age",15,24);
  13. //所有的条件拼接默认都是and,只有当自己拼接了or才会以or的方式拼接
  14. wrapper.or().eq("name","方哥");
  15. wrapper.orderByDesc("age");
  16. List<User> users = usermapper.selectList(wrapper);
  17. users.forEach(System.out::println);
  18. }

7. 自定义ID生成器

设置实体类中主键自增长类型(默认自动生成类型为UUID)

  1. @TableId(type = IdType.AUTO) //设置id为自增长,跟随数据库表中列,默认为UUid需要手动改
  2. private Long id;

api: 

  1. package com.baomidou.mybatisplus.annotation;
  2. import lombok.Getter;
  3. /**
  4. * 生成ID类型枚举类
  5. *
  6. * @author hubin
  7. * @since 2015-11-10
  8. */
  9. @Getter
  10. public enum IdType {
  11. /**
  12. * 数据库ID自增
  13. * <p>该类型请确保数据库设置了 ID自增 否则无效</p>
  14. */
  15. AUTO(0),
  16. /**
  17. * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
  18. */
  19. NONE(1),
  20. /**
  21. * 用户输入ID
  22. * <p>该类型可以通过自己注册自动填充插件进行填充</p>
  23. */
  24. INPUT(2),
  25. /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
  26. /**
  27. * 分配ID (主键类型为number或string),
  28. * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
  29. *
  30. * @since 3.3.0
  31. */
  32. ASSIGN_ID(3),
  33. /**
  34. * 分配UUID (主键类型为 string)
  35. * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
  36. */
  37. ASSIGN_UUID(4);
  38. private final int key;
  39. IdType(int key) {
  40. this.key = key;
  41. }
  42. }

8. 自动填充  

创建时间、修改时间!这些操作一般自动化完成的,我们不希望手动更新!

阿里巴巴开发手册:所有的数据库表:gmt_create、gmt_modified几乎所有表都要配置上!而且需要自动化!

         8.1 数据库新增两个字段(create_time,update_time)

         8.2 实体类新增两个字段(createTime,updateTime)

  1. // 注意!这里需要标记为填充字段
  2. //fill = FieldFill.INSERT代表新增是填充
  3. @TableField(fill = FieldFill.INSERT)
  4. private Date createTime;
  5. // 注意!这里需要标记为填充字段
  6. //fill = FieldFill.INSERT_UPDATE代表新增修改时填充
  7. @TableField(fill = FieldFill.INSERT_UPDATE)
  8. private Date updateTime;

         8.3 编写Mybatis-Plus自动填充配置类

  1. package com.example.mybatisplusday1.config;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.ibatis.reflection.MetaObject;
  5. import org.springframework.stereotype.Component;
  6. import java.time.LocalDateTime;
  7. import java.util.Date;
  8. /**
  9. * 功能描述:
  10. * MyBatisPlus的自动填充配置类
  11. * @Author: Mr.Huang
  12. * @Date: 2022/5/17 15:45
  13. */
  14. @Slf4j
  15. @Component
  16. public class MyMetaObjectHandler implements MetaObjectHandler {
  17. @Override
  18. public void insertFill(MetaObject metaObject) {
  19. log.info("start insert fill ....");
  20. //增加的时候实现填充,需要添加两个值
  21. this.strictInsertFill(metaObject, "createTime", Date.class,new Date()); // 起始版本 3.3.0(推荐使用)
  22. this.strictInsertFill(metaObject, "updateTime", Date.class,new Date()); // 起始版本 3.3.0(推荐使用)
  23. }
  24. @Override
  25. public void updateFill(MetaObject metaObject) {
  26. log.info("start update fill ....");
  27. //增加的时候实现填充
  28. this.strictInsertFill(metaObject, "updateTime", Date.class,new Date()); // 起始版本 3.3.0(推荐使用)
  29. }
  30. }

         8.4 结果

新增:

修改:

 9.乐观锁

分布式场景下可能会出现脏读  幻读

乐观锁:顾名思义乐观,它总是认为不会出现问题,无论干什么都不去上锁!如果出现问题,再次更新值测试,效率低,容错率高

悲观锁:顾名思义悲观,它总是认为会出现问题,无论干什么都会加上锁!再去操作,效率低,容错率高 

乐观锁实现方式: 

  • 取出记录是,获取当前version
  • 更新事,带上这个version
  • 执行更新事,set version=newVersion where version =oldVersion
  • 如果version不对,就更新失败

        9.1 数据库新增字段(version)

        9.2  实体类新增字段(version)

  1. /*
  2. * 乐观锁
  3. * 数据库需要给此字段设置默认值为1
  4. * 功能描述:
  5. * 任何操作都应该是乐观的,都觉得它不会出问题,
  6. * 从而不会对行,表进行锁定,一旦出现问题将无法解决
  7. * 与其相反的为悲观锁:效率低,容错高
  8. * @Author: Mr.Huang
  9. * @Date: 2022/5/17 16:08
  10. **/
  11. @Version
  12. private Integer version;

        9.3 编写MyBatisPlus的配置类

  1. package com.example.mybatisplusday1.config;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
  5. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * MyBatisPlus的配置类
  10. * @ClassName MyBatisPlusConfiguration
  11. * @Description TODO
  12. * @Author ACER
  13. * @Date 2022/5/17 16:11
  14. * @Version 1.0
  15. **/
  16. @Configuration
  17. public class MyBatisPlusConfiguration {
  18. /**
  19. * MyBatisPlus配置
  20. */
  21. @Bean
  22. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  23. //乐观锁配置
  24. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  25. mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  26. //分页插件配置
  27. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  28. return mybatisPlusInterceptor;
  29. }
  30. }

        9.4 测试 

  1. /**
  2. * 功能描述:
  3. * MybatisPlus乐观锁
  4. * 测试乐观锁是否能够使用
  5. * @Param: []
  6. * @Return: void
  7. * @Author: Mr.Huang
  8. * @Date: 2022/5/17 16:01
  9. **/
  10. @Test
  11. void testversion(){
  12. //修改一个用户信息,根据id获取用户信息
  13. //模拟a用户去修改6L这个数据
  14. User user1 = usermapper.selectById(6L);
  15. user1.setName("张三");
  16. //模拟b用户去修改6L这个数据
  17. User user2 = usermapper.selectById(6L);
  18. user2.setName("李四");
  19. //a先修改用户
  20. usermapper.updateById(user1);
  21. //b后修改用户(李四修改失败)
  22. usermapper.updateById(user2);
  23. }

10.逻辑删除 

物理删除:从数据库中直接移除

逻辑删除:在数据库中没有被移除,而是通过一个变量来让他失效!delete=0 => delete=1 

管理员可以查看被删除的记录!防止数据的丢失,类似于回收站!订单,不能直接删除的!

        10.1 数据库新增字段(deleted)

        10.2 实体类新增字段(deleted)

  1. /*
  2. * 功能描述:
  3. * 逻辑删除,并不是真的删除
  4. * @Param:
  5. * @Return:
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/17 16:37
  8. **/
  9. @TableLogic
  10. private Integer deleted;

        10.3 yml配置 

  1. mybatis-plus:
  2. configuration:
  3. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启日志打印
  4. map-underscore-to-camel-case: true #开启驼峰命名法 数据库中的字段为create_time单词之间用_隔开
  5. mapper-locations: classpath*:/mapper/*Mapper.xml #扫描接口
  6. type-aliases-package: com.example.mybatisplusday1.entity #别名
  7. global-config:
  8. db-config:
  9. logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
  10. logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  11. logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

        10.4 测试 

  1. @Test
  2. void delete(){
  3. //1.按id删除,既可以按id删除,也可以按对象删除
  4. int result=usermapper.deleteById(14L);
  5. }

11. 代码生成器

实现代码的自动生成   mapper  service  mapper.xml   controller都是一次性全部生成

请查看:2022/5/25 Mybatis-Plus代码生成器(mybatis-plus-generat)配置模板_Abcdzzr的博客-CSDN博客

12.高级条件查询(条件构造器)

        12.1 条件构造器关系介绍

在这里插入图片描述

        12.2 介绍 

  1. 上图绿色框为抽象类abstract
  2. 蓝色框为正常class类,可new对象
  3. 黄色箭头指向为父子类关系,箭头指向为父类

        12.3 wapper介绍

  1. Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
  2. AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
  3. AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
  4. LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
  5. LambdaUpdateWrapper : Lambda 更新封装Wrapper
  6. QueryWrapper : Entity 对象封装操作类,不是用lambda语法
  7. UpdateWrapper : Update 条件封装,用于Entity对象更新操作

        12.3 API

官网:条件构造器 | MyBatis-Plus

在这里插入图片描述

        12.4 示例

  1. /**
  2. * 功能描述:
  3. * MybatisPlus(条件构造器)模糊查询
  4. * @Param: []
  5. * @Return: void
  6. * @Author: Mr.Huang
  7. * @Date: 2022/5/18 9:29
  8. **/
  9. @Test
  10. void selectBylike(){
  11. String name="";
  12. //wrapper.likeRight(); %在右边
  13. //wrapper.likeLeft(); %在左边
  14. //wrapper.like(); %%左右两边都有
  15. // wrapper.like(true,"name",name);
  16. //第一个参数为判断name是否为空为空查全部不为空则按要求查
  17. QueryWrapper<User>wrapper=new QueryWrapper<>();
  18. wrapper.like(true,"name",name);
  19. List<User> users = usermapper.selectList(wrapper);
  20. users.forEach(System.out::println);
  21. }
  22. /**
  23. * 功能描述:
  24. * MybatisPlus(条件构造器)区间查询
  25. * @Param: []
  26. * @Return: void
  27. * @Author: Mr.Huang
  28. * @Date: 2022/5/30 10:09
  29. **/
  30. @Test
  31. void selectByBetween(){
  32. QueryWrapper<User> wrapper=new QueryWrapper<>();
  33. wrapper.between("age",15,24);
  34. //所有的条件拼接默认都是and,只有当自己拼接了or才会以or的方式拼接
  35. wrapper.or().eq("name","方哥");
  36. wrapper.orderByDesc("age");
  37. List<User> users = usermapper.selectList(wrapper);
  38. users.forEach(System.out::println);
  39. }
  40. }

13.分页插件 

        13.1 编写MyBatisPlus的配置类

  1. package com.example.mybatisplusday1.config;
  2. import com.baomidou.mybatisplus.annotation.DbType;
  3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
  5. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * MyBatisPlus的配置类
  10. * @ClassName MyBatisPlusConfiguration
  11. * @Description TODO
  12. * @Author ACER
  13. * @Date 2022/5/17 16:11
  14. * @Version 1.0
  15. **/
  16. @Configuration
  17. public class MyBatisPlusConfiguration {
  18. /**
  19. * MyBatisPlus配置
  20. */
  21. @Bean
  22. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  23. //乐观锁配置
  24. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  25. mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  26. //分页插件配置
  27. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
  28. return mybatisPlusInterceptor;
  29. }
  30. }

        13.2 Page<>对象API

  1. package com.baomidou.mybatisplus.extension.plugins.pagination;
  2. import com.baomidou.mybatisplus.core.metadata.IPage;
  3. import com.baomidou.mybatisplus.core.metadata.OrderItem;
  4. import lombok.Setter;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.Collections;
  8. import java.util.List;
  9. import java.util.function.Predicate;
  10. /**
  11. * 简单分页模型
  12. *
  13. * @author hubin
  14. * @since 2018-06-09
  15. */
  16. public class Page<T> implements IPage<T> {
  17. private static final long serialVersionUID = 8545996863226528798L;
  18. /**
  19. * 查询数据列表
  20. */
  21. protected List<T> records = Collections.emptyList();
  22. /**
  23. * 总数
  24. */
  25. protected long total = 0;
  26. /**
  27. * 每页显示条数,默认 10
  28. */
  29. protected long size = 10;
  30. /**
  31. * 当前页
  32. */
  33. protected long current = 1;
  34. /**
  35. * 排序字段信息
  36. */
  37. @Setter
  38. protected List<OrderItem> orders = new ArrayList<>();
  39. /**
  40. * 自动优化 COUNT SQL
  41. */
  42. protected boolean optimizeCountSql = true;
  43. /**
  44. * 是否进行 count 查询
  45. */
  46. protected boolean searchCount = true;
  47. /**
  48. * {@link #optimizeJoinOfCountSql()}
  49. */
  50. @Setter
  51. protected boolean optimizeJoinOfCountSql = true;
  52. /**
  53. * countId
  54. */
  55. @Setter
  56. protected String countId;
  57. /**
  58. * countId
  59. */
  60. @Setter
  61. protected Long maxLimit;
  62. public Page() {
  63. }
  64. /**
  65. * 分页构造函数
  66. *
  67. * @param current 当前页
  68. * @param size 每页显示条数
  69. */
  70. public Page(long current, long size) {
  71. this(current, size, 0);
  72. }
  73. public Page(long current, long size, long total) {
  74. this(current, size, total, true);
  75. }
  76. public Page(long current, long size, boolean searchCount) {
  77. this(current, size, 0, searchCount);
  78. }
  79. public Page(long current, long size, long total, boolean searchCount) {
  80. if (current > 1) {
  81. this.current = current;
  82. }
  83. this.size = size;
  84. this.total = total;
  85. this.searchCount = searchCount;
  86. }
  87. /**
  88. * 是否存在上一页
  89. *
  90. * @return true / false
  91. */
  92. public boolean hasPrevious() {
  93. return this.current > 1;
  94. }
  95. /**
  96. * 是否存在下一页
  97. *
  98. * @return true / false
  99. */
  100. public boolean hasNext() {
  101. return this.current < this.getPages();
  102. }
  103. @Override
  104. public List<T> getRecords() {
  105. return this.records;
  106. }
  107. @Override
  108. public Page<T> setRecords(List<T> records) {
  109. this.records = records;
  110. return this;
  111. }
  112. @Override
  113. public long getTotal() {
  114. return this.total;
  115. }
  116. @Override
  117. public Page<T> setTotal(long total) {
  118. this.total = total;
  119. return this;
  120. }
  121. @Override
  122. public long getSize() {
  123. return this.size;
  124. }
  125. @Override
  126. public Page<T> setSize(long size) {
  127. this.size = size;
  128. return this;
  129. }
  130. @Override
  131. public long getCurrent() {
  132. return this.current;
  133. }
  134. @Override
  135. public Page<T> setCurrent(long current) {
  136. this.current = current;
  137. return this;
  138. }
  139. @Override
  140. public String countId() {
  141. return this.countId;
  142. }
  143. @Override
  144. public Long maxLimit() {
  145. return this.maxLimit;
  146. }
  147. /**
  148. * 查找 order 中正序排序的字段数组
  149. *
  150. * @param filter 过滤器
  151. * @return 返回正序排列的字段数组
  152. */
  153. private String[] mapOrderToArray(Predicate<OrderItem> filter) {
  154. List<String> columns = new ArrayList<>(orders.size());
  155. orders.forEach(i -> {
  156. if (filter.test(i)) {
  157. columns.add(i.getColumn());
  158. }
  159. });
  160. return columns.toArray(new String[0]);
  161. }
  162. /**
  163. * 移除符合条件的条件
  164. *
  165. * @param filter 条件判断
  166. */
  167. private void removeOrder(Predicate<OrderItem> filter) {
  168. for (int i = orders.size() - 1; i >= 0; i--) {
  169. if (filter.test(orders.get(i))) {
  170. orders.remove(i);
  171. }
  172. }
  173. }
  174. /**
  175. * 添加新的排序条件,构造条件可以使用工厂:{@link OrderItem#build(String, boolean)}
  176. *
  177. * @param items 条件
  178. * @return 返回分页参数本身
  179. */
  180. public Page<T> addOrder(OrderItem... items) {
  181. orders.addAll(Arrays.asList(items));
  182. return this;
  183. }
  184. /**
  185. * 添加新的排序条件,构造条件可以使用工厂:{@link OrderItem#build(String, boolean)}
  186. *
  187. * @param items 条件
  188. * @return 返回分页参数本身
  189. */
  190. public Page<T> addOrder(List<OrderItem> items) {
  191. orders.addAll(items);
  192. return this;
  193. }
  194. @Override
  195. public List<OrderItem> orders() {
  196. return this.orders;
  197. }
  198. @Override
  199. public boolean optimizeCountSql() {
  200. return optimizeCountSql;
  201. }
  202. public static <T> Page<T> of(long current, long size, long total, boolean searchCount) {
  203. return new Page<>(current, size, total, searchCount);
  204. }
  205. @Override
  206. public boolean optimizeJoinOfCountSql() {
  207. return optimizeJoinOfCountSql;
  208. }
  209. public Page<T> setSearchCount(boolean searchCount) {
  210. this.searchCount = searchCount;
  211. return this;
  212. }
  213. public Page<T> setOptimizeCountSql(boolean optimizeCountSql) {
  214. this.optimizeCountSql = optimizeCountSql;
  215. return this;
  216. }
  217. @Override
  218. public long getPages() {
  219. // 解决 github issues/3208
  220. return IPage.super.getPages();
  221. }
  222. /* --------------- 以下为静态构造方式 --------------- */
  223. public static <T> Page<T> of(long current, long size) {
  224. return of(current, size, 0);
  225. }
  226. public static <T> Page<T> of(long current, long size, long total) {
  227. return of(current, size, total, true);
  228. }
  229. public static <T> Page<T> of(long current, long size, boolean searchCount) {
  230. return of(current, size, 0, searchCount);
  231. }
  232. @Override
  233. public boolean searchCount() {
  234. if (total < 0) {
  235. return false;
  236. }
  237. return searchCount;
  238. }
  239. /**
  240. * --begin------------- 未来抛弃移除的方法 -------------begin--
  241. * 该部分属性转移至 {@link PageDTO}
  242. */
  243. @Deprecated
  244. public String getCountId() {
  245. return this.countId;
  246. }
  247. @Deprecated
  248. public Long getMaxLimit() {
  249. return this.maxLimit;
  250. }
  251. @Deprecated
  252. public List<OrderItem> getOrders() {
  253. return this.orders;
  254. }
  255. @Deprecated
  256. public boolean isOptimizeCountSql() {
  257. return this.optimizeCountSql;
  258. }
  259. @Deprecated
  260. public boolean isSearchCount() {
  261. return this.searchCount;
  262. }
  263. /** --end------------- 未来抛弃移除的方法 -------------end-- */
  264. }

        13.3 示例

  1. package com.example.mybatisplusday1.controller;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.example.mybatisplusday1.entity.User;
  8. import com.example.mybatisplusday1.service.UserService;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.web.bind.annotation.*;
  11. import java.util.List;
  12. /**
  13. * User控制器
  14. * @ClassName UserController
  15. * @Description TODO
  16. * @Author ACER
  17. * @Date 2022/5/17 17:08
  18. * @Version 1.0
  19. **/
  20. @RestController
  21. @CrossOrigin //解决接口跨域问题
  22. public class UserController {
  23. @Autowired
  24. private UserService userService;
  25. /**
  26. * 功能描述:
  27. * 条件查询并分页
  28. * @Param: [page, size, name]
  29. * @Return: com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.example.mybatisplusday1.entity.User>
  30. * @Author: Mr.Huang
  31. * @Date: 2022/5/30 11:14
  32. **/
  33. @GetMapping("/getUserList")
  34. public Page<User> getUsers(@RequestParam(value = "page",required = true,defaultValue = "1") Integer page,
  35. @RequestParam(value = "size",required = true,defaultValue = "3")Integer size,
  36. @RequestParam(value = "name",required = false)String name){
  37. // BaseMapper<User> baseMapper = userService.getBaseMapper();
  38. Page<User> pageinfo = new Page<>(page,size);
  39. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  40. //判断条件值是否为空,如果不为空拼接条件
  41. if (!StringUtils.isEmpty(name)){
  42. //构建条件 模糊查询
  43. queryWrapper.like("name",name);
  44. }
  45. Page<User> page1 = userService.page(pageinfo, queryWrapper);
  46. //baseMapper.selectPage(pageinfo,queryWrapper);
  47. return page1;
  48. }
  49. //增加
  50. @PostMapping("/addUser")
  51. public String addbanana(@RequestBody User user){
  52. return userService.save(user)+"";
  53. }
  54. //删除
  55. @DeleteMapping("/deleteUser")
  56. public String deleteUser(@RequestBody User user){
  57. return userService.removeById(user)+"";
  58. }
  59. //修改
  60. @PutMapping("/updateUser")
  61. public String updateUser(@RequestBody User user){
  62. return userService.updateById(user)+"";
  63. }
  64. }

码字不易,谢谢点赞关注。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/522215
推荐阅读
相关标签
  

闽ICP备14008679号