2021年7月21日 14点05分

看尚硅谷新讲的尚医通,这个MP的文档多了新东西:

依赖版本:

springBoot版本  2.2.1.RELEASE

<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.3.1</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

但是拉下来Spring报错,死活找不到版本

我这里干脆换版本了:

<?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.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.atguigu</groupId>
<artifactId>mybatis_plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis_plus</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.4.1</version>
</dependency>
<!--mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

一、自动填充

package com.atguigu.mybatis_plus.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import java.util.Date; @Data
public class User { @TableId(type = IdType.ASSIGN_ID) // 默认雪花算法的主键策略 @TableId(type = IdType.AUTO) 自增策略
private Long id;
private String name;
private Integer age;
private String email; // 自动填充注解? 需要实现 元对象处理器接口,自定义实现方法
@TableField(value = "createTime", fill = FieldFill.INSERT)
private Date createTime; //create_time @TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

元对象处理器接口实现:

package com.atguigu.mybatis_plus.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component; import java.util.Date; /**
* 自动填充
* 需求描述:
* 项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
* 我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作
* 1.1数据库修改
* 在User表中添加datetime类型的新的字段 create_time、update_time
*
*
*/
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
this.setFieldValByName("recordVersion", 1, metaObject);
} @Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
} }

二、乐观锁

项目里面的持久层框架时ActiveJdbc,有这样的应用场景,但是框架这块没提供相关的封装

实现是人肉代码完成,程序逻辑有一点点封装

MP这里就配置一下就行了

package com.atguigu.mybatis_plus.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import java.util.Date; @Data
public class User { @TableId(type = IdType.ASSIGN_ID) // 默认雪花算法的主键策略 @TableId(type = IdType.AUTO) 自增策略
private Long id;
private String name;
private Integer age;
private String email; // 自动填充注解? 需要实现 元对象处理器接口,自定义实现方法
@TableField(value = "createTime", fill = FieldFill.INSERT)
private Date createTime; //create_time @TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 乐观锁
* 场景
* 主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
* 乐观锁实现方式:
* 取出记录时,获取当前version
* 更新时,带上这个version
* 执行更新时, set version = newVersion where version = oldVersion
* 如果version不对,就更新失败
* 接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:
*/
@Version
@TableField(value = "recordVersion", fill = FieldFill.INSERT) // 设置默认值
private
Integer recordVersion; @TableLogic
private Integer deleted; // ALTER TABLE `user` ADD COLUMN `deleted` boolean DEFAULT false }

编写配置类:

package com.atguigu.mybatis_plus.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
@MapperScan("com.atguigu.mybatis_plus.mapper")
public class MybatisPlusConfiguration {
/**
* 乐观锁插件 已过时对象写法
*/
// @Bean
// public OptimisticLockerInterceptor optimisticLockerInterceptor() {
// return new OptimisticLockerInterceptor();
// }

/**
* 分页插件
* 已过时?
*/
// @Bean
// public PaginationInterceptor paginationInterceptor() {
// return new PaginationInterceptor();
// } @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
// mp插件接口
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor;
} }

乐观锁测试:

    // 乐观锁案例
@Test
void testingForOptimisticLocker() {
// 首先插入一条记录,检查是否自动插入RecordVersion
User user = new User();
user.setAge(24);
user.setName("小红");
user.setEmail("21312qasdq@qq.com");
int insert = userMapper.insert(user); // 然后使用ID查询, 更改这条记录, 检查版本会不会更改为2
User user1 = userMapper.selectById(user.getId()); // 不确定这样能否有效获取ID, 建议从库里拿数据写死
user1.setName("新小红");
userMapper.updateById(user1);
}

三、支持逻辑删除

