消除 CRUD 重複代碼,統一分頁、返回格式、異常處理,建立可復用的分層基礎設施,讓業務開發聚焦核心邏輯。
Controller (BaseController)
↓ 依賴介面
Service (BaseService)
↓ 依賴介面
Mapper (BaseMapper)
↓ 操作
Database
// 分頁參數承載 (支援 MySQL limit/offset 與 Oracle 分頁)
public class BasePage {
protected int start; // 起始行
protected Integer limit; // 頁大小
protected Integer length; // 兼容 DataTables
protected int draw; // 請求計數
protected Integer oracleStart; // Oracle 起始
protected Integer oracleEnd; // Oracle 結束
// getter/setter 省略
}
// 列表返回結構 (兼容 DataTables / Bootstrap Table)
public class GridReturn {
private int draw;
private long recordsTotal;
private long recordsFiltered;
private List> data;
// 構造器、getter/setter 省略
}
// 通用操作返回
public class MsgReturn {
private boolean success;
private Object msg;
private Object otherObject;
// 多種構造器支援成功/失敗/異常/攜帶數據
}
public interface BaseMapper {
int insert(T t);
int delete(T t);
int update(T t);
T get(T t); // 單條查詢
List findList(C c); // 分頁列表
int getTotalCount(C c); // 總數
}
public interface BaseService {
int insert(T t);
int delete(T t);
int update(T t);
T get(T t);
List findList(C c);
int getTotalCount(C c);
}
// 模板方法實現,子類只需提供 Mapper
public abstract class BaseServiceImpl implements BaseService {
protected abstract BaseMapper getChildMapper();
// 所有方法委派給 Mapper,此處可擴展事務、緩存、日誌、權限攔截
public int insert(T t) { return getChildMapper().insert(t); }
// ... 其他方法同理
}
public abstract class BaseController {
protected abstract BaseService getBaseService();
@PostMapping("/insert")
@ResponseBody
public MsgReturn insert(T t) {
return getBaseService().insert(t) > 0
? new MsgReturn(true, "新增成功!")
: new MsgReturn(false, "新增失敗!");
}
@PostMapping("/delete")
@ResponseBody
public MsgReturn delete(T t) { /* 同理 */ }
@PostMapping("/update")
@ResponseBody
public MsgReturn update(T t) { /* 同理 */ }
@GetMapping("/get")
@ResponseBody
public T get(T t) { return getBaseService().get(t); }
@PostMapping("/findList")
@ResponseBody
public GridReturn findList(C c) {
// 兼容前端 limit/length 參數差異
if (c.getLimit() != null || c.getLength() != null) {
c.setLength(c.getLimit());
c.setLimit(c.getLimit());
c.setOracleEnd(c.getLimit() + c.getStart());
c.setOracleStart(c.getStart());
}
List list = getBaseService().findList(c);
int count = getBaseService().getTotalCount(c);
return new GridReturn(c.getDraw(), count, count, list);
}
}
// 1. 實體
public class User { private Long id; private String name; /* getter/setter */ }
// 2. 查詢條件繼承分頁
public class UserQuery extends BasePage { private String name; /* getter/setter */ }
// 3. Mapper 介面 (MyBatis XML 對應)
public interface UserMapper extends BaseMapper { }
// 4. Service 實現
@Service
public class UserServiceImpl extends BaseServiceImpl {
@Autowired UserMapper userMapper;
protected BaseMapper getChildMapper() { return userMapper; }
}
// 5. Controller
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {
@Autowired UserServiceImpl userService;
protected BaseService getBaseService() { return userService; }
}
updateByIdWithVersion,實體加 @Version。delete 改為邏輯刪除 SQL,查詢自動加 deleted=0。create_time, update_time, create_by。@ControllerAdvice 全局異常處理,返回統一 MsgReturn。@PreAuthorize 或自定義註解 + AOP。這套基類體系通過泛型抽象、模板方法模式、介面導向,將 CRUD 通用邏輯下沉到框架層,業務層僅需「配置而非編碼」即可擁有標準化的增刪改查、分頁、返回格式。是中小型項目快速搭建、大型項目規範基線的極佳起點。