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. cve-2018-2893 weblogic -WLS核心组件反序列化

    漏洞分析 https://www.freebuf.com/column/178103.html https://www.freebuf.com/vuls/177868.html 攻击者可以在未授权的情 ...

  2. Learn Python the Hard Way,ex37-1

    本练习为复习python的符号和关键字 关键字有: #and or False True print(1==0 and 2==0, 1==0 or 2==0) print(False) print(T ...

  3. PTE准备的时候,用英式英语还是美式英语

    我自己是按照英式英语准备的,因为PTE的题目都是英式拼写,考生在做SWT题目的时候往往会抄原文中的句子或者关键词,不自觉地就将第一个区分点写成英式的,所以后面再用美式的就会被判错. PTE写作的小分中 ...

  4. 如何使用jQuery $.post() 方法实现前后台数据传递

    基础方法为 $.post(URL,data,callback); 参数介绍: 1.URL 参数规定您希望请求的 URL. 2.data 参数规定连同请求发送的数据. 3.callback 参数是请求成 ...

  5. android 调用js,js调用android

    Java调用JavaScript   1.main.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?xml v ...

  6. Webpack 学习笔记(1) 开始

    目录 参考资料 1. 基础设定 2. 创建一个包 3. 使用配置文件完成打包命令 4. 使用 NPM Scripts 完成打包命令 参考资料 Getting Started | Webpack web ...

  7. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  8. Mybatis底层源码执行流程

    1.通过类加载器,加载了config.xml文件 2.通过SqlSessionFactoryBuilder.build(resource)这个方法进行了config.xml的解析,解析为Configu ...

  9. 删除文件--rm

    rm file         删除文件 rm -r dir      删除指定文件夹及文件夹下的所有内容 rm -rf dir     强制删除指定文件夹及文件夹下的所有内容

  10. Python是啥?为什么这么多职业人和学生就算报班也要学它?!

    嗨,大家好 这里是汐仔 首先我们先来考究一下近几年的头条和新闻. 1.早在2018年python就已经被纳入高考之一了 2.Python加入全国计算机等级考试,从2018年九月起新增为大学计算机二级考 ...