17个Mybatis Plugs注解:Mybatis Plugs插件架构设计与全面注解案例

在这里插入图片描述

MyBatis Plugins框架提供了一种强大而灵活的机制,允许开发者通过实现Interceptor接口来扩展MyBatis的核心功能。这种插件化的方法无需修改MyBatis源码,即可引入诸如性能监控、日志记录、数据加密、查询缓存等额外功能。通过注解如@Intercepts、@Signature等,开发者可以精确地指定插件的介入点和行为,从而在MyBatis的数据处理流程中嵌入自定义逻辑。这种设计不仅增强了MyBatis的可定制性,也使得数据库交互更加高效和安全。MyBatis Plugins框架的引入,为构建高度可维护和可扩展的数据访问层提供了坚实的基础。

肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注

欢迎 点赞,关注,评论。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

mybatis 插件架构图

在这里插入图片描述

在这个架构图中:

  • MyBatis 框架 是核心,提供了一系列的拦截点。
  • 拦截点 定义了插件可以介入的关键步骤。
  • 插件接口 是开发者实现自定义逻辑的接口。
  • 插件链 表示多个插件按照注册顺序形成的链。
  • 执行流程 展示了MyBatis执行过程中插件的调用顺序。
  • 自定义插件 表示具体的插件实现,如性能监控、日志记录等。

1. 实体映射注解

@TableName
  • 注解作用介绍

用于将实体类与数据库表进行映射,指定实体类对应的数据库表名。

  • 注解属性介绍
    • value: 指定实体类对应的数据库表名。
  • 注解业务案例
@TableName("user_table")
public class User {
    @TableId
    private Long id;
    private String name;
    // 其他字段和方法
}
  • 注解使用效果: 使用@TableName后,MyBatis Plus会将User实体映射到数据库中的user_table表。
@TableId
  • 注解作用介绍

用于标识实体类中与数据库表的主键列对应的字段,并指定主键的生成策略。

  • 注解属性介绍
    • value: 指定主键字段名。
    • type: 指定主键生成策略。
  • 注解业务案例
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    // 其他字段和方法
}
  • 注解使用效果: 使用@TableId后,MyBatis Plus会将User实体的id字段作为主键,并且使用自动增长策略。
@TableField
  • 注解作用介绍

用于将实体类中的非主键字段与数据库表的列名进行映射,特别是当字段名与数据库列名不一致时。

  • 注解属性介绍
    • value: 指定数据库表的列名。
    • exist: 指定字段是否存在于数据库表中。
  • 注解业务案例
public class User {
    private Long id;
    @TableField("user_name")
    private String name;
    // 其他字段和方法
}
  • 注解使用效果: 使用@TableField后,MyBatis Plus会将User实体的name字段映射到数据库中的user_name列。

2. 乐观锁和逻辑删除注解

@Version
  • 注解作用介绍

用于实现乐观锁机制,通过版本号避免数据的并发冲突。

  • 注解属性介绍

无特定属性。

  • 注解业务案例
public class User {
    private Long id;
    private String name;
    @Version
    private Integer version;
    // 其他字段和方法
}
  • 注解使用效果: 使用@Version后,MyBatis Plus会在更新操作时检查版本号,确保数据的一致性。
@TableLogic
  • 注解作用介绍

用于实现逻辑删除,通过标记字段的值来实现记录的逻辑删除而非物理删除。

  • 注解属性介绍
    • value: 指定逻辑未删除的值。
    • delval: 指定逻辑删除的值。
  • 注解业务案例
public class User {
    private Long id;
    private String name;
    @TableLogic(value = "0", delval = "1")
    private Integer deleted;
    // 其他字段和方法
}
  • 注解使用效果: 使用@TableLogic后,MyBatis Plus会在查询、更新和删除操作时考虑deleted字段的值,实现逻辑删除。

3. 批量操作注解

@InsertBatch
  • 注解作用介绍

用于批量插入数据,提高数据插入的效率。

  • 注解属性介绍

无特定属性。

  • 注解业务案例
public interface UserMapper {
    @InsertBatch
    int insertBatchSelective(List<User> users);
}
  • 注解使用效果: 使用@InsertBatch后,MyBatis Plus会一次性插入多个User实体,提高插入效率。
@UpdateBatch
  • 注解作用介绍

用于批量更新数据,提高数据更新的效率。

  • 注解属性介绍

无特定属性。

  • 注解业务案例
public interface UserMapper {
    @UpdateBatch
    int updateBatchSelective(List<User> users);
}
  • 注解使用效果: 使用@UpdateBatch后,MyBatis Plus会一次性更新多个User实体,提高更新效率。
@DeleteBatch
  • 注解作用介绍

用于批量删除数据,提高数据删除的效率。

  • 注解属性介绍

无特定属性。

  • 注解业务案例
public interface UserMapper {
    @DeleteBatch
    int deleteBatchSelective(List<Long> ids);
}
  • 注解使用效果: 使用@DeleteBatch后,MyBatis Plus会一次性删除多个User实体,提高删除效率。

4. SQL解析器配置注解

@SqlParserConfig
  • 注解作用介绍

用于配置SQL解析器,如过滤参数等。

  • 注解属性介绍
    • value: 指定SQL解析器的配置。
  • 注解业务案例
public interface UserMapper {
    @SqlParserConfig(filterParams = true)
    List<User> selectUsers();
}
  • 注解使用效果: 使用@SqlParserConfig后,MyBatis Plus会根据配置过滤参数,优化SQL解析过程。
@SqlParserCustomize
  • 注解作用介绍

用于自定义SQL解析器的行为。

  • 注解属性介绍
    • value: 指定自定义SQL解析器的类。
  • 注解业务案例
