在项目中会有许多通用的接口,如基础的增删查改的接口,在每一个控制层都存在,需要写一些重复的代码。如果把增删查改的接口统一封装为每一个控制层默认存在的接口会比较方便。
1.建立增删查改的接口,泛型T
public interface IDeleteController<T> {
/**
* 根据ID 删除
*
* @param id
* @return
*/
Result deleteById(Serializable id);
}
public interface IInsertController<T> {
/**
* 添加记录
* @param record
* @return
*/
Result insert(T record);
}
public interface ISelectController<T> {
/**
* 根据ID 获取信息
* @param id
* @return
*/
Result<T> findById(Serializable id);
/**
* 查询所有
* @return
*/
Result<List<T>> findAll();
}
public interface IUpdateController<T> {
/**
* 根据对象进行更新 根据ID
*
* @param record
* @return
*/
Result updateByPrimaryKey(T record);
}
2.建一个核心接口去继承增删查改接口
public interface ICoreController<T> extends
ISelectController<T>,
IInsertController<T>,
IDeleteController<T>,
IUpdateController<T>{
}
3.定义一个抽象类实现核心接口
实现核心接口,构造器服务注入IService<T>(mybatis-plus提供),重写增删查改方法及路径定义。
public abstract class AbstractCoreController<T> implements ICoreController<T> {
/**
* 日志对象
*/
private static final Logger logger = LoggerFactory.getLogger(AbstractCoreController.class);
/**
* 调用方的service
*/
protected IService<T> coreService;
public AbstractCoreController(IService<T> coreService) {
this.coreService = coreService;
}
/**
* 删除记录
*
* @param id
* @return
*/
@GetMapping("/delete/{id}")
@Override
@ApiOperation("通过Id删除")
public Result deleteById(@PathVariable(name = "id") Serializable id) {
boolean flag = coreService.removeById(id);
if (!flag) {
return ResultWrapper.error();
}
return ResultWrapper.ok();
}
/**
* 添加记录
*
* @param record
* @return
*/
@PostMapping("/save")
@Override
@ApiOperation("新增")
public Result insert(@RequestBody T record) {
boolean flag = coreService.save(record);
if (!flag) {
return ResultWrapper.error();
}
return ResultWrapper.ok();
}
/**
* 更新数据
*
* @param record
* @return
*/
@Override
@PostMapping("/update")
@ApiOperation("通过Id更新")
public Result updateByPrimaryKey(@RequestBody T record) {
boolean flag = coreService.updateById(record);
if (!flag) {
return ResultWrapper.error();
}
return ResultWrapper.ok();
}
/**
* 通过id查询
*
* @param id
* @return
*/
@Override
@GetMapping("/get/{id}")
@ApiOperation("通过Id查询")
public Result<T> findById(@PathVariable(name = "id") Serializable id) {
T t = coreService.getById(id);
if(t == null){
return ResultWrapper.error();
}
return ResultWrapper.ok(t);
}
/**
* 查询所有记录
*
* @return 查询结果
*/
@GetMapping ("/findAll")
@Override
@ApiOperation("查询所有")
public Result<List<T>> findAll() {
List<T> list = coreService.list();
return ResultWrapper.page(list, (long) list.size());
}
}
4.使用封装好的通用接口。
举例:有一个test控制层,实体对象是Test类。在这个控制层继续抽象类,构造器注入testService,这样你就可以在控制层写其他接口,且这个接口已经默认附带了增删查改的接口。比如删除、新增,你在前端访问的路径就是"你的后端服务器/test/delete/{id}"、"你的后端服务器/test/save"。其他控制层也只需要继承就默认有这几个接口,主路径@RequestMapping("/主路径")设定就好了。
@RestController
@RequestMapping("/test")
public class TestController extends AbstractCoreController<Test> {
private ITestService testService;
@Autowired
public TestController(ITestService testService) {
super(testService);
this.testService = testService;
}
}