MybatisPlus 之 Sql 注入器

时间:2025-04-03 16:38:42

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

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

下面我们以扩展findAll方法为例进行学习。

1、编写MyBaseMapper

  1. /*
  2. 通用mapper接口,以后创建其他mapper接口时,不再继承BaseMapper,而是继承MyBaseMapper
  3. */
  4. public interface MyBaseMapper<T> extends BaseMapper<T> {
  5. /*
  6. 查询所有用户
  7. */
  8. public List<User> findAll();
  9. }

其他的Mapper都可以继承该Mapper,这样实现了统一的扩展。

如:

  1. public interface UserMapper extends MyBaseMapper<User> {
  2. /*
  3. 自定义findById方法
  4. */
  5. public User findById(Long id);
  6. }

2、编写MySqlInjector

        如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,所以我们选择继承DefaultSqlInjector进行扩展。

  1. /*
  2. 自定义sql注入器
  3. */
  4. public class MySqlInjector extends DefaultSqlInjector {
  5. @Override
  6. public List<AbstractMethod> getMethodList() {
  7. List<AbstractMethod> methodList = super.getMethodList();
  8. // 扩充自定义方法
  9. (new FindAll());
  10. return methodList;
  11. }
  12. }

3、编写FindAll

  1. public class FindAll extends AbstractMethod {
  2. @Override
  3. public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
  4. String sql = "select * from " + ();
  5. SqlSource sqlSource = (configuration, sql, modelClass);
  6. return this.addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo);
  7. }
  8. }

4、注册到Spring容器

  1. /*
  2. 自定义的sql注入器
  3. */
  4. @Bean
  5. public MySqlInjector mySqlInjector(){
  6. return new MySqlInjector();
  7. }

5、测试

  1. @Test
  2. public void testFindAll(){
  3. List<User> users = this.();
  4. for (User user : users) {
  5. (user);
  6. }
  7. }

输出的SQL:

[main] []-[DEBUG] ==> Preparing: select
* from tb_user
[main] []-[DEBUG] ==> Parameters:
[main] []-[DEBUG] <== Total: 10

至此,我们实现了全局扩展SQL注入器。