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