mybatis-plus常用功能总结-以User表为例

1.数据库

id name age email create_time update_time version deleted
1 mary 20 mary@qq.com 2021-05-06 08:13:31 2021-05-06 08:13:31 1 1
2 jack 20 jack@qq.com 2021-05-06 08:33:55 2021-05-06 08:33:55 1 0
3 rose 20 rose@qq.com 2021-05-06 08:37:09 2021-05-06 08:37:09 1 0

2.完整代码

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.4.5</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.systop</groupId>
   <artifactId>mpdemo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>mpdemo</name>
   <description>Demo project for Spring Boot</description>
   <properties>
       <java.version>1.8</java.version>
   </properties>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>

       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
           <exclusions>
               <exclusion>
                   <groupId>org.junit.vintage</groupId>
                   <artifactId>junit-vintage-engine</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
       <!--mybatis-plus-->
       <dependency>
           <groupId>com.baomidou</groupId>
           <artifactId>mybatis-plus-boot-starter</artifactId>
           <version>3.0.5</version>
       </dependency>
       <!--mysql-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>
       <!--lombok用来简化实体类-->
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

</project>

2.application.yml

spring:
application:
  name: mpdemo
datasource:
  username: root
  password: root
  url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
  driver-class-name: com.mysql.cj.jdbc.Driver
profiles:
  active: dev

mybatis-plus:
configuration:
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
  db-config:
    logic-delete-value: 1 #删除为1
    logic-not-delete-value: 0 #未删除为0

3.User.java

package com.systop.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

@Data
public class User {

   private Long id;
   
   private String name;
   private Integer age;
   private String email;
   //自动填充
   @TableField(fill = FieldFill.INSERT)
   private Date createTime;
   @TableField(fill = FieldFill.INSERT_UPDATE)
   private Date updateTime;
   //乐观锁
   @Version
   @TableField(fill = FieldFill.INSERT)
   private Integer version;//版本号

   //逻辑删除
   @TableLogic
   private Integer deleted;

}

4.MpConfig.java

package com.systop.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@MapperScan("com.systop.mapper")
public class MpConfig {

   
   //乐观锁插件
   @Bean
   public OptimisticLockerInterceptor optimisticLockerInterceptor(){
       return new OptimisticLockerInterceptor();
  }
   //分页插件
   @Bean
   public PaginationInterceptor paginationInterceptor() {
       return new PaginationInterceptor();
  }
   //逻辑删除插件
   @Bean
   public ISqlInjector sqlInjector(){
       return new LogicSqlInjector();
  }

   /*
   SQL 执行性能分析插件
   开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
   三种环境
   dev:开发环境
   test:测试环境
   prod:生产环境
   */
   @Bean
   @Profile({"dev","test"})// 设置 dev test 环境开启
   public PerformanceInterceptor performanceInterceptor() {
       PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
       performanceInterceptor.setMaxTime(200);//ms,超过此处设置的ms则sql不执行
       performanceInterceptor.setFormat(true);
       return performanceInterceptor;
  }


}

5.MyMetaObjectHandler.java

package com.systop.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

   //自动填充
   //使用mp实现添加操作,这个方法执行
   @Override
   public void insertFill(MetaObject metaObject) {
       this.setFieldValByName("createTime",new Date(),metaObject);
       this.setFieldValByName("updateTime",new Date(),metaObject);

       this.setFieldValByName("version",1,metaObject);
  }
   //使用mp实现修改操作,这个方法执行
   @Override
   public void updateFill(MetaObject metaObject) {
       this.setFieldValByName("updateTime",new Date(),metaObject);
  }
}

6.UserMapper.java

package com.systop.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.systop.entity.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {
}

7.测试类 MpdemoApplicationTests

package com.systop;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.systop.entity.User;
import com.systop.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

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

@SpringBootTest
class MpdemoApplicationTests {

   @Autowired
   private UserMapper userMapper;

   //查询user表所有数据
   @Test
   public void findAll() {
       List<User> users = userMapper.selectList(null);
       System.out.println(users);
  }

   //添加操作
   @Test
   public void addUser(){
       User user = new User();
       user.setName("mary");
       user.setAge(20);
       user.setEmail("mary@qq.com");
       //user.setCreateTime(new Date());
       //user.setUpdateTime(new Date());
       //使用mp方式实现数据库添加,不需要set到对象里面值
       int insert = userMapper.insert(user);
       System.out.println("insert:"+insert);
  }

