前言
最后一章辣!!!jiajiajiajiajiajai
这个是自己学习时候记得笔记要是想详细了解可以去MP官网,上边有更详细的配置流程以及视频教学:MyBatis-Plus
概念
Mp的BaseMapper提供了很多方法,但这些方法可能不够使用,所以可以创建自定义方法
步骤
- 新建类 extends AbstractMethod
实现injectMappedStatement方法,在这个方法中自定义执行接口
public class DeleteAllMethod extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
// 自定义方法
// 1. 自定义sql语句
String sql = "delete from "+tableInfo.getTableName();
// 2. 定义在Mapper接口中方法名
String methodName = "deleteAll";
// 3. 创建sql源
SqlSource sqlSource = languageDriver.createSqlSource(configuration,sql,modelClass);
// 4. 返回方法
return addDeleteMappedStatement(mapperClass,methodName,sqlSource);
}
}
- 创建SQL注入器 extends Default
@Component
public class MySQLInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
// 1. 获取父级创建的方法
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
// 2. 将自定义方法放到列表中
methodList.add(new DeleteAllMethod());
// 3. 返回
return methodList;
}
}
- 在对应的Mapper中创建该方法
/**
* 删除所有
* @return 影响行数
*/
int deleteAll();
- 进行调用
public void deleteAll(){
System.out.println("影响行数: "+typeMapper.deleteAll());
}
执行结果(执行删除而不是逻辑删除)
提出问题
(以删除为例子)如果要删除一个表中的数据可以这样解决,但是要删除多个表中数据时,还需要在每一个对应的操作包下都进行这些操作么?
解决问题
此时使用自定义Mapper即可
- 创建MyMapper< T > 继承BaseMapper,将自定义方法放到MyMapper里边
public interface MyMapper<T> extends BaseMapper<T> {
/**
* 删除所有
* @return 影响行数
*/
int deleteAll();
}
- 创建实际操作对象的Mapper继承MyMapper
public interface MyTypeMapper extends MyMapper<Type> {
}
3. 这时候继承MyMapper的Mapper都会获得自己的 deleteAll()方法