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. 如何用Flink把数据sink到kafka多个不同(成百上千)topic中

    需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...

  2. 任务4 PHP扩展模块安装

    /usr/local/php/bin/php -m //如何查看PHP加载了哪些模块 #cd  /usr/local/src #wget http://pecl.php.net/get/redis-2 ...

  3. 一文弄懂js的执行上下文与执行上下文栈

    目录 执行上下文与执行上下文栈 变量提升与函数提升 变量提升 函数提升 变量提升与函数提升的优先级 变量提升的一道题目引出var关键字与let关键字各自的特性 执行上下文 全局执行上下文 函数(局部) ...

  4. 2018.8.30 nowcoder oi赛制测试1

    2018.8.30 nowcoder oi赛制测试1 普及组难度,发现了一些问题 A 题目大意:求斐波那契数列\(f(k-1)f(k+1)-f(k)^2\),范围极大 打表可得规律 其实是卡西尼恒等式 ...

  5. 如何在 ASP.Net Core 中实现 健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 ...

  6. Cai Xukun and Orz Pandas Gym - 102309C

    题目链接:https://vjudge.net/problem/Gym-102309C 题意:给定蔡徐坤投篮的位置和篮筐的位置以及最大初速度,求一个初速度和时间. 思路:一开始我以为要用到二分,后面仔 ...

  7. Hznu_0j 1557

    题目链接:http://acm.hznu.edu.cn/OJ/problem.php?id=1557 题解:将两个数组分别升序和降序排序后,累加差的绝对值. Ac代码: #include<std ...

  8. Spring基于XML的IoC

    Maven导入Spring依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...

  9. P1060_开心的金明(JAVA语言)

    思路 0/1背包问题 模板 //暴力出奇迹 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些 ...

  10. RepVGG

    RepVGG: Making VGG-style ConvNets Great Again 作者:elfin   资料来源:RepVGG论文解析 目录 1.摘要 2.背景介绍 3.相关工作 3.1 单 ...