[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-eQlrBI25":3,"public-project-articles-eQlrBI25":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},1221,"eQlrBI25",60,"03. 使用代码生成器自动生成后端代码","在 Plugin 里面安装  EasyCode 插件\n\n\n\n## 模板代码\n\n### Entity.java.vm\n\n```plain\n## 1. 定义包路径和文件名\n$!{callback.setFileName($tool.append($tableInfo.name, \".java\"))}\n$!{callback.setSavePath($tool.append($tableInfo.savePath, \"\u002Fentity\"))}\n\n## 2. 动态获取包名\npackage $!{tableInfo.savePackageName}.entity;\n\nimport jakarta.persistence.*;\nimport lombok.Data;\n\n## 预处理：判断是否需要导入特定的包\n#set($hasBigDecimal = false)\n#set($hasDate = false)\n#foreach($column in $tableInfo.fullColumn)\n    ## 增加对 Java 类型的判断，防止 sqlType 抓取不到的情况\n    #if($column.sqlType.toLowerCase().contains(\"decimal\") || $column.type.equals(\"java.math.BigDecimal\")) \n        #set($hasBigDecimal = true) \n    #end\n    #if($column.type.equals(\"java.util.Date\")) \n        #set($hasDate = true) \n    #end\n#end\n\n#if($hasBigDecimal)\nimport java.math.BigDecimal;\n#end\n#if($hasDate)\nimport java.util.Date;\n#end\n\n\u002F**\n * $!{tableInfo.comment}($!{tableInfo.name}) 实体类\n *\u002F\n@Data\n@Entity\n@Table(name = \"$!{tableInfo.obj.name}\")\npublic class $!{tableInfo.name} {\n\n#foreach($column in $tableInfo.fullColumn)\n    \u002F**\n     * $!{column.comment}\n     *\u002F\n#if(${column.obj.name} == ${tableInfo.pkColumn[0].obj.name})\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n#else\n    ## 建议加上 @Column 注解，映射数据库字段名，防止驼峰命名不匹配\n    @Column(name = \"$!{column.obj.name}\")\n#end\n    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};\n\n#end\n}\n```\n\n### Repository.java,vm\n\n```plain\n## 1. 自动计算保存路径并设置文件名\n$!{callback.setSavePath($tool.append($tableInfo.savePath, \"\u002Frepository\"))}\n$!{callback.setFileName($tool.append($tableInfo.name, \"Repository.java\"))}\n\n## 2. 获取基础包名\npackage $!{tableInfo.savePackageName}.repository;\n\nimport $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\n\u002F**\n * $!{tableInfo.comment} 数据库操作层\n * 由 EasyCode 自动生成\n *\u002F\n@Repository\npublic interface $!{tableInfo.name}Repository extends JpaRepository\u003C$!{tableInfo.name}, Integer> {\n\n}\n```\n\n### Service.java.vm\n\n```plain\n## 1. 自动计算保存路径并设置文件名\n$!{callback.setSavePath($tool.append($tableInfo.savePath, \"\u002Fservice\"))}\n$!{callback.setFileName($tool.append($tableInfo.name, \"Service.java\"))}\n\n## 2. 获取基础包名\npackage $!{tableInfo.savePackageName}.service;\n\nimport $!{tableInfo.savePackageName}.common.PageInfo;\nimport $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};\nimport $!{tableInfo.savePackageName}.exception.CustomException;\nimport $!{tableInfo.savePackageName}.repository.$!{tableInfo.name}Repository;\nimport jakarta.annotation.Resource;\nimport org.springframework.data.domain.*;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\u002F**\n * $!{tableInfo.comment} 业务逻辑层\n *\u002F\n@Service\npublic class $!{tableInfo.name}Service {\n\n    @Resource\n    private $!{tableInfo.name}Repository $!tool.firstLowerCase($tableInfo.name)Repository;\n\n    \u002F**\n     * 新增或者更新\n     *\u002F\n    public void save($!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)) {\n        $!{tool.firstLowerCase($tableInfo.name)}Repository.save($!tool.firstLowerCase($tableInfo.name));\n    }\n\n    \u002F**\n     * 删除\n     *\u002F\n    public void deleteById(Integer id) {\n        $!{tool.firstLowerCase($tableInfo.name)}Repository.deleteById(id);\n    }\n\n    \u002F**\n     * 批量删除\n     *\u002F\n    public void deleteBatch(List\u003CInteger> ids) {\n        $!{tool.firstLowerCase($tableInfo.name)}Repository.deleteAllByIdInBatch(ids);\n    }\n\n    \u002F**\n     * 单个查询\n     *\u002F\n    public $!{tableInfo.name} findById(Integer id) {\n        return $!{tool.firstLowerCase($tableInfo.name)}Repository.findById(id).orElse(null);\n    }\n\n    \u002F**\n     * 查询所有数据\n     *\u002F\n    public List\u003C$!{tableInfo.name}> findAll($!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)) {\n        ExampleMatcher matcher = ExampleMatcher.matching()\n                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)\n                .withIgnoreCase();\n        Example\u003C$!{tableInfo.name}> example = Example.of($!tool.firstLowerCase($tableInfo.name), matcher);\n        return $!{tool.firstLowerCase($tableInfo.name)}Repository.findAll(example);\n    }\n\n    \u002F**\n     * 分页模糊查询所有数据\n     *\u002F\n    public PageInfo\u003C$!{tableInfo.name}> findPage($!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name), Integer pageNum, Integer pageSize) {\n        \u002F\u002F 定义通用模糊匹配规则\n        ExampleMatcher matcher = ExampleMatcher.matching()\n                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)\n                .withIgnoreCase();\n        Example\u003C$!{tableInfo.name}> example = Example.of($!tool.firstLowerCase($tableInfo.name), matcher);\n        PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize, Sort.by(\"id\").descending());\n        Page\u003C$!{tableInfo.name}> page = $!{tool.firstLowerCase($tableInfo.name)}Repository.findAll(example, pageRequest);\n        return PageInfo.of(page);\n    }\n\n}\n```\n\n### Controller.java.vm\n\n```plain\n## 1. 自动计算保存路径并设置文件名\n$!{callback.setSavePath($tool.append($tableInfo.savePath, \"\u002Fcontroller\"))}\n$!{callback.setFileName($tool.append($tableInfo.name, \"Controller.java\"))}\n\n## 2. 获取基础包名 (假设你的 package 是 com.example.controller)\npackage $!{tableInfo.savePackageName}.controller;\n\nimport $!{tableInfo.savePackageName}.common.PageInfo;\nimport $!{tableInfo.savePackageName}.common.Result;\nimport $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};\nimport $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.annotation.Resource;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n\u002F**\n * $!{tableInfo.comment} controller 接口层\n *\u002F\n@RestController\n@RequestMapping(\"\u002F$!tool.firstLowerCase($tableInfo.name)\")\n@Tag(name = \"$!{tableInfo.comment}模块\")\npublic class $!{tableInfo.name}Controller {\n\n    @Resource\n    private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;\n\n    \u002F**\n     * 新增或更新\n     *\u002F\n    @Operation(summary = \"新增或更新$!{tableInfo.comment}\")\n    @PostMapping(\"\u002Fsave\")\n    public Result save(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)) {\n        $!tool.firstLowerCase($tableInfo.name)Service.save($!tool.firstLowerCase($tableInfo.name));\n        return Result.success();\n    }\n\n    \u002F**\n     * 根据ID删除\n     *\u002F\n    @Operation(summary = \"根据ID删除$!{tableInfo.comment}\")\n    @DeleteMapping(\"\u002FdeleteById\u002F{id}\")\n    public Result deleteById(@PathVariable Integer id) {\n        $!tool.firstLowerCase($tableInfo.name)Service.deleteById(id);\n        return Result.success();\n    }\n\n    \u002F**\n     * 批量根据ID删除\n     *\u002F\n    @Operation(summary = \"批量删除$!{tableInfo.comment}\") \n    @DeleteMapping(\"\u002FdeleteBatch\")\n    public Result deleteBatch(@RequestBody List\u003CInteger> ids) {\n        $!tool.firstLowerCase($tableInfo.name)Service.deleteBatch(ids);\n        return Result.success();\n    }\n\n    \u002F**\n     * 根据ID查询\n     *\u002F\n    @Operation(summary = \"批量ID查询$!{tableInfo.comment}\")  \n    @GetMapping(\"\u002FfindById\u002F{id}\")\n    public Result findById(@PathVariable Integer id) {\n        $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name) = $!tool.firstLowerCase($tableInfo.name)Service.findById(id);\n        return Result.success($!tool.firstLowerCase($tableInfo.name));\n    }\n\n    \u002F**\n     * 查询所有\n     *\u002F\n    @Operation(summary = \"查询所有$!{tableInfo.comment}\")  \n    @GetMapping(\"\u002FfindAll\")\n    public Result findAll($!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)) {\n        List\u003C$!{tableInfo.name}> all = $!tool.firstLowerCase($tableInfo.name)Service.findAll($!tool.firstLowerCase($tableInfo.name));\n        return Result.success(all);\n    }\n\n    \u002F**\n     * 分页查询\n     *\u002F\n    @Operation(summary = \"分页查询$!{tableInfo.comment}\")   \n    @GetMapping(\"\u002FfindPage\")\n    public Result findPage($!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name),\n                           @RequestParam(defaultValue = \"1\") Integer pageNum,\n                           @RequestParam(defaultValue = \"10\") Integer pageSize) {\n        PageInfo\u003C$!{tableInfo.name}> pageInfo = $!tool.firstLowerCase($tableInfo.name)Service.findPage($!tool.firstLowerCase($tableInfo.name), pageNum, pageSize);\n        return Result.success(pageInfo);\n    }\n\n}\n\n```\n\n### 建表规则\n\n+ 表必须有 ID 的主键  主键是自增的\n+ 表必须写注释\n+ 字段必须写注释\n+ 字段不能是数据库或者 java 的关键字   class（clazz）\n\n```sql\n-- auto-generated definition\ncreate table book\n(\n    id        int auto_increment comment 'ID'\n        primary key,\n    name      varchar(50)    null comment '名称',\n    img       varchar(255)   null comment '封面',\n    price     decimal(10, 2) null comment '价格',\n    author    varchar(50)    null comment '作者',\n    publisher varchar(50)    null comment '出版社',\n    date      varchar(50)    null comment '出版日期'\n)\n    comment '图书信息';\n\n\n```\n\n## decimal(10,2) -> BigDecimal\n\n配置 EasyCode 的 Type Mapper\n\n\u003C!-- 这是一张图片，ocr 内容为：十一工下 EDITOR PLUGINS COLUMNTYPE JAVATYPE MATCHTYPE VARCHAR@WD+W)? JAVA.LANG.STRING REGEX VERSION CONTROL CHAR@AD+V)? REGEX JAVA.LANG.STRING BUILD,EXECUTION.DEPLOYMENT (TINYLMEDIUMLLONG)*TEXT REGEX JAVA.LANG.STRING LANGUAGES & FRAMEWORKS REGEX DECIRNALAND+.\\D+V)? JAVA.MATH.BIGDECIMAL TOOLS ORDINARY INTEGER JAVA.LANG.INTEGER SETTINGS SYNC (TINYLSMALL MEDIUM)*INTAAD+V)? REGEX JAVA.LANG.INTEGER ORDINARY INT4 ADVANCED SETTINGS JAVA.LANG.INTEGER INT8 ORDINARY JAVA.LANG.LONG OTHER SETTINGS BIGINT(AD+V)? REGLX JAVA.LANG.LONG FASYCODE ORDINARY JAVA.UTIL.DATE DATE TYPE MAPPER ORDINARY DATETIME JAVA.UTIL.DATE TEMPLATE ORDINARY TIMESTAMP JAVA.UTIL.DATE COLUMN CONFIG ORDINARY TIME JAVA.TIME.LOCALTIME ORDINARY JAVA.LANGBOOLEAN GLOBAL CONFIG ORDINARY DECIMAL(10) JAVA.MATH.BIGDECIMAL MYBATISX -->\n![](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2026\u002Fpng\u002F751015\u002F1770606105029-4b487010-d09f-431a-8424-66e033b85b4d.png)\n\n","coding",1,195,2381,"2026-02-09 11:13:19","2026-05-03 22:49:02","2026最新基于SpringBoot4+Vue3零基础入门项目实战教学","springboot4-vue3-tutorial",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,28,35,36],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":25,"created_at":26,"updated_at":27,"project_title":15,"project_slug":16},1219,"zz39u4vv","01. SpringBoot4零基础入门实战",745,2376,"2026-02-05 12:35:53","2026-05-07 15:36:12.649662+00",{"id":29,"uuid":30,"project_id":6,"title":31,"type":9,"status":10,"public_enabled":10,"views":32,"sort":33,"created_at":34,"updated_at":14,"project_title":15,"project_slug":16},1220,"mbxrGCSA","02. 学习SpringBoot4+JPA基本的增删改查接口",257,2377,"2026-02-06 12:26:55",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},{"id":37,"uuid":38,"project_id":6,"title":39,"type":9,"status":10,"public_enabled":10,"views":40,"sort":41,"created_at":42,"updated_at":14,"project_title":15,"project_slug":16},1222,"Ni0HTQnR","04. Vue3零基础快速入门实战",228,2387,"2026-02-10 11:39:21"]