我们已经知道,在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行。
那么,如果我们需要扩充BaseMapper中的方法,有该如何实现呢?
下面我们以扩展findAll方法为例进行学习。
1、编写MyBaseMapper
-
/*
-
通用mapper接口,以后创建其他mapper接口时,不再继承BaseMapper,而是继承MyBaseMapper
-
*/
-
public interface MyBaseMapper<T> extends BaseMapper<T> {
-
-
/*
-
查询所有用户
-
*/
-
public List<User> findAll();
-
}
其他的Mapper都可以继承该Mapper,这样实现了统一的扩展。
如:
-
public interface UserMapper extends MyBaseMapper<User> {
-
/*
-
自定义findById方法
-
*/
-
public User findById(Long id);
-
}
2、编写MySqlInjector
如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,所以我们选择继承DefaultSqlInjector进行扩展。
-
/*
-
自定义sql注入器
-
*/
-
public class MySqlInjector extends DefaultSqlInjector {
-
@Override
-
public List<AbstractMethod> getMethodList() {
-
-
List<AbstractMethod> methodList = super.getMethodList();
-
// 扩充自定义方法
-
(new FindAll());
-
return methodList;
-
}
-
}
3、编写FindAll
-
public class FindAll extends AbstractMethod {
-
@Override
-
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
-
-
String sql = "select * from " + ();
-
SqlSource sqlSource = (configuration, sql, modelClass);
-
return this.addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo);
-
-
}
-
}
4、注册到Spring容器
-
/*
-
自定义的sql注入器
-
*/
-
-
@Bean
-
public MySqlInjector mySqlInjector(){
-
return new MySqlInjector();
-
}
5、测试
-
@Test
-
public void testFindAll(){
-
List<User> users = this.();
-
for (User user : users) {
-
(user);
-
}
-
}
输出的SQL:
[main] []-[DEBUG] ==> Preparing: select
* from tb_user
[main] []-[DEBUG] ==> Parameters:
[main] []-[DEBUG] <== Total: 10
至此,我们实现了全局扩展SQL注入器。