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. 在 TypeScript 中,extends

    extends 是一个关键字,用于指定类型参数的约束.它在类型参数的声明中使用,以确保类型参数满足特定的条件. 具体来说,extends 后面可以跟随一个类型,表示类型参数必须是该类型的子类型.在泛型 ...

  2. [SHOI2011]双倍回文 题解

    [SHOI2011]双倍回文 题解 看了一些写回文自动机的大佬的代码,我深感敬畏,于是我转身向Manacher走去 现在荣登最优解第一页-- 说实话,这个方法的复杂度是很玄学的,但是加了一些优化之后, ...

  3. 你知道键盘是如何工作的吗?(xv6键盘驱动程序)

    键盘驱动程序 公众号:Rand_cs 键盘如何工作的前文曾经说过,当时是以 Linux 0.11 为基础讲的但不系统,本文以 xv6 的键盘驱动程序为例来系统地讲述键盘是如何工作的.关于驱动程序前文磁 ...

  4. C#.NET 读取PFX私钥证书并导出PEM格式私钥

    项目nuget引用 BouncyCastle. 读取证书 X509Certificate2 x509 = new X509Certificate2(lblPfxPath.Text, txtPfxPwd ...

  5. TypeAdapter处理Gson解析,null值替换为"",null值替换为[]

    前言 在与后端对接过程中,常常会出现因为后端不规范,导致某些String字段有时传null,有时传"".但我们在对接时并不知道哪些可能为空,他到底会传啥,总不能将Bean类中的所有 ...

  6. mongodb QuickStart Demo

    import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.cl ...

  7. OpenCV + sklearnSVM 实现手写数字分割和识别

    这学期机器学习考核方式以大作业的形式进行考核,而且只能使用一些传统的机器学习算法. 综合再三,选择了自己比较熟悉的MNIST数据集以及OpenCV来完成手写数字的分割和识别作为大作业. 1. 数据集准 ...

  8. Pycharm import faker 和 colorlog提示“No module name faker/colorlog”

    问题: Pycharm import faker / colorlog,下划线爆红,提示"No module name faker/colorlog" 排查,检查pycharm 该 ...

  9. 简约-Markdown教程

    ##注意 * 两个元素之间最好有空行 * 利用\来转义 我是一级标题 ==== 我是二级标题 ---- #我是一级标题 ##我是二级标题 ##<center>标题居中显示</cent ...

  10. 2019 香港区域赛 BDEG 题解

    B.Binary Tree 题意:给你一棵二叉树.有两个游戏者,回合制,他们每次可以删去这棵二叉树中的一棵满二叉树.求最后谁赢. 解法:每一棵满二叉树有奇数个节点,那么每次游戏者只能删去奇数个节点,所 ...