Mybatis-Plus:Sql 注入器(扩展BaseMapper)

发布于:2023-01-09 ⋅ 阅读:(1233) ⋅ 点赞:(1)

本节案例承上节案例

1. Sql 注入器

Mybatis-Plus:SQL注入的原理,在Mybatis-Plus中,通过AbstractSqlInjectorBaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行。

那么,如果我们需要扩充BaseMapper中的方法,又该如何实现呢?下面我们以扩展findAll方法为例进行学习。


1.1 编写MyBaseMapper

在这里插入图片描述
MyBaseMapper.java

package com.tian.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

public interface MyBaseMapper<T> extends BaseMapper<T> {

    List<T> findAll();

    // 扩展其他的方法
}

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

如:
在这里插入图片描述


1.2 编写MySqlInjector 和 FindAll

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

MySqlInjector :

在这里插入图片描述

MySqlInjector.java

package com.tian.injectors;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;

import java.util.ArrayList;
import java.util.List;

public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList() {
        List<AbstractMethod> list = new ArrayList<>();

        // 获取父类中的集合
        list.addAll(super.getMethodList());

        // 再扩充自定义的方法
        list.add(new FindAll());

        return list;
    }
}

FindAll:

在这里插入图片描述

FindAll.java

package com.tian.injectors;

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);
    }
}

1.3 注册到Spring容器

在这里插入图片描述
MybatisPlusConfig.java
在这里插入图片描述

    /*** 自定义SQL注入器 */
    @Bean
    public MySqlInjector mySqlInjector() {
        return new MySqlInjector();
    }

1.4 测试

在这里插入图片描述
SpringbootMybatisplusApplicationTests.java

package com.tian.springbootmybatisplus;

import com.tian.mapper.UserMapper;
import com.tian.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class SpringbootMybatisplusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testFindAll() {
        List<User> users = this.userMapper.findAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

运行结果:

生成的sql为:select * from tb_user

在这里插入图片描述



本文含有隐藏内容,请 开通VIP 后查看