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. FreeBSD 中文TTY控制台

    freebsd新型终端VT,支持cjk,所以丢个字体进去,就能显示中文了1,首先你没有改过控制台程序,使用的是默认的,,2,最新版本,本说明是以freebsd12.1release字体格式为.fnt命 ...

  2. EmEditor, 在正则使用()匹配后 使用$1 $2进行对括号内的值进行引用

    $1表示第一个括号,$2表示第二个括号,以此类推

  3. flutter兼论

    Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发布 第一个版本以来,目前Fl ...

  4. 翻译:《实用的Python编程》06_01_Iteration_protocol

    目录 | 上一节 (5.2 封装) | 下一节 (6.2 自定义迭代) 6.1 迭代协议 本节将探究迭代的底层过程. 迭代无处不在 许多对象都支持迭代: a = 'hello' for c in a: ...

  5. 2018ICPC南京D. Country Meow

    题目: 题意:三维里有n个点,找一个最小的球将所有点覆盖. 题解:退火法模拟的一道板子题. 1 #include <stdio.h> 2 #include <iostream> ...

  6. PTA 二叉树的三种遍历(先序、中序和后序)

    6-5 二叉树的三种遍历(先序.中序和后序) (6 分)   本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTr ...

  7. OpenCV图像处理中的“机器学习"技术的使用

    注意,本文中所指"机器学习"(ML)技术,特指SVM.随机森林等"传统"技术. 一.应用场景        相比较当下发展迅速的各路"端到端" ...

  8. Java例题_30 在已经排好序的数组中插入值

    1 /*30 [程序 30 插入数字] 2 题目:有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. 3 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插 ...

  9. java例题_16 九九乘法表

    1 /*题目:输出 9*9 口诀. 2 程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列. 3 */ 4 5 /*分析 6 * 用两侧for循环,外层循环还要控制换行 7 * 换行时 ...

  10. [模拟]P1046 陶陶摘苹果

    陶陶摘苹果 ## 题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试 ...