Mybatis-Plus(三)

2023-10-27

目录

1 、ActiveRecord

 1、开启AR

2 、插件

1、mybatis的插件机制

2、执行分析插件

3、性能分析插件

4、乐观锁插件

3、Sql 注入器

4、自动填充功能

5、逻辑删除

6、通用枚举

7、MybatisX 快速开发插件


1 、ActiveRecord

ActiveRecord(简称AR)一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于ActiveRecord 往往只能感叹其优雅,所以我们也在 AR 道路上进行了一定的探索,喜欢大家能够喜欢。

 1、开启AR

在MP中,开启AR非常简单,只需要将实体对象继承Model即可。

 

 

 这里不用注入UserMapper,但是不能没有UserMapper类,底层代码会用到它

 

 

 

2 、插件

1、mybatis的插件机制

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法

调用包括:

        1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

        2. ParameterHandler (getParameterObject, setParameters)

        3. ResultSetHandler (handleResultSets, handleOutputParameters)

        4. StatementHandler (prepare, parameterize, batch, update, query)

我们看到了可以拦截Executor接口的部分方法,比如update,query,commit,rollback等方法,还有其他接口的一些方法等。

总体概括为:

1. 拦截执行器的方法

2. 拦截参数的处理

3. 拦截结果集的处理

4. 拦截Sql语法构建的处理

package com.mybatis.plugins;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

@Intercepts({@Signature(
        type= Executor.class,
        method = "update",//指定拦截方法名
        args = {MappedStatement.class,Object.class})})
public class MyInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //拦截方法,具体业务逻辑编写的位置
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        //创建target对象的代理对象,目的是将当前拦截器加入到该对象中
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        //属性设置
    }
}

或者

<configuration>
  <plugins>
    <plugin interceptor="cn.itcast.mp.plugins.MyInterceptor"></plugin>
  </plugins>
</configuration>

2、执行分析插件

在MP中提供了对SQL执行的分析的插件,可用作阻断全表更新、删除的操作注意:该插件仅适用于开发环境,不适用于生产环境。

SpringBoot配置:

@Bean
    public SqlExplainInterceptor sqlExplainInterceptor(){
        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
        List<ISqlParser> sqlParserList = new ArrayList<>();
        // 攻击 SQL 阻断解析器、加入解析链
        sqlParserList.add(new BlockAttackSqlParser());
        sqlExplainInterceptor.setSqlParserList(sqlParserList);
        return sqlExplainInterceptor;
    }

 

3、性能分析插件

性能分析拦截器,用于输出每条 SQL 语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常。

该插件只用于开发环境,不建议生产环境使用

<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
            <!--最大的执行时间,毫秒-->
            <property name="maxTime" value="100"/>
            <!--对输出的SQL进行格式化,默认false-->
            <property name="format" value="true"/>
        </plugin>

 

4、乐观锁插件

当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式:

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version不对,就更新失败

spring xml:

< bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/> 

spring boot:

<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"></plugin>

第一步,为数据库表添加version字段,并且设置初始值为1: 

第二步,为User实体对象添加version字段,并且添加@Version注解:

 

 

 

 执行完后,version值自动+1

注意事项:

  • 支持的数据类型只有 :int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到  entity 中
  • 仅支持 updateById(id) 与  update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

3、Sql 注入器

我们已经知道,在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行。

那么,如果我们需要扩充BaseMapper中的方法,又该如何实现呢?

 

 FindAll

package com.mybatis.injector;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

public class FindAll extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "select * from "+tableInfo.getTableName();
        SqlSource sqlSource = languageDriver.createSqlSource(configuration,sql,modelClass);

        return this.addSelectMappedStatement(mapperClass,"findAll",sqlSource,modelClass,tableInfo);
    }
}

 

 

 

 问题:BaseMapper中的方法会失效

 

 4、自动填充功能

有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version等。在MP中提供了这样的功能,可以实现自动填充。

 

package com.mybatis.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

