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. react 过渡动画组件

    在项目中可能会有一些动画效果展示或是页面切换效果,css动画的方式,比较局限,涉及到一些js动画的时候没法处理了.react-transition-group是react的第三方模块,借住这个模块可以 ...

  2. CSP-S2019 江西 题解

    为什么有 \(5\) 道题? [CSP-S2019 江西] 和积和 简单化一下式子: \[(n + 1) \times \sum A_i \times B_i - (\sum A_i) \times ...

  3. ETL工具-nifi干货系列 第六讲 处理器JoltTransformJSON

    1.处理器作用 使用Jolt转换JSON数据为其他结构的JSON,成功的路由到'success',失败的'failure'.处理JSON的实用程序不是基于流的,因此大型JSON文档转换可能会消耗大量内 ...

  4. leetcode-3-无重复字符的最长子串-javascript

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  5. 2020年你不可不知的自动化框架,可替代Selenuim的测试框架Top10

    Selenium是一种开源自动测试工具.它可以跨不同的浏览器和平台在Web应用程序上执行功能,回归,负载测试.Slenium是最好的工具之一,但确实有一些缺点. 业界有一些强大的工具可以替代Selen ...

  6. 《软件性能测试分析与调优实践之路》第二版-手稿节选-Mysql数据库性能定位与分析

    在做MySQL数据的性能定位前,需要先知道MySQL查询时数据库内部的执行过程.只有弄清SQL的执行过程,才能对执行过程中的每一步的性能做定位分析.如图6-2-1所示. 图6-2-1 从图中可以看到, ...

  7. docker制作springboot镜像

    以下步骤在具有Docker环境的Linux机器上操作. 把springboot-1.0.0.jar放到/usr/local/springboot目录下,并在该目录下创建Dockerfile文件,内容为 ...

  8. Vulnhub Fall Walkthrough

    Recon 二层本地扫描,发现目标靶机. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 Currently scanning: ...

  9. 行为型模式(Behavioer Pattern)

    行为型设计模式 行为型模式定义了系统中对象之间的交互与通信,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责,包括对系统中较为复杂的流程的控制. 在软件系统运行时对象并不是孤立存在的,它 ...

  10. Spring手动获取bean的四种方式

    一.实现BeanFactoryPostProcessor接口 @Component public class SpringUtil implements BeanFactoryPostProcesso ...