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. drf给上传图片重命名

    1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在storage.py中添加如下代码: #复制代码 -- coding: UTF-8 ...

  2. Java 并发编程之 Condition 接口

    本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...

  3. python基础学习之列表的功能方法

    列表:list 格式 li = [1,2,3,4,5,6] 列表内部随意嵌套其他格式:字符串.列表.数字.元组.字典. 列表内部有序,且内容可更改 a = [1,2,3,4]    a[0] = 5  ...

  4. tips 【总结】

    需求 移入a标签把对应的详情显示出来并且根据位置判断,当前详情是否超出父级可视区范围,如果超出就定位的距离方向应该正好在父级可视区范围内 需求分析: 需要用到: offsetLeft   获取外边框到 ...

  5. kubernetes1.17.2结合ceph13.2.8部署gitlab12.1.6

    [root@bs-k8s-ceph ~]# ceph -s cluster: id: 11880418-1a9a-4b55-a353-4b141e2199d8 health: HEALTH_OK se ...

  6. MyBatis笔记(六)

    1. 动态SQL 1.1 介绍 概念:**动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句.* 官网描述: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其 ...

  7. django+x-admin管理后台模板开发管理后台案例(设计部分)

    使用django+x-admin管理后台模板搭建管理后台 一.环境需求 1.django:3.1 2.python:3.7 3.x-admin:2.2 4.pycharm:2020.3.2 5.ubu ...

  8. UnitOneSummary

    目录 一.程序结构分析 第一次作业 第二次作业 第三次作业 二.Test & Bugs 三.设计模式 四.总结与反思 一.程序结构分析 第一次作业 思路: 1.输入预处理: 去除空格和\t 替 ...

  9. [开源]制作docker镜像不依赖linux和Docker环境

    背景 最近群友们经常反馈docker镜像制作起来有点麻烦,我开源的antdeploy工具虽然可以制作镜像但是必须有一个提前:有一台安装好docker的linux服务器.因为大家开发环境基本上都是win ...

  10. 关于 Spring 中 getBean 的全流程源码解析

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你提出问题,就要给出解决方案! 最近有粉丝小伙伴反馈,与自己的上级沟通总是遇到障碍, ...