file-type

MyBatisPlus全局Sql注入器与逻辑删除实践教程

ZIP文件

下载需积分: 49 | 27KB | 更新于2025-04-27 | 52 浏览量 | 14 下载量 举报 收藏
download 立即下载
在深入了解MyBatisPlus中全局Sql注入器的应用以及逻辑删除的使用示例代码之前,需要先介绍一下MyBatisPlus这一强大框架的基础概念,以及它的核心特性之一,逻辑删除是如何工作的。MyBatisPlus是在MyBatis基础上进行扩展的一个增强工具,它简化了代码的编写,并提供了诸如通用Mapper、条件构造器、分页插件等便利的功能,帮助开发者更高效地实现数据库交互。 ### MyBatisPlus框架概念 MyBatisPlus框架是为了解决传统MyBatis需要编写大量模板代码的问题而生。通过提供一些内置的方法和注解,MyBatisPlus使得开发者的重心可以放在业务逻辑的实现上,而不是那些重复的、繁琐的CRUD操作。 ### 全局Sql注入器 在MyBatisPlus中,Sql注入器(SqlInjector)是一个接口,其主要职责是定义一系列的SQL片段,这些SQL片段会被MyBatisPlus框架用于生成最终的SQL语句。在全局范围内自定义Sql注入器,意味着开发者可以在一个集中的地方定义SQL片段,并让所有的Mapper接口都能够使用这些自定义的SQL片段。 ### 逻辑删除 逻辑删除是数据库操作中常用的一种处理方式,用以替代物理删除,即不从数据库中彻底删除数据记录,而是在数据表中增加一个字段(例如deleted或is_deleted),通过这个字段的值来标识记录是否被逻辑上删除。逻辑删除的好处是能够保留历史数据,对于需要保留历史记录的业务场景来说,非常有用。在MyBatisPlus中,逻辑删除功能可以通过配置来启用,并且可以自定义逻辑删除的字段名称和默认值。 ### MyBatisPlus中逻辑删除使用示例代码 假设我们的数据库表中有如下结构: ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标志,0表示未删除,1表示已删除', PRIMARY KEY (`id`) ); ``` 在这个表中,我们使用了`deleted`字段作为逻辑删除的标志。现在,我们将通过MyBatisPlus实现逻辑删除,并给出示例代码。 首先,在MyBatisPlus的配置类中启用逻辑删除: ```java @Configuration @MapperScan("com.example.mapper") public class MyBatisPlusConfig { @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setSqlInjector(new LogicSqlInjector()); return globalConfig; } // 配置逻辑删除处理器 @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); } // 配置逻辑删除值 @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); paginationInterceptor.setDialectType("mysql"); paginationInterceptor.setLogicDeleteValue("1"); // 未删除 paginationInterceptor.setLogicNotDeleteValue("0"); // 已删除 return paginationInterceptor; } } ``` 在上面的配置类中,我们首先定义了一个`GlobalConfig`实例,并将其`SqlInjector`设置为`LogicSqlInjector`,这是MyBatisPlus提供的一个逻辑删除的Sql注入器实现。同时,我们也定义了`PaginationInterceptor`,这个分页拦截器可以与逻辑删除结合使用,其中的`setLogicDeleteValue`和`setLogicNotDeleteValue`方法用来设置逻辑删除和未删除的值。 接下来是实体类中逻辑删除字段的配置: ```java @Data @TableName("user") public class User { private Long id; private String name; private String email; @TableLogic private Boolean deleted; } ``` 在这里,`@TableLogic`注解被用在了`deleted`字段上,它告诉MyBatisPlus这个字段是用来控制逻辑删除的。在使用`@TableLogic`注解时,字段类型应为`Boolean`,因为MyBatisPlus默认使用`Boolean`类型来判断记录是否删除。如果是其他类型(如`Integer`或`Byte`),需要在配置类中通过`LogicSqlInjector`的`setDeletedValue`和`setNotDeletedValue`方法进行相应设置。 然后是在Mapper接口中使用逻辑删除: ```java public interface UserMapper extends BaseMapper<User> { } ``` MyBatisPlus的`BaseMapper`接口已经包含了处理逻辑删除的方法,所以不需要在自定义Mapper接口中添加额外的方法。 最后,我们在服务层调用逻辑删除的方法: ```java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public void logicDeleteUser(Long id) { this.baseMapper.deleteById(id); } } ``` 在上述示例中,我们使用了`ServiceImpl`类提供的`.deleteById`方法。这个方法内部将执行逻辑删除,将`deleted`字段的值更新为逻辑删除值(本例中为1)。 通过以上步骤,我们便成功地在MyBatisPlus项目中应用了全局Sql注入器,并且演示了如何使用逻辑删除。逻辑删除不仅可以保证数据的完整性,还可以在很多场景中避免因为直接物理删除数据带来的风险。需要注意的是,执行查询操作时,默认情况下不会返回那些已经逻辑删除的记录,除非在查询条件中明确指定包含它们。如果需要在查询时包含已逻辑删除的记录,可以使用`LambdaQueryWrapper`来进行条件构造: ```java LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getDeleted, false); List<User> users = baseMapper.selectList(queryWrapper); ``` 在上述代码中,`selectList`方法将会返回所有未逻辑删除的`User`记录。 通过以上的介绍和示例,可以看出MyBatisPlus通过全局Sql注入器和逻辑删除等高级特性,极大地方便了开发者对数据库的操作,让代码更加简洁,业务逻辑更加清晰。这仅仅是MyBatisPlus众多特性中的一部分,它还有许多其他高级功能,如自动填充、乐观锁插件、性能分析插件等,等待开发者去探索和应用。

相关推荐