   @Test
   public void updateUser(){
       User user = new User();
       user.setId(1L);
       user.setAge(30);
       int row = userMapper.updateById(user);
       System.out.println(row);
  }
   //测试乐观锁
   @Test
   public void testOptimisticLocker(){
       //先查询再修改
       //根据id查询数据
       User user = userMapper.selectById(1L);
       //进行修改
       user.setAge(200);
       userMapper.updateById(user);
  }
   //多个id批量查询
   @Test
   public void testSelectDemo1(){
       List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
       System.out.println(users);
  }
   //通过map封装查询条件
   @Test
   public void testSelectByMap(){
       HashMap<String, Object> map = new HashMap<>();
       map.put("name", "Jone");
       map.put("age", 18);
       List<User> users = userMapper.selectByMap(map);
       users.forEach(System.out::println);
  }
   //分页查询
   @Test
   public void testPage(){
       //1 创建page对象
       //传入两个参数:当前页 和 每页显示记录数
       Page<User> page = new Page<>(1,3);
       //调用mp分页查询的方法
       //调用mp分页查询过程中,底层封装
       //把分页所有数据封装到page对象里面
       userMapper.selectPage(page,null);
       //通过page对象获取分页数据
       System.out.println(page.getCurrent());//当前页
       System.out.println(page.getRecords());//每页数据list集合
       System.out.println(page.getSize());//每页显示记录数
       System.out.println(page.getTotal());//总记录数
       System.out.println(page.getPages());//总页数

       System.out.println(page.hasNext());//是否有下一页
       System.out.println(page.hasPrevious());//是否有上一页
  }

   //删除操作 物理删除
   @Test
   public void testDeleteById(){
       int result = userMapper.deleteById(1L);
       System.out.println(result);
  }

   //批量删除
   @Test
   public void testDeleteBatchIds(){
       int result = userMapper.deleteBatchIds(Arrays.asList(2,3));
       System.out.println(result);
  }


   //mp实现复杂查询操作
   //ge、gt、le、lt、isNull、isNotNull、eq、ne、between、notBetween、allEq、
   // like、notLike、likeLeft、likeRight、in、notIn、inSql、notinSql、exists、
   // notExists、or、and、嵌套or、嵌套and、orderBy、orderByDesc、oderByAsc、last
   // set、setSql
   @Test
   public void testSelectQuery(){
       //创建对象
       QueryWrapper<User> wrapper = new QueryWrapper<>();
       //通过QueryWrapper设置条件
       //ge>=、gt>、le<=、lt<
       //查询age>=30记录
       //第一个参数是字段名称,第二个参数设置值
       //wrapper.ge("age",30);

       // eq=、ne≠
       //wrapper.ne("name","宋家猴儿");

       //between
       //查询年龄20-30
       //wrapper.between("age","20","30");

       //like
       //wrapper.like("name","狗");

       //orderByDesc 排序
       //wrapper.orderByDesc("id");
       
       //last拼接
       //wrapper.last("limit 1");
       
       //指定要查询的列
       wrapper.select("id","name");
       List<User> users = userMapper.selectList(wrapper);
       System.out.println(users);
  }
}

mp逻辑删除

物理删除:真实删除。将对应数据从数据库中删除,之后查询不到此条被删除数据;

逻辑删除:假删除。将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

1.在Config中添加插件

@Configuration
@MapperScan("com.systop.mapper")
public class MpConfig {
   //逻辑删除插件
   @Bean
   public ISqlInjector sqlInjector(){
       return new LogicSqlInjector();
  }
}

2.在逻辑删除属性上添加注解

//逻辑删除
@TableLogic
private Integer deleted;

3.测试

@Test
public void testDeleteById(){
   int result = userMapper.deleteById(1L);
   System.out.println(result);
}

mp自动填充

有些表中会有更新时间、创建时间、更新人或者创建人这些字段。

每次对数据进行新增、删除、修改时都需要对这些字段进行设置。传统的做法是在进行这些操作前,对Entity的字段进行set设置,然后再进行操作。这种做法不仅容易忘记导致出错、而且代码会显得特别冗余。

虽然新增时间和修改时间可以使用数据库的时间,但是新增人和修改人就不能使用这样的功能。

所以MP就提供自动填充的功能,帮助自定设置这些字段的值,提升开发效率,代码也会显得特别优雅。

1.在自动填充属性上添加注解

//自动填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

2.创建MyMetaObjectHandler

package com.systop.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

   //使用mp实现添加操作,这个方法执行
   @Override
   public void insertFill(MetaObject metaObject) {
       this.setFieldValByName("createTime",new Date(),metaObject);
       this.setFieldValByName("updateTime",new Date(),metaObject);
  }
   //使用mp实现修改操作,这个方法执行
   @Override
   public void updateFill(MetaObject metaObject) {
       this.setFieldValByName("updateTime",new Date(),metaObject);
  }
}

3.添加数据测试

@Test
public void addUser(){
   User user = new User();
   user.setName("mary");
   user.setAge(20);
   user.setEmail("mary@qq.com");
//原始填充
   //user.setCreateTime(new Date());
   //user.setUpdateTime(new Date());
   //使用mp方式实现数据库添加,不需要set到对象里面值
   int insert = userMapper.insert(user);
   System.out.println("insert:"+insert);
}

mp乐观锁