public interface UserMapper {
    @SqlParserCustomize(MyCustomSqlParser.class)
    List<User> selectUsers();
}
  • 注解使用效果: 使用@SqlParserCustomize后,MyBatis Plus会使用自定义的SQL解析器处理SQL语句。
@SqlParserCount
  • 注解作用介绍

用于标记查询总数的SQL语句。

  • 注解属性介绍
    • value: 指定查询总数的SQL语句。
  • 注解业务案例
public interface UserMapper {
    @SqlParserCount("SELECT COUNT(*) FROM users")
    int countUsers();
}
  • 注解使用效果: 使用@SqlParserCount后,MyBatis Plus会执行指定的SQL语句来获取记录总数。
@SqlParserIgnore
  • 注解作用介绍

用于标记忽略SQL解析器的解析。

  • 注解属性介绍
    • value: 指定是否忽略解析。
  • 注解业务案例
public interface UserMapper {
    @SqlParserIgnore
    List<User> selectUsers();
}
  • 注解使用效果: 使用@SqlParserIgnore后,MyBatis Plus会忽略对指定方法的SQL解析,直接执行SQL语句。
@SqlParserFilter
  • 注解作用介绍

用于标记SQL解析过滤器,过滤不需要进行SQL解析的SQL语句。

  • 注解属性介绍
    • value: 指定SQL解析过滤器的类。
  • 注解业务案例
public interface UserMapper {
    @SqlParserFilter(MySqlParserFilter.class)
    List<User> selectUsers();
}
  • 注解使用效果: 使用@SqlParserFilter后,MyBatis Plus会根据过滤器过滤不需要解析的SQL语句。
@SqlParserOrder
  • 注解作用介绍

用于标记SQL解析器的执行顺序。

  • 注解属性介绍
    • value: 指定执行顺序。
  • 注解业务案例
public interface UserMapper {
    @SqlParserOrder(1)
    List<User> selectUsers();
}
  • 注解使用效果: 使用@SqlParserOrder后,MyBatis Plus会根据指定的顺序执行SQL解析器。

5. 查询排序注解

@OrderBy
  • 注解作用介绍

用于指定实体类中的字段在执行查询操作时的默认排序方式。

  • 注解属性介绍
    • value: 指定排序字段和顺序。
  • 注解业务案例
public interface UserMapper {
    @OrderBy("age DESC")
    List<User> selectUsers();
}
  • 注解使用效果: 使用@OrderBy后,MyBatis Plus会按照指定的字段和顺序对查询结果进行排序。

5. MyBatis Plugins 设计目的:

  1. 扩展性:MyBatis 作为一个成熟的持久层框架,其核心设计哲学之一是提供足够的扩展性。Plugins 机制允许开发者在不修改MyBatis源码的前提下,通过实现自定义逻辑来扩展框架的功能。
  2. 解耦:通过插件化,可以将特定的业务逻辑或通用功能与MyBatis核心代码解耦,使得框架更加灵活,便于维护和升级。
  3. 复用性:插件可以被多个项目或模块复用,这样开发者可以共享和重用代码,减少重复工作,提高开发效率。
  4. 定制化:不同的项目可能需要不同的数据处理策略,如日志记录、性能监控、数据加密等。Plugins 机制提供了一种方式来定制这些策略,而无需更改MyBatis的默认行为。
  5. 社区驱动:MyBatis 拥有一个活跃的开源社区,Plugins 机制鼓励社区成员贡献自己的插件,从而丰富了整个生态系统。
  6. 简化开发:某些常见的任务,如分页查询、缓存管理等,可以通过插件来简化开发过程,开发者无需在每个项目中重复编写相同的代码。
  7. 性能优化:通过插件,开发者可以对MyBatis的执行流程进行优化,如减少数据库访问次数、优化SQL执行计划等,从而提高应用的性能。
  8. 安全性增强:插件可以用来实施安全措施,如防止SQL注入、敏感数据脱敏等,增强应用程序的安全性。

6. MyBatis Plugins 综合性使用案例

1. 创建性能监控插件

首先,我们创建一个插件类,它实现了MyBatis的Interceptor接口:

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({
    @Signature(
        type = StatementHandler.class,
        method = "prepare",
        args = {Statement.class}
    )
})
public class PerformanceMonitorPlugin implements Interceptor {
    private long startTime;
    private long endTime;

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        startTime = System.currentTimeMillis();
        try {
            return invocation.proceed();
        } finally {
            endTime = System.currentTimeMillis();
            long executeTime = endTime - startTime;
            System.out.println("Execute Time : " + executeTime + " ms");
        }
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

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

2. 配置MyBatis使用插件

接下来,我们需要在MyBatis配置文件中注册这个插件:

<configuration>
    <plugins>
        <plugin interceptor="com.example.PerformanceMonitorPlugin"/>
    </plugins>
    <!-- 其他MyBatis配置 -->
</configuration>

3. 创建日志记录插件

我们还可以创建另一个插件来记录所有SQL查询:

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({
    @Signature(
        type = StatementHandler.class,
        method = "query",
        args = {}
    )
})
public class LoggingPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Statement statement = (Statement) invocation.getTarget();
        System.out.println("Executing SQL: " + statement.toString());
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

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

4. 注册日志记录插件

在MyBatis配置文件中注册日志记录插件:

<configuration>
    <plugins>
        <plugin interceptor="com.example.LoggingPlugin"/>
    </plugins>
    <!-- 其他MyBatis配置 -->
</configuration>

5. 使用MyBatis进行数据库操作

现在,当我们使用MyBatis执行数据库操作时,我们的插件会自动记录性能数据和SQL查询:

public interface UserMapper {
    @Select("SELECT * FROM users")
    List<User> findAllUsers();
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solomon_肖哥弹架构

你的欣赏就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值