package com.atguigu.mybatis_plus.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import java.util.Date; @Data
public class User { @TableId(type = IdType.ASSIGN_ID) // 默认雪花算法的主键策略 @TableId(type = IdType.AUTO) 自增策略
private Long id;
private String name;
private Integer age;
private String email; // 自动填充注解? 需要实现 元对象处理器接口,自定义实现方法
@TableField(value = "createTime", fill = FieldFill.INSERT)
private Date createTime; //create_time @TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 乐观锁
* 场景
* 主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
* 乐观锁实现方式:
* 取出记录时,获取当前version
* 更新时,带上这个version
* 执行更新时, set version = newVersion where version = oldVersion
* 如果version不对,就更新失败
* 接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:
*/
@Version
@TableField(value = "recordVersion", fill = FieldFill.INSERT) // 设置默认值
private Integer recordVersion; @TableLogic
private Integer deleted; // ALTER TABLE `user` ADD COLUMN `deleted` boolean DEFAULT false }

配置文件相关定义:

spring:
datasource:
url: jdbc:mysql://localhost:3308/atguigu-syt?serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456 #mybatis日志
mybatis-plus:
global-config:
db-config:
id-type: auto #全局设置主键生成策略 # 设置逻辑删除值标准 (默认值)
logic
-delete-value: 1
logic-not-delete-value: 0
configuration: # 日志输出标准
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

测试类的单元方法:

    /**
* 2、逻辑删除
* 2.1物理删除和逻辑删除
* 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
* 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
*
* 逻辑删除的使用场景:
* 可以进行数据恢复
* 有关联数据,不便删除
*
* 2.2 逻辑删除实现流程
* 2.2.1数据库修改
* 添加 deleted字段
* ALTERTABLE `user` ADD COLUMN `deleted` boolean DEFAULT false
*
* 2.2.2实体类修改
* 添加deleted 字段,并加上 @TableLogic 注解
* @TableLogic
* private Integer deleted;
*
* 2.2.3配置(可选)
* application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无
* mybatis-plus.global-config.db-config.logic-delete-value=1
* mybatis-plus.global-config.db-config.logic-not-delete-value=0
*
* 2.2.4 测试
* 测试后发现,数据并没有被删除,deleted字段的值由0变成了1
* 测试后分析打印的sql语句,是一条update
* 注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
* @Test
* public void testLogicDelete() {
* int result = userMapper.deleteById(1L);
* system.out.println(result);
* }
*
* 2.2.5测试逻辑删除后的查询
* MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断
* @Test
* public void testLogicDeleteSelect() {
* List<User> users = userMapper.selectList(null);
* users.forEach(System.out::println);
* }
*
*
*/
@Test
public void testingForLogicDelete() {
userMapper.deleteById(1);
/**
* ==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
* ==> Parameters: 1(Integer)
* <== Updates: 1
*/ List<User> users = userMapper.selectList(null);
/**
* ==> Preparing: SELECT id,name,age,email,createTime,updateTime,recordVersion,deleted FROM user WHERE deleted=0
* ==> Parameters:
* <== Columns: id, name, age, email, createTime, updateTime, recordVersion, deleted
* <== Row: 2, Jack, 20, test2@baomidou.com, null, null, null, 0
* <== Row: 3, Tom, 28, test3@baomidou.com, null, null, null, 0
* <== Row: 4, Sandy, 21, test4@baomidou.com, null, null, null, 0
* <== Row: 5, Billie, 24, test5@baomidou.com, null, null, null, 0
* <== Row: 1417674045524021250, lucy, 20, 1243@qq.com, null, null, null, 0
* <== Row: 1417680764933292034, 王五AAA, 20, 1243@qq.com, 2021-07-21 11:00:08, 2021-07-21 11:01:07, 2, 0
* <== Total: 6
*/

users.forEach(System.out::println);
}

【MybatisPlus】再补充内容的更多相关文章

  1. 关于激活Bentley软件详细步骤介绍(再补充一个)

    在安装完ContextCapture软件之后,大家怀着迫不及待的心情双击了运行快捷键.但是很遗憾的是,会产生下面的提示窗口: 也许大家并不在意,就觉得关掉这个窗口不就行了.然而,头疼的问题来了.这个窗 ...

  2. 《Hey程序员 你适合加入创业公司吗?》再补充

    笔者经过多年的走访发现,不是所有优秀的程序员都能在创业公司如鱼得水.根据笔者的经验,具备下面几点优秀品质的程序员会更容易适应创业公司的环境. 1.娴熟的调试技巧可以说,程序员的大部分时间都花在调试程序 ...

  3. Java学习笔记16(面向对象九:补充内容)

    总是看到四种权限,这里做一个介绍: 最大权限是public,后面依次是protected,default,private private修饰的只在本类可以使用 public是最大权限,可以跨包使用,不 ...

