|
|
@@ -0,0 +1,389 @@
|
|
|
+---
|
|
|
+name: dao-crud
|
|
|
+description: >-
|
|
|
+ 创建对象或功能项的CRUD全链路脚手架。当用户需要为某个实体创建完整的数据库持久层、业务层和控制器层时使用本技能,包括:Table接口、SqlProvider、Mapper、DBService接口/实现类、BizFilter、BizHelper和Controller。触发场景如:"帮我创建一个XXX的CRUD"、"生成XXX的全套代码"、"生成XXX的增删查改"。
|
|
|
+---
|
|
|
+
|
|
|
+# DAO CRUD 全链路脚手架生成
|
|
|
+
|
|
|
+本技能用于快速生成一个对象或功能项的完整 CRUD 链路代码,包括数据库持久层、业务处理层和 API 控制器层。
|
|
|
+
|
|
|
+## 工作流程
|
|
|
+
|
|
|
+### 第一步:确认对象名称
|
|
|
+
|
|
|
+**必须先询问用户**要创建的对象/功能项名称(如:`DevEntity`、`PatrolTask` 等)。
|
|
|
+
|
|
|
+### 第二步:生成代码骨架
|
|
|
+
|
|
|
+按照以下顺序创建 **8** 个文件,**扩展函数和具体实现均可留空或抛出 `UnsupportedOperationException`,由用户自行补全**。
|
|
|
+
|
|
|
+#### 2.1 Table 接口
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/tables/{EntityName}Table.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.dbdao.tables;
|
|
|
+
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+public interface {EntityName}Table {
|
|
|
+ interface R_INFO{
|
|
|
+ String TABLE = ""; // TODO: 填写查询表/视图名
|
|
|
+ String PRIMARY_KEY = ""; // TODO: 填写主键字段
|
|
|
+ String ALL_FILED = "*";
|
|
|
+ String UNIQUE_ID = "";
|
|
|
+ String DEFAULT_ORDER = "";
|
|
|
+ Set<String> LIKE_SUPPORT_FILTER = new HashSet<String>(){{}};
|
|
|
+ }
|
|
|
+
|
|
|
+ interface W_INFO{
|
|
|
+ String TABLE = ""; // TODO: 填写写入表名
|
|
|
+ String PRIMARY_KEY = ""; // TODO: 填写主键字段
|
|
|
+ String UNIQUE_ID = "";
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.2 SqlProvider
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/providers/{EntityName}SqlProvider.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.dbdao.providers;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.tables.{EntityName}Table;
|
|
|
+
|
|
|
+public class {EntityName}SqlProvider extends BaseSqlProvider implements {EntityName}Table {
|
|
|
+ @Override
|
|
|
+ public String getRTableName() {
|
|
|
+ return R_INFO.TABLE;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getWTableName() {
|
|
|
+ return W_INFO.TABLE;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getRUniqueId() {
|
|
|
+ return R_INFO.UNIQUE_ID;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getWUniqueId() {
|
|
|
+ return W_INFO.UNIQUE_ID;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getSAllFiled() {
|
|
|
+ return R_INFO.ALL_FILED;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getRPrimaryKey() {
|
|
|
+ return R_INFO.PRIMARY_KEY;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getWPrimaryKey() {
|
|
|
+ return W_INFO.PRIMARY_KEY;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isWJsonForFiled(String filedName) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 根据业务需求扩展 SQL 方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.3 Mapper 接口
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/mapper/{EntityName}Mapper.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.dbdao.mapper;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.BaseDBMapper;
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.providers.{EntityName}SqlProvider;
|
|
|
+import org.apache.ibatis.annotations.InsertProvider;
|
|
|
+import org.apache.ibatis.annotations.Param;
|
|
|
+import org.apache.ibatis.annotations.SelectProvider;
|
|
|
+import org.apache.ibatis.annotations.UpdateProvider;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+public interface {EntityName}Mapper extends BaseDBMapper{
|
|
|
+ @Override
|
|
|
+ @SelectProvider(type = {EntityName}SqlProvider.class, method = "totalCounts")
|
|
|
+ int totalCounts(@Param("andWheres") Map<String, Object> andWheres
|
|
|
+ , @Param("orWheres") Map<String, Object> orWheres
|
|
|
+ , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
|
|
|
+ , @Param("extend") String extend);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @SelectProvider(type = {EntityName}SqlProvider.class, method = "listAllWiths")
|
|
|
+ List<Map<String, Object>> listAllWiths(@Param("table") String table
|
|
|
+ , @Param("filed") String filed
|
|
|
+ , @Param("limit") int limit
|
|
|
+ , @Param("offset") int offset
|
|
|
+ , @Param("andWheres") Map<String, Object> andWheres
|
|
|
+ , @Param("orWheres") Map<String, Object> orWheres
|
|
|
+ , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
|
|
|
+ , @Param("extend") String extend
|
|
|
+ , @Param("order") String order);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryWiths")
|
|
|
+ List<Map<String, Object>> batchQueryWiths(@Param("table") String table
|
|
|
+ , @Param("filed") String filed
|
|
|
+ , @Param("andWheres") Map<String, Object> andWheres
|
|
|
+ , @Param("orWheres") Map<String, Object> orWheres
|
|
|
+ , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
|
|
|
+ , @Param("extend") String extend
|
|
|
+ , @Param("order") String order);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryIn")
|
|
|
+ List<Map<String, Object>> batchQueryIn(@Param("table") String table
|
|
|
+ , @Param("filed") String filed
|
|
|
+ , @Param("ids") List<? extends Object> ids
|
|
|
+ , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
|
|
|
+ , @Param("extend") String extend
|
|
|
+ , @Param("order") String order);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @SelectProvider(type = {EntityName}SqlProvider.class, method = "getOne")
|
|
|
+ Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @SelectProvider(type = {EntityName}SqlProvider.class, method = "existLine")
|
|
|
+ boolean existLine(@Param("table") String table
|
|
|
+ , @Param("andWheres") Map<String, Object> andWheres
|
|
|
+ , @Param("orWheres") Map<String, Object> orWheres
|
|
|
+ , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
|
|
|
+ , @Param("extend") String extend);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @UpdateProvider(type = {EntityName}SqlProvider.class, method = "updateWiths")
|
|
|
+ int updateWiths(@Param("datas") Map<String, Object> datas
|
|
|
+ , @Param("andWheres") Map<String, Object> andWheres
|
|
|
+ , @Param("orWheres") Map<String, Object> orWheres
|
|
|
+ , @Param("extend") String extend);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @InsertProvider(type = {EntityName}SqlProvider.class, method = "inserts")
|
|
|
+ int inserts(@Param("inserts") Map<String, Object> inserts);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @InsertProvider(type = {EntityName}SqlProvider.class, method = "batchInserts")
|
|
|
+ int batchInserts(@Param("inserts") List<Map<String, Object>> inserts);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @InsertProvider(type = {EntityName}SqlProvider.class, method = "insertOrUpdate")
|
|
|
+ int insertOrUpdate(@Param("inserts") Map<String, Object> inserts
|
|
|
+ , @Param("uniques") List<Object> uniques
|
|
|
+ , @Param("updates") List<Object> updates);
|
|
|
+
|
|
|
+ // TODO: 根据业务需求扩展 Mapper 方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.4 DBService 接口
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/services/intef/{EntityName}DBService.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.dbdao.services.intef;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.BaseDBFuncTemplate;
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.mapper.{EntityName}Mapper;
|
|
|
+
|
|
|
+public abstract class {EntityName}DBService extends BaseDBFuncTemplate<{EntityName}Mapper> {
|
|
|
+ // TODO: 根据业务需求扩展接口方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.5 DBServiceImpl 实现类
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/services/{EntityName}DBServiceImpl.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.dbdao.services;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.mapper.{EntityName}Mapper;
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.services.intef.{EntityName}DBService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class {EntityName}DBServiceImpl extends {EntityName}DBService {
|
|
|
+ private String mStrClassName = "";
|
|
|
+ private String mBusinessType = "";
|
|
|
+ private String logTag = "";
|
|
|
+
|
|
|
+ public {EntityName}DBServiceImpl() {
|
|
|
+ mStrClassName = this.getClass().getSimpleName();
|
|
|
+ mBusinessType = "";
|
|
|
+ logTag = "{EntityName}";
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("all")
|
|
|
+ @Autowired
|
|
|
+ {EntityName}Mapper {entityName}Mapper;
|
|
|
+
|
|
|
+ @PostConstruct
|
|
|
+ public void postConstruct(){
|
|
|
+ init({entityName}Mapper, mBusinessType, logTag);
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 根据业务需求扩展接口方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.6 BizFilter 过滤器
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/controllerfilter/third/ThirdJWT{EntityName}BizFilter.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.controllerfilter.third;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.controllercheck.ThirdCommTaskControllerCheck;
|
|
|
+import com.shkpr.service.alamdmaordertask.controllerfilter.JWTAuthenticationFilter;
|
|
|
+import org.springframework.security.authentication.AuthenticationManager;
|
|
|
+import org.springframework.security.web.util.matcher.RequestMatcher;
|
|
|
+
|
|
|
+import javax.servlet.FilterChain;
|
|
|
+import javax.servlet.ServletException;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+public class ThirdJWT{EntityName}BizFilter extends JWTAuthenticationFilter {
|
|
|
+ private RequestMatcher mRequestMatcher = null;
|
|
|
+ private ThirdCommTaskControllerCheck mControllerCheck = null;
|
|
|
+ private static final Map<String, String> msMapURI2Method;
|
|
|
+ static {
|
|
|
+ msMapURI2Method = new HashMap<String, String>();
|
|
|
+ // TODO: 配置 API 路由映射,例如:
|
|
|
+ // msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_XXX_H, ApiURI.URI_XXX_LIST), "POST");
|
|
|
+ }
|
|
|
+
|
|
|
+ public ThirdJWT{EntityName}BizFilter(AuthenticationManager authenticationManager) {
|
|
|
+ super(authenticationManager);
|
|
|
+ this.mStrThisSampleName = this.getClass().getSimpleName();
|
|
|
+ this.mControllerCheck = new ThirdCommTaskControllerCheck(msMapURI2Method);
|
|
|
+ setControllerCheck(this.mControllerCheck);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ThirdJWT{EntityName}BizFilter(String url, AuthenticationManager authenticationManager) {
|
|
|
+ super(url, authenticationManager);
|
|
|
+ this.mStrThisSampleName = this.getClass().getSimpleName();
|
|
|
+ this.mControllerCheck = new ThirdCommTaskControllerCheck(msMapURI2Method);
|
|
|
+ setControllerCheck(this.mControllerCheck);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
|
|
|
+ super.doFilterInternal(request, response, chain);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.7 BizHelper 业务处理类
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/busihandler/{EntityName}BizHelper.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.busihandler;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.DBMgrProxy;
|
|
|
+import com.shkpr.service.alamdmaordertask.dbdao.services.intef.{EntityName}DBService;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+public class {EntityName}BizHelper {
|
|
|
+ private final static String mStrClassName = "{EntityName}BizHelper";
|
|
|
+
|
|
|
+ private static {EntityName}DBService getThisDBService(){
|
|
|
+ return DBMgrProxy.getInstance().applyXXXApi({EntityName}DBService.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 根据业务需求实现业务方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 2.8 Controller 控制器
|
|
|
+
|
|
|
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/controllerapi/Third{EntityName}Controller.java`
|
|
|
+
|
|
|
+**模板**:
|
|
|
+```java
|
|
|
+package com.shkpr.service.alamdmaordertask.controllerapi;
|
|
|
+
|
|
|
+import com.shkpr.service.alamdmaordertask.constants.ApiURI;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+import org.springframework.web.bind.annotation.*;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
+
|
|
|
+@RequestMapping(ApiURI.URI_XXX_H) // TODO: 替换为实际的 API 路径
|
|
|
+@RestController
|
|
|
+public class Third{EntityName}Controller extends ThirdBaseController {
|
|
|
+ final static String MSG_SUCCESS = "success.";
|
|
|
+ final static String MSG_FAILED = "failed.";
|
|
|
+ final static String mBusinessType = "";
|
|
|
+ final static String mLogTag = "{EntityName}";
|
|
|
+ private String mStrClassName = "";
|
|
|
+ private AtomicInteger mSeqReq = null;
|
|
|
+
|
|
|
+ public Third{EntityName}Controller() {
|
|
|
+ super(mBusinessType, mLogTag);
|
|
|
+ mStrClassName = this.getClass().getSimpleName();
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 实现具体的 API 处理方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 第三步:输出总结
|
|
|
+
|
|
|
+创建完成后,输出以下总结信息:
|
|
|
+
|
|
|
+```
|
|
|
+✓ CRUD 全链路脚手架已生成!
|
|
|
+
|
|
|
+已创建以下文件:
|
|
|
+1. Table 接口: {EntityName}Table.java
|
|
|
+2. SqlProvider: {EntityName}SqlProvider.java
|
|
|
+3. Mapper: {EntityName}Mapper.java
|
|
|
+4. DBService 接口: {EntityName}DBService.java
|
|
|
+5. DBServiceImpl: {EntityName}DBServiceImpl.java
|
|
|
+6. BizFilter: ThirdJWT{EntityName}BizFilter.java
|
|
|
+7. BizHelper: {EntityName}BizHelper.java
|
|
|
+8. Controller: Third{EntityName}Controller.java
|
|
|
+
|
|
|
+请注意:
|
|
|
+- 文件中的 TODO 项需要您自行补充完整
|
|
|
+```
|
|
|
+
|
|
|
+## 注意事项
|
|
|
+
|
|
|
+1. **始终先询问对象名称**,不要在用户未提供名称时自行推断
|
|
|
+2. **保持代码风格与现有项目一致**,使用项目已有的包结构和命名规范
|
|
|
+3. **扩展方法均可留空**,框架代码只保证编译通过
|
|
|
+4. **Mapper 中不使用实体对象**,只使用 `Map<String, Object>` 或 `List<Map<String, Object>>` 进行数据交互(遵循数据库持久层规范)
|