【MybatisPlus】再补充内容
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】再补充内容的更多相关文章
- 关于激活Bentley软件详细步骤介绍(再补充一个)
在安装完ContextCapture软件之后,大家怀着迫不及待的心情双击了运行快捷键.但是很遗憾的是,会产生下面的提示窗口: 也许大家并不在意,就觉得关掉这个窗口不就行了.然而,头疼的问题来了.这个窗 ...
- 《Hey程序员 你适合加入创业公司吗?》再补充
笔者经过多年的走访发现,不是所有优秀的程序员都能在创业公司如鱼得水.根据笔者的经验,具备下面几点优秀品质的程序员会更容易适应创业公司的环境. 1.娴熟的调试技巧可以说,程序员的大部分时间都花在调试程序 ...
- Java学习笔记16(面向对象九:补充内容)
总是看到四种权限,这里做一个介绍: 最大权限是public,后面依次是protected,default,private private修饰的只在本类可以使用 public是最大权限,可以跨包使用,不 ...
- Python学习---JSON补充内容[中文编码 + dumps解析]
JSON补充内容[微信解决中文乱码,接上] import json # 英文显示 dic = {"hello": "world"} str = json.dum ...
- Java补充内容
在第一个Java程序中已经提到一些基本的知识点,这里再补充几点. 1. 成员变量和局部变量的区别 成员变量:成员变量定义在类中,默认初始值为0,定义时可以不初始化,在整个类中可见. 局部变量:局部 ...
- 页面预加载loading动画,再载入内容
默认情况下如果网站请求速度慢,所以会有一段时间的空白页面等等,用户体验效果不好,见到很多的页面都有预加载的效果,加载之前先加载一个动画,后台进程继续加载页面内容,当页面内容加载完之后再退出动画显示内容 ...
- JVM 专题五:类加载子系统(三)补充内容
3. 补充内容 3.1 在jvm中表示两个class对象是否为同一个类的两个必要条件 类的完整类名必须一致,包括包名. 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同 ...
- day 34 编程之补充内容
生产消费者模型(必须要理解并且牢记,默写内容): from multiprocessing import Process,Queue import time,random,os def procduc ...
- 一起做RGB-D SLAM(8) (关于调试与补充内容)
“一起做”系列完结后,我收到不少同学给我的反馈.他们提了一些在程序编译/运行过程中的问题.我把它们汇总起来,组成了这个“补充篇”.你也可以看成是一个Q&A. Q: OpenCV的版本?A: 我 ...
- Linux入门进阶第四天(下)——程序管理(补充内容)
1.PID 触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置. 同一个程序 ...
随机推荐
- C语言打印数字前补0
1.要求说明 例如有个数据为a = 0x10,要求打印输出为0x000010. 2.实现 1 #include <stdio.h> 2 3 4 int main() 5 { 6 int a ...
- react 网络请求 axios
react中通过npm来安装axios扩展 cnpm i -S axios 发起请求 import React, { Component } from 'react' import axios fro ...
- 反外挂 DDos UDP 攻击只需客户端 开着游戏客户端
#include<WINSOCK2.H> #include<iostream> #include<string> using namespace std; #inc ...
- Mysql RC/RR隔离原理和区别 不可重复读和可重复读
Mysql RC/RR隔离原理和区别 不可重复读和可重复读 mysql四种隔离级别:1.未提交读(READ UNCOMMITED)脏读2.已提交读 (READ COMMITED)简称(RC) 不可重复 ...
- Service Mesh技术详解
深入探讨Service Mesh的基本概念和核心技术,涵盖了服务发现.负载均衡.断路器与熔断机制,以及数据平面与控制平面的详细工作原理和实现方法. 关注作者,复旦博士,分享云服务领域全维度开发技术.拥 ...
- 京东云上centos8.2 安装 consul1.11.1
做个笔记下 -- 前言 部分内容有参考网友的,但是地址不记得了! 安装内容基本参考官网的和上一个网友的 官网地址: https://www.consul.io/downloads 以下是使用root方 ...
- HarmonyOS SDK助力中国建设银行探索金融领域创新场景
今年年初,中国建设银行(以下简称建行)手机银行首批适配HarmonyOS NEXT,并高效实现其应用的核心功能迁移.同时,建行手机银行在HarmonyOS SDK的加持下,充分发挥鸿蒙原生应用在原生智 ...
- VUE中watch的详细使用教程
1.watch是什么? watch:是vue中常用的侦听器(监听器),用来监听数据的变化 2.watch的使用方式如下 watch: { 这里写你在data中定义的变量名或别处方法名: { han ...
- TI AM64x工业核心板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)
1 核心板简介 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F设计的多核工业级核心 ...
- 组件中 data 为什么是一个函数?
如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,对象没有自己的作用域,只有当两个实例拥有自己的作用域时,才不会相互干扰. 这是因为JavaScript的特性所导致 ...