乐观锁,解决丢失更新的问题,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号等于数据库表当前版本号,则予以更新,否则认为是过期数据。

1.属性上添加注解

//乐观锁
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;//版本号

2.config中配置乐观锁插件

@Configuration
@MapperScan("com.systop.mapper")
public class MpConfig {
   //乐观锁插件
   @Bean
   public OptimisticLockerInterceptor optimisticLockerInterceptor(){
       return new OptimisticLockerInterceptor();
  }
}

3.在MymetaObjectHandler中添加以下代码实现自动添加

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

   //使用mp实现添加操作,这个方法执行
   @Override
   public void insertFill(MetaObject metaObject) {
this.setFieldValByName("version",1,metaObject);
  }
}

4.测试

//测试乐观锁
@Test
public void testOptimisticLocker(){
   //先查询再修改!!!
   //根据id查询数据
   User user = userMapper.selectById(1L);
   //进行修改
   user.setAge(200);
   userMapper.updateById(user);
}

mybatis-plus详细讲解地址:https://www.bilibili.com/video/BV1dQ4y1A75e?p=6

mybatis常用功能总结的更多相关文章

  1. Spring Boot从入门到实战:整合Web项目常用功能

    在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问.异常处理.消息队列.缓存服务.OSS服务,以及接口日志配置,接口文档生成等.如果每个项目都来一套,则既费力又难以维护.可以通过Spr ...

  2. MyBatis - 常用标签与动态Sql

    MyBatis常用标签 ● 定义sql语句:select.insert.delete.update ● 配置JAVA对象属性与查询结构及中列明对应的关系:resultMap ● 控制动态sql拼接:i ...

  3. WebStorm 常用功能的使用技巧分享

    WebStorm 是 JetBrain 公司开发的一款 JavaScript IDE,使用非常方便,可以使编写代码过程更加流畅. 本文在这里分享一些常用功能的使用技巧,希望能帮助大家更好的使用这款强大 ...

  4. AVA正则表达式4种常用功能

    正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加入了对它的支持 下面简单的说下它的4种常用功能: 查询: String str="abc efg ABC";  Str ...

  5. [转]WebPack 常用功能介绍

    概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.templa ...

  6. FastReport.Net 常用功能总汇

    一.常用控件 文本框:输入文字或表达式 表格:设置表格的行列数,输入数字或表达式 子报表:放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表.系统在打印处理时,先按主报表打印,当碰到 ...

  7. python3 字符串与列表常用功能

    一.字符串常用功能 1. capitalize(),将字符串的首字母变成大写,其余全部置为小写:如果字符串中有多个单词,也只是将第一个单词的首字母置为大写:例: >>> name = ...

  8. matlab进阶:常用功能的实现,常用函数的说明

    常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...

  9. WebPack常用功能介绍

    概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.templa ...

随机推荐

  1. Node.js 模块化你所需要知道的事

    一.前言 我们知道,Node.js是基于CommonJS规范进行模块化管理的,模块化是面对复杂的业务场景不可或缺的工具,或许你经常使用它,但却从没有系统的了解过,所以今天我们来聊一聊Node.js模块 ...

  2. Jmeter +Jenkins +Ant 集成发送邮件报告

    [TOC] 一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系 ...

  3. vue 弹窗禁止底层滚动

    原因:底层视图高度超出百分百,加入弹窗后再苹果浏览器隐藏上下栏的情况下遮罩层没有完全遮住底层. 处理:打开弹窗后禁止底层滚动调用stop事件,关闭则开启底层滚动调用move事件. let mo=fun ...

  4. 2019 GDUT Rating Contest III : Problem D. Lemonade Line

    题面: D. Lemonade Line Input file: standard input Output file: standard output Time limit: 1 second Memo ...

  5. 使用Webpack构建多页面程序

    使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面程序. 原理 将每个页面所在的文件夹都看作是一个单独的单页面 ...

  6. Hive源码分析(1)——HiveServer2启动过程

    1.想了解HiveServer2的启动过程,则需要找到启动HiveServer2的入口,hive服务的启动命令为hive --service HiveServer2,通过分析$HIVE_HOME/bi ...

  7. CSS垂直布局

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  8. 想了很久,一道Microsoft的笔试题目 —— Reversing Linked List

    Reversing Linked List Given a constant K and a singly linked list L, you are supposed to reverse the ...

  9. 模拟实现AMD模块化规范

    目录 引子 再谈什么是闭包(闭包的产生)? 词法作用域 回到闭包 利用闭包编写模块 实现AMD模块化规范 写在最后 引子 本文最后的目的是模拟实现AMD模块化规范,而写下本文的原因是今天阅读到了< ...

  10. Docker安装完成后启动报错:Failed to start Docker Application Container Engine

    报错如下:显示没有启动 先关闭防火墙:防火墙关闭指令请看  <a href="Linux防火墙篇">https://www.cnblogs.com/szx666/p/1 ...