Mybatis-Plus扩展

7 MybatisX插件[扩展]

7.1 MybatisX插件介绍

MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。

安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx 搜索并安装。

功能:

  • Java 与 XML 调回跳转
  • Mapper 方法自动生成 XML

在这里插入图片描述

7.2 基于MybatisX实现逆向工程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.逻辑删除[扩展]

实际在删除数据时,为了数据留痕,一般选择逻辑删除,也就是为删除表添加逻辑删除字段,通过修改字段状态值来表示数据是否被删除;

在这里插入图片描述

案例:

为tb_user添加逻辑删除字段:

在这里插入图片描述

mp配置:

# 设置mp运行时行为
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出sqlglobal-config:db-config:logic-delete-field: deleted # 约定全局删除字段logic-delete-value: 1logic-not-delete-value: 0

调整实体类:

@Data
@NoArgsConstructor//主要用于mybatis底层反射构建user实体类对象
@AllArgsConstructor//主要是lombok基于构建者模式构建对象
@Builder
/*** 如果变的名称与实体类名称一致,该注解可省略*/
@TableName("tb_user")
public class User {//......@TableLogic//指定逻辑删除字段private Integer deleted;
}

测试

    @Testpublic void testDelete(){//根据id删除int count = userMapper.deleteById(15l);System.out.println(count);}  

输出的效果:

在这里插入图片描述

但是对应的查询如果不加添加,则删除的无法查询到:

    @Testpublic void testGetById(){User user = userMapper.selectById(15l);System.out.println(user);}

效果:

在这里插入图片描述

逻辑删除本质就是拦截sql,动态追加sql片段

​ 查询 deleted=0

​ 删除: 将sql转化成update操作;

9.乐观锁[扩展]

乐观锁就是当前操作者认为在自己操作资源的过程中,其他人操作相同资源的可能性极低,所以无需加锁,而是通过设置一个版本号来加以约束;

悲观锁:排它锁,比如synchronized关键字就是悲观锁,当前线程做操作时,不允许其它线程做操作;

乐观锁:当前线程做操作时,允许其它线程做操作,但是如果其它线程做了操作,则当前操作失败;

乐观锁在数据库中有什么优势?

​ 避免长事务场景锁定数据资源,导致其它线程操作该资源时阻塞,如果阻塞过多,那么导致数据库连接资源耗尽,进而数据库宕机了;

​ 本质上就是在操作前,先获取操作行的version版本号,然后再做前天操作,然后最后再更新这一行,更新时,给sql条件一个判断版本号的sql片段: select version,xxx from user where id=100; version=30 --> 做其他操作(20s);—> update user set xxx,version=version+1 where xxxx and version=30;

使用场景:

​ 1.业务操作周期长,如果业务整个加入事务,导致数据库资源锁定周期过长,性能降低;

​ 2.如果资源争抢过于激烈,会导致失败重试次数过多,导致性能降低;

示例:

在这里插入图片描述

实体类配置:

@Data
@NoArgsConstructor//主要用于mybatis底层反射构建user实体类对象
@AllArgsConstructor//主要是lombok基于构建者模式构建对象
@Builder
/*** 如果变的名称与实体类名称一致,该注解可省略*/
@TableName("tb_user")
public class User {//......@Versionprivate Integer version;
}

配置乐观锁拦截器:

    /*** 注册插件* @return*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){//构建mp的插件注册器bean,通过该bean可批量注册多个插件MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor();//配置乐观锁拦截器OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();//注册plusInterceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);return plusInterceptor;}

测试:

    /*** @Description 测试乐观锁*/@Testpublic void testOp(){User user = userMapper.selectById(5l);System.out.println(user);user.setName("zws777");userMapper.updateById(user);}

使用mp的乐观锁,需要先自己根据主键id查询用户信息,信息中包含了此时的version数据,然后再更新,更新时会将查询的version值作为更新条件取更新;

效果:

在这里插入图片描述

在这里插入图片描述

typora-copy-images-to: imgs


10.MP字段自动填充

10.1 背景说明

在这里插入图片描述

说明:

实际开发中有些字段存在大量的重复操作,比如create_time update_time等,需要经常在实体类中设置new Date(),比较繁琐,可以借助MP的自动填充功能

10.2 定义实体类

@TableName("tb_user")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {//指定插入时自动填充的字段@TableField(value = "create_time",fill = FieldFill.INSERT)private Date createTime;//自定插入或者更新时自动填充的字段@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)private Date updateTime;
}

10.3 配置填充规则

package com.itheima.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;/*** @author by itheima* @Date 2022/8/12* @Description*/
@Component
public class FillDataHandler implements MetaObjectHandler {/*** 定义自动填充的方法* @param metaObject*/@Overridepublic void insertFill(MetaObject metaObject) {//设置insert操作时的时间点metaObject.setValue("createTime",new Date());//设置update操作时的时间点metaObject.setValue("updateTime",new Date());}/*** 定义更新时填充的方法* @param metaObject*/@Overridepublic void updateFill(MetaObject metaObject) {//设置update操作时的时间点metaObject.setValue("updateTime",new Date());}
}

10.4 测试

更新测试:

    /*** @Description 根据主键id更新用户信息(开发最常用)*/@Testpublic void test04(){long id=12l;//把主键信息和要更新的信息封装到实体类中,设置什么值,就更新什么值,为null的属性,不做处理User user = User.builder().id(id).userName("张三丰2").age(120).build();//UPDATE tb_user SET real_name=?, age=? WHERE id=?//如何获取real_name字段的? user--->User.class--->通过反射获取userName Field字段对象---》// 获取字段上的注解对象----》value值就可获取--》real_nameint count = userMapper.updateById(user);System.out.println(count);}

插入测试:

    /*** @Description 测试插入*/@Testpublic void test02(){User user =User.builder().userName("itheima4").name("itcast4").age(14).email("itcast@itcast4.cn").password("44444").build();//插入数据int count = userMapper.insert(user);System.out.println("受影响行数:"+count);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/440101.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡下Webshell连接思路及难点

君衍. 一、应用场景二、环境搭建三、思路以及难点1、查看内部结构2、查看webshell3、使用蚁剑进行连接4、难点1 shell文件上传问题5、难点2 命令执行时飘逸6、难点3 大工具上传失败7、难点4 脚本失效 四、解决方式1、关闭对方节点服务器2、基于IP地址判断是否执行3、脚本实现流…

c#窗体捕捉方向键

方法1 实现方法参考代码: private void Form1_Load(object sender, EventArgs e){this.KeyPreview true;}protected override bool ProcessDialogKey(Keys keyData){if (keyData Keys.Left || keyData Keys.Right || keyData Keys.Up || keyData Keys.Down){s…

Linux下安装edge

edge具有及其强大的功能,受到很多人的喜爱,它也开发Linux版本,下面是安装方法: 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令(后面是安装…

【计算机网络】——TCP协议

📑前言 本文主要是【计算机网络】——传输层TCP协议的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句…

【2023地理设计组一等奖】基于GIS的桥梁隧道三维建模与可视化

作品介绍 1 设计背景和意义 随着我国基础建设规模不断扩大和深入,构建桥梁可视化管理模型,全面推动智慧桥梁,已成为现代隧道桥梁建设行业的发展趋势。传统的桥梁建模工作需要复杂的算法设计并需要熟练编程实践技能,实现周期长。开发自主知识版权的桥梁建模软件系统或专用插…

AI嵌入式K210项目(23)-人脸检测

文章目录 前言一、实验准备二、实验步骤总结 前言 本章使用预训练好的模型,进行人脸检测,将摄像头采集的画面分析,比对模型,如果有人脸则框出来,并打印相关信息。 一、实验准备 请先将模型文件导入内存卡上&#xf…

装机打不开BIOS怎么办?如何进入Windows10的BIOS页面,如何关闭快速启动

电脑有快速启动,想进去BIOS页面非常困难,在临开机的页面,按触发按键不管用。 然后我看到了一种新的进入BIOS的方式: (1)win8以上的系统,按住shift,然后鼠标点击重启,再…

Softmax分类器

文章目录 回顾使用Sigmoid构建多分类器? SoftMax函数交叉熵损失函数例子 MINIST多分类器数据集步骤实现1.数据集2.构建模型3.构建损失函数和优化器4. 训练和测试 完整代码 回顾 上节课利用糖尿病数据集做了二分类任务 MNIST数据集有10个类别我们又该如何进行分类呢…

java反射常用方法

反射思维导图 使用案例 package Reflection.Work.WorkTest01;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays;public class WorkDe…

基于数字签名技术的挑战/响应式认证方式

挑战/响应式认证方式简便灵活,实现起来也比较容易。当网络需要验证用户身份时,客户端向服务器提出登录请求;当服务器接收到客户端的验证请求时,服务器端向客户端发送一个随机数,这就是这种认证方式的“冲击&#xff08…

java学习之路(2)-编译java文件运行Java文件

创建.java后缀文本文件HelloWorld .java 写入代码: public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); } } 运行cmd命令 找到代码所在目录 输入javac编译Java文件生成HelloWorld.class 编译:…

Spring Security简介

什么是Spring Security Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我 们来简化认证和授权的过程。 官网&#xff1a;Spring Security 对应的maven坐标&#xff1a; <!--security启动器--> <dependency><groupId>or…