@Component
public class MyHandler implements MetaObjectHandler {
    //插入数据时进行填充
    @Override
    public void insertFill(MetaObject metaObject) {
        //先获取password的值,再进行判断,空就填充,不为空,就不做处理
        Object password = getFieldValByName("password", metaObject);
        if(password == null){
            setFieldValByName("password","5555",metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {

    }
}

 

5、逻辑删除

开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓逻辑删除就是将数据标记为删除,而并非真正的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除

 先给表添加deleted字段

 

#删除为1
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除为0
mybatis-plus.global-config.db-config.logic-not-delete-value=0

 

 底层执行的是update,不是delete

 

查询时

 6、通用枚举

解决了繁琐的配置,让 mybatis 优雅的使用枚举属性!

先给表添加sex字段

package com.mybatis.enums;

import com.baomidou.mybatisplus.core.enums.IEnum;

public enum  SexEnum implements IEnum<Integer> {

    MAN(1,"男"),
    WOMAN(2,"女");

    private int value;
    private String desc;

    SexEnum(int value, String desc){
        this.value = value;
        this.desc = desc;
    }

    @Override
    public Integer getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return this.desc;
    }
}

 

# 枚举包扫描
mybatis-plus.type-enums-package=com.mybatis.enums

 

 

  查询

7、MybatisX 快速开发插件

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

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

功能:

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

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis-Plus(三) 的相关文章

  • IDEA如何生成 serialVersionUID

    序列化和反序列化 Java是面向对象的语言 与其他语言进行交互 比如与前端js进行http通信 需要把对象转化成一种通用的格式比如json 前端显然不认识Java对象 从对象到json字符串的转换 就是序列化的过程 反过来 从json字符串

随机推荐

  • import-from

    1 import from可以导入什么文件 通过import from 导入时 from后的来源可以是js vue json 这个是在webpack base conf js中extensions设置的 该属性值默认是js vue json
  • 深度学习入门资料整理

    深度学习基础总结 无一句废话 附完整思维导图 深度学习如何入门 知乎 深度学习入门基础讲义 shuzfan的博客 CSDN博客 深度学习入门 神经网络15分钟入门 足够通俗易懂了吧 知乎 深度学习基础知识点梳理 知乎
  • MQ-2烟雾传感器代码(STM32单片机驱动)

    MQ 2烟雾传感器代码 STM32单片机驱动 MQ 2烟雾传感器简介 接线 三级目录 MQ 2烟雾传感器简介 MQ 2烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 SnO2 当烟雾传感器所处环境中存在可燃气体时 烟雾传感器的
  • 什么是 BFC?

    3 BFC的规则 BFC就是一个块级元素 块级元素会在垂直方向一个接一个的排列BFC就是页面中的一个隔离的独立容器 容器里的标签不会影响到外部标签垂直方向的距离由margin决定 属于同一个BFC的两个相邻的标签外边距会发生重叠计算BFC的
  • 在线吉他调音

    先看效果 图片没有声 可以下载源码看看 比这更好 再看代码 查看更多
  • 输电线路故障诊断(Python代码,逻辑回归、决策树、随机森林、XGBoost和支持向量机五种不同方法诊断)

    效果视频 输电线路故障诊断 Python代码 逻辑回归 决策树 随机森林 XGBoost和支持向量机五种不同方法诊断 哔哩哔哩 bilibili 项目文件 code py装载的是英文版本 图上显示英文标签及坐标 Chinese py装载的是
  • chisel快速入门(三)

    前一篇见此 chisel快速入门 二 沧海一升的博客 CSDN博客简单介绍了chisel 使硬件开发者能快速上手chisel https blog csdn net qq 21842097 article details 121418806
  • Windows11 WSL子系统ubuntu22.04 修改hostname

    大家都知道以往我们修改 Linux系统的 hostname只要修改 etc hostname 这个文件中的名字即可 但是在WSL中修改该文件是无法生效的 要修改Hostname并使它生效 我们必须修改 etc wsl conf 文件 编辑配
  • Anaconda环境的一些常用命令

    首先 在开始中找到Anaconda Prompt 这个窗口和cmd窗口一样的 1 查看有哪些环境 输入命令 conda info e 2 如何查看Anaconda中安装了哪些第三方库 用 conda list 或者 pip list 命令来
  • SpringBoot应用如何以优雅的方式对接老旧SSO实现单点登录逻辑

    目录 背景介绍 设计思想 登录前的时序图 登录后的时序图 back内部认证逻辑的设计 LoginFilter内部流程 JwtFilter内部流程 filter流程说明 权限校验 总结 背景介绍 我们现在开发WEB应用最流行的框架就是Spri
  • 【Java学习】-Java JDK 1.8与17版本比较

    前言 Java Development Kit JDK 是Java编程语言的开发环境 它包含了Java编译器 javac Java虚拟机 JVM 以及其他必需的工具和库 本文将比较JDK 1 8和17两个版本 分析它们的发展历史和地位 并探
  • 十二届蓝桥杯青少年Python组省赛试题

    一 选择题 第一题 设s Hello Lan Qiao 执行print s 4 11 输出的结果为 选择题严禁使用程序验证 A lo Lan Qi B lo Lan Q C o Lan Qi D o Lan Q 第二题 循环语句for i
  • Java 示例代码,它演示了如何使用 Java Swing 创建一个简单的图形用户界面(GUI)应用程序:

    import javax swing JFrame import javax swing JLabel import javax swing JButton import java awt event ActionListener impo
  • for与while的优缺点

    在循环次数已知的情况下 for循环的形式更加简洁 而循环次数无法预知时 用while循环实现更合适 用特定条件控制循环是否执行 循环体中执行的语句可能导致循环条件发生变化
  • 调试最长的一帧(第19天)

    这个主要是理论了 抄一抄 最常用到场景管理方式时场景节点树结构 场景树顶点的叶节点osg Geode包含了各种需要渲染的几何体的顶点和渲染状态信息 而组节点osg Group及其派生出的各种特殊功能节点则作为场景树的各个枝节节点 它们也可以
  • 10款在线检查英语语法的网站

    转自 https www sohu com a 239534894 655071 1 NOUNPLUS https www nounplus net grammarcheck nounplus是一个免费的语法检查网站 界面简洁流畅 并且有三
  • CentOS7下使用iptables

    系统升级到CentOS 7后总感觉iptables怪怪的 比如不管怎么保存重启后都被初始化一下 即便我最后发大绝招启动时候加命令 首先iptables save gt etc iptables rules保存当前状态 然后再在 etc rc
  • useMemo和useCallback的使用

    useMemo 功能 用来缓存数据 应用场景 当组件内部某个数据 需要通过计算而来 且这个计算依赖于state props数据时使用 好处 避免依赖项未修改时 重复渲染导致的计算 浪费计算资源 useCallback 功能 缓存单个函数 应
  • 知识图谱(含代码)

    中山大学计算机学院 人工智能 本科生实验报告 一 实验题目 编写程序 实现FOIL First Order Inductive Learner 算法 对如下给定的知识图谱和目标谓词进行规则学习 并得到新的以目标谓词为关系的事实 用一阶逻辑表
  • Mybatis-Plus(三)

    目录 1 ActiveRecord 1 开启AR 2 插件 1 mybatis的插件机制 2 执行分析插件 3 性能分析插件 4 乐观锁插件 3 Sql 注入器 4 自动填充功能 5 逻辑删除 6 通用枚举 7 MybatisX 快速开发插