MyBatis Plugins框架提供了一种强大而灵活的机制,允许开发者通过实现Interceptor接口来扩展MyBatis的核心功能。这种插件化的方法无需修改MyBatis源码,即可引入诸如性能监控、日志记录、数据加密、查询缓存等额外功能。通过注解如@Intercepts、@Signature等,开发者可以精确地指定插件的介入点和行为,从而在MyBatis的数据处理流程中嵌入自定义逻辑。这种设计不仅增强了MyBatis的可定制性,也使得数据库交互更加高效和安全。MyBatis Plugins框架的引入,为构建高度可维护和可扩展的数据访问层提供了坚实的基础。
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- 28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)
- Java 8函数式编程全攻略:43种函数式业务代码实战案例解析(收藏版)
- 69 个Spring mvc 全部注解:真实业务使用案例说明(必须收藏)
- 24 个Spring bean 全部注解:真实业务使用案例说明(必须收藏)
- MySQL索引完全手册:真实业务图文讲解17种索引运用技巧(必须收藏)
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
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 设计目的:
- 扩展性:MyBatis 作为一个成熟的持久层框架,其核心设计哲学之一是提供足够的扩展性。Plugins 机制允许开发者在不修改MyBatis源码的前提下,通过实现自定义逻辑来扩展框架的功能。
- 解耦:通过插件化,可以将特定的业务逻辑或通用功能与MyBatis核心代码解耦,使得框架更加灵活,便于维护和升级。
- 复用性:插件可以被多个项目或模块复用,这样开发者可以共享和重用代码,减少重复工作,提高开发效率。
- 定制化:不同的项目可能需要不同的数据处理策略,如日志记录、性能监控、数据加密等。Plugins 机制提供了一种方式来定制这些策略,而无需更改MyBatis的默认行为。
- 社区驱动:MyBatis 拥有一个活跃的开源社区,Plugins 机制鼓励社区成员贡献自己的插件,从而丰富了整个生态系统。
- 简化开发:某些常见的任务,如分页查询、缓存管理等,可以通过插件来简化开发过程,开发者无需在每个项目中重复编写相同的代码。
- 性能优化:通过插件,开发者可以对MyBatis的执行流程进行优化,如减少数据库访问次数、优化SQL执行计划等,从而提高应用的性能。
- 安全性增强:插件可以用来实施安全措施,如防止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();
}
标签:插件,MyBatis,Plus,SQL,Mybatis,注解,Plugs,public
From: https://blog.csdn.net/alises1314/article/details/142107659