  4. Python学习---JSON补充内容[中文编码 + dumps解析]

    JSON补充内容[微信解决中文乱码,接上] import json # 英文显示 dic = {"hello": "world"} str = json.dum ...

  5. Java补充内容

      在第一个Java程序中已经提到一些基本的知识点,这里再补充几点. 1. 成员变量和局部变量的区别 成员变量:成员变量定义在类中,默认初始值为0,定义时可以不初始化,在整个类中可见. 局部变量:局部 ...

  6. 页面预加载loading动画,再载入内容

    默认情况下如果网站请求速度慢,所以会有一段时间的空白页面等等,用户体验效果不好,见到很多的页面都有预加载的效果,加载之前先加载一个动画,后台进程继续加载页面内容,当页面内容加载完之后再退出动画显示内容 ...

  7. JVM 专题五:类加载子系统(三)补充内容

    3. 补充内容 3.1 在jvm中表示两个class对象是否为同一个类的两个必要条件 类的完整类名必须一致,包括包名. 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同 ...

  8. day 34 编程之补充内容

    生产消费者模型(必须要理解并且牢记,默写内容): from multiprocessing import Process,Queue import time,random,os def procduc ...

  9. 一起做RGB-D SLAM(8) (关于调试与补充内容)

    “一起做”系列完结后,我收到不少同学给我的反馈.他们提了一些在程序编译/运行过程中的问题.我把它们汇总起来,组成了这个“补充篇”.你也可以看成是一个Q&A. Q: OpenCV的版本?A: 我 ...

  10. Linux入门进阶第四天(下)——程序管理(补充内容)

    1.PID 触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置. 同一个程序 ...

随机推荐

  1. Vue简单自定义Canvas验证码组件。

    在您的Vue项目中,是否曾遇到过需要增加验证码来增强账户安全性的情况?这个Vue通用Canvas验证码组件!采用Canvas,实现了高度自定义和灵活的验证码生成方式,让您的网站或应用轻松应对各类验证码 ...

  2. undefined和null js数据类型转换自动转换布尔类型

    基本数据类型之undefined和null undefined是表示未找到,是变量没有正确赋值数据时,生成的数据类型 var int : console.log(int)//undefined nul ...

  3. react mock数据

    为什么要做假数据,因为后端开发接口没有哪么快,此时就需要自己来模拟请求数据. 模拟的数据字段,需要和后端工程师沟通. 创建所需数据的json文件 json-server 此命令可以帮助我们快速创建一个 ...

  4. 一文搞懂 ARM 64 系列: 一文搞懂 ARM 64 系列: 函数调用传参与返回值

    函数调用涉及到传参与返回值,下面就来看下ARM 64中,参数与返回值的传递机制. 1 整数型参数传递 这里的整数型并不单指int类型,或者NSInteger类型,而是指任何能够使用整数表示的数据类型, ...

  5. (四)基于multiprocessing.dummy线程池爬取梨视频的视频信息

    功能:爬取梨视频科技栏最热的几个视频.  1. 找到视频对应的通用标签 可以看出关于视频的信息都存放在li标签中 2. 拿到视频的名称以及对应的url 3.进入Video的url,找到视频信息的地址 ...

  6. 《Android开发卷——ListView嵌套GridView(基础)》

      listview嵌套gridview,最主要应该解决的问题是listview跟GridView的滑动问题.这个利用GridView是自定义的,就是让GridView内容有多大就显示多大,然后禁用他 ...

  7. mysql中常用的三种插入数据的语句

    mysql中常用的三种插入数据的语句: insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错: replace into表示插入替换数据,需求表中有Prim ...

  8. 3个线程分别交替输出xyz字符,输出10遍

    一位群友分享的**公司面试题 3个线程分别交替输出xyz字符,输出10遍 public class XYZ implements Runnable { private static AtomicInt ...

  9. nordic——long range测试

    简介:本案例测试了long range,注意nrf52系列芯片中,部分硬件是不支持CADE的,也就是不支持long range,如nrf52832就不支持long range.同时协议栈也是部分支持, ...

  10. JS模拟循环批量请求后台接口

    使用async, await处理异步请求.用Promise, setTimeout函数模拟后台接口 <!DOCTYPE html> <html> <script type ...