--- 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 LIKE_SUPPORT_FILTER = new HashSet(){{}}; } 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 andWheres , @Param("orWheres") Map orWheres , @Param("group2Power") Map>> group2Power , @Param("extend") String extend); @Override @SelectProvider(type = {EntityName}SqlProvider.class, method = "listAllWiths") List> listAllWiths(@Param("table") String table , @Param("filed") String filed , @Param("limit") int limit , @Param("offset") int offset , @Param("andWheres") Map andWheres , @Param("orWheres") Map orWheres , @Param("group2Power") Map>> group2Power , @Param("extend") String extend , @Param("order") String order); @Override @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryWiths") List> batchQueryWiths(@Param("table") String table , @Param("filed") String filed , @Param("andWheres") Map andWheres , @Param("orWheres") Map orWheres , @Param("group2Power") Map>> group2Power , @Param("extend") String extend , @Param("order") String order); @Override @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryIn") List> batchQueryIn(@Param("table") String table , @Param("filed") String filed , @Param("ids") List ids , @Param("group2Power") Map>> group2Power , @Param("extend") String extend , @Param("order") String order); @Override @SelectProvider(type = {EntityName}SqlProvider.class, method = "getOne") Map 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 andWheres , @Param("orWheres") Map orWheres , @Param("group2Power") Map>> group2Power , @Param("extend") String extend); @Override @UpdateProvider(type = {EntityName}SqlProvider.class, method = "updateWiths") int updateWiths(@Param("datas") Map datas , @Param("andWheres") Map andWheres , @Param("orWheres") Map orWheres , @Param("extend") String extend); @Override @InsertProvider(type = {EntityName}SqlProvider.class, method = "inserts") int inserts(@Param("inserts") Map inserts); @Override @InsertProvider(type = {EntityName}SqlProvider.class, method = "batchInserts") int batchInserts(@Param("inserts") List> inserts); @Override @InsertProvider(type = {EntityName}SqlProvider.class, method = "insertOrUpdate") int insertOrUpdate(@Param("inserts") Map inserts , @Param("uniques") List uniques , @Param("updates") List 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 msMapURI2Method; static { msMapURI2Method = new HashMap(); // 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` 或 `List>` 进行数据交互(遵循数据库持久层规范)