mybatis-plus自定义sql注入器

mybatis-plus:自定义sql注入器

虽然mybats-plus的BaseMapper提供了非常好用,非常多的方法,但是如果我们需要扩充BaseMapper中的方法又该如何实现呢

以findAll方法为例

新建一个spring-boot项目 引入mybatis-plus依赖

在com.mp.Mapper包中新建MyBaseMapper接口

/**
 *创建自己的BaseMapper,指定泛型;添加一个findAll方法;
 */

public interface MyBaseMapper<T> extends BaseMapper<T> {
    List<T> findAll();
}

新建一个AutoMapper接口继承MyBaseMapper接口

/**
 * Mapper接口
 */
@Mapper
public interface AutoMapper extends MyBaseMapper<Car> {

}

该接口作为mapper接口与Controller交互

新建sqlInjector包编写自定义的sql注入器:MySqlInjector

/**
 * 继承DefaultSqlInjector类,可以获取到BaseMapper原有的方法;
 * 重写getMethodList方法;添加自己的方法;
 */

public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        //把自己的方法实例添加到集合;
        // 需要是参照MP的方法写FindAll类(sql语句封装为MappedStatement);
        methodList.add(new FindAll());
        return methodList;

    }
}

在sqlInjector包下创建FindAll类(参考SelectList类来写)

**
 * 自定义findAll查询方法的封装类;
 * 参照MP的方法写FindAll类(sql语句封装为MappedStatement)*/

public class FindAll extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sqlMethod = "findAll";//方法名
        String sql = "select * from " + tableInfo.getTableName();//sql语句
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
        return this.addSelectMappedStatementForTable(mapperClass, sqlMethod, sqlSource, tableInfo);
        
    }
}

在spring-boot启动类中注册到spring容器

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

在测试类中测试

//测试自己定义的findAll方法
@Test
void testFindAll(){
    List<Car> all = autoMapper.findAll();
    all.forEach(System.out::println);
}

你可能感兴趣的:(笔记)