Skip to content

Commit a994099

Browse files
committed
feat(template): 添加 Java Spring Boot MyBatis 和 Node NestJS TypeORM 代码生成模板
- 新增 Java Spring Boot MyBatis 模板,包含实体、Mapper、Service、Controller 等代码生成器 - 新增 Node NestJS TypeORM 模板,包含实体、Service、Controller 等代码生成器 - 添加相应的配置文件和 README 说明文档
1 parent 33c0919 commit a994099

File tree

22 files changed

+843
-0
lines changed

22 files changed

+843
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Spring Boot + MyBatis 示例(Flexmodel 模板)
2+
3+
- 这是一个最简 Spring Boot 3 + MyBatis 的示例模板,默认使用 H2 内存数据库,便于快速运行。
4+
- 生成后的项目包含:启动类、实体、Mapper 接口与 XML、Service、Controller、application.yml、初始化 SQL。
5+
6+
## 运行
7+
8+
- 使用 mvn spring-boot:run 启动。
9+
- 启动后访问 http://localhost:8080/users 查看简单的 REST 列表接口。
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?xml version="1.0"?>
2+
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
5+
<modelVersion>4.0.0</modelVersion>
6+
<groupId>${groupId}</groupId>
7+
<artifactId>${artifactId}</artifactId>
8+
<version>${version}</version>
9+
<name>${artifactId}</name>
10+
11+
<properties>
12+
<java.version>17</java.version>
13+
<spring-boot.version>3.3.2</spring-boot.version>
14+
</properties>
15+
16+
<dependencyManagement>
17+
<dependencies>
18+
<dependency>
19+
<groupId>org.springframework.boot</groupId>
20+
<artifactId>spring-boot-dependencies</artifactId>
21+
<version>${spring-boot.version}</version>
22+
<type>pom</type>
23+
<scope>import</scope>
24+
</dependency>
25+
</dependencies>
26+
</dependencyManagement>
27+
28+
<dependencies>
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter-web</artifactId>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.mybatis.spring.boot</groupId>
35+
<artifactId>mybatis-spring-boot-starter</artifactId>
36+
<version>3.0.3</version>
37+
</dependency>
38+
<dependency>
39+
<groupId>com.h2database</groupId>
40+
<artifactId>h2</artifactId>
41+
<scope>runtime</scope>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.springframework.boot</groupId>
45+
<artifactId>spring-boot-starter-test</artifactId>
46+
<scope>test</scope>
47+
</dependency>
48+
</dependencies>
49+
50+
<build>
51+
<plugins>
52+
<plugin>
53+
<groupId>org.springframework.boot</groupId>
54+
<artifactId>spring-boot-maven-plugin</artifactId>
55+
</plugin>
56+
<plugin>
57+
<artifactId>maven-compiler-plugin</artifactId>
58+
<version>3.14.0</version>
59+
<configuration>
60+
<source>${java.version}</source>
61+
<target>${java.version}</target>
62+
<parameters>true</parameters>
63+
</configuration>
64+
</plugin>
65+
</plugins>
66+
</build>
67+
</project>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ${packageName};
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class Application {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(Application.class, args);
11+
}
12+
13+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import tech.wetech.flexmodel.codegen.AbstractGenerator
2+
import tech.wetech.flexmodel.codegen.GenerationContext
3+
import tech.wetech.flexmodel.codegen.ModelClass
4+
5+
import java.nio.file.Path
6+
7+
class ControllerGenerator extends AbstractGenerator {
8+
9+
@Override
10+
String getTargetFile(GenerationContext context, String targetDirectory) {
11+
ModelClass modelClass = context.modelClass
12+
return Path.of(targetDirectory, modelClass.shortClassName + 'Controller.java').toString()
13+
}
14+
15+
@Override
16+
void writeModel(PrintWriter out, GenerationContext context) {
17+
def modelClass = context.modelClass
18+
def basePath = '/' + modelClass.shortClassName.toLowerCase() + 's'
19+
out.println "package ${modelClass.packageName}.controller;"
20+
out.println ""
21+
out.println "import java.util.List;"
22+
out.println "import org.springframework.http.HttpStatus;"
23+
out.println "import org.springframework.web.bind.annotation.*;"
24+
out.println "import ${modelClass.packageName}.entity.${modelClass.shortClassName};"
25+
out.println "import ${modelClass.packageName}.service.${modelClass.shortClassName}Service;"
26+
out.println ""
27+
out.println "@RestController"
28+
out.println "@RequestMapping(\"${basePath}\")"
29+
out.println "public class ${modelClass.shortClassName}Controller {"
30+
out.println " private final ${modelClass.shortClassName}Service service;"
31+
out.println ""
32+
out.println " public ${modelClass.shortClassName}Controller(${modelClass.shortClassName}Service service) {"
33+
out.println " this.service = service;"
34+
out.println " }"
35+
out.println ""
36+
out.println " @GetMapping"
37+
out.println " public List<${modelClass.shortClassName}> list() {"
38+
out.println " return service.list();"
39+
out.println " }"
40+
out.println ""
41+
out.println " @GetMapping(\"/page\")"
42+
out.println " public List<${modelClass.shortClassName}> page(@RequestParam int offset, @RequestParam int limit) {"
43+
out.println " return service.page(offset, limit);"
44+
out.println " }"
45+
out.println ""
46+
out.println " @GetMapping(\"/{id}\")"
47+
out.println " public ${modelClass.shortClassName} get(@PathVariable Long id) {"
48+
out.println " return service.get(id);"
49+
out.println " }"
50+
out.println ""
51+
out.println " @PostMapping"
52+
out.println " @ResponseStatus(HttpStatus.CREATED)"
53+
out.println " public Long create(@RequestBody ${modelClass.shortClassName} entity) {"
54+
out.println " return service.create(entity);"
55+
out.println " }"
56+
out.println ""
57+
out.println " @PostMapping(\"/batch\")"
58+
out.println " @ResponseStatus(HttpStatus.CREATED)"
59+
out.println " public int createBatch(@RequestBody List<${modelClass.shortClassName}> entities) {"
60+
out.println " return service.createBatch(entities);"
61+
out.println " }"
62+
out.println ""
63+
out.println " @PutMapping(\"/{id}\")"
64+
out.println " public void update(@PathVariable Long id, @RequestBody ${modelClass.shortClassName} entity) {"
65+
out.println " entity.setId(id);"
66+
out.println " service.update(entity);"
67+
out.println " }"
68+
out.println ""
69+
out.println " @DeleteMapping(\"/{id}\")"
70+
out.println " @ResponseStatus(HttpStatus.NO_CONTENT)"
71+
out.println " public void delete(@PathVariable Long id) {"
72+
out.println " service.delete(id);"
73+
out.println " }"
74+
out.println ""
75+
out.println " @DeleteMapping"
76+
out.println " @ResponseStatus(HttpStatus.NO_CONTENT)"
77+
out.println " public void deleteByIds(@RequestParam List<Long> ids) {"
78+
out.println " service.deleteByIds(ids);"
79+
out.println " }"
80+
out.println ""
81+
out.println " @GetMapping(\"/ids\")"
82+
out.println " public List<${modelClass.shortClassName}> findByIds(@RequestParam List<Long> ids) {"
83+
out.println " return service.findByIds(ids);"
84+
out.println " }"
85+
out.println ""
86+
out.println " @GetMapping(\"/count\")"
87+
out.println " public long count() {"
88+
out.println " return service.count();"
89+
out.println " }"
90+
out.println ""
91+
out.println " @GetMapping(\"/exists/{id}\")"
92+
out.println " public boolean existsById(@PathVariable Long id) {"
93+
out.println " return service.existsById(id);"
94+
out.println " }"
95+
out.println "}"
96+
}
97+
}
98+
99+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import tech.wetech.flexmodel.codegen.AbstractGenerator
2+
import tech.wetech.flexmodel.codegen.GenerationContext
3+
import tech.wetech.flexmodel.codegen.ModelClass
4+
5+
import java.nio.file.Path
6+
7+
class EntityGenerator extends AbstractGenerator {
8+
9+
@Override
10+
String getTargetFile(GenerationContext context, String targetDirectory) {
11+
ModelClass modelClass = context.modelClass
12+
return Path.of(targetDirectory, modelClass.shortClassName + '.java').toString()
13+
}
14+
15+
@Override
16+
void writeModel(PrintWriter out, GenerationContext context) {
17+
def modelClass = context.modelClass
18+
out.println "package ${modelClass.packageName}.entity;"
19+
out.println ""
20+
out.println "public class ${modelClass.shortClassName} {"
21+
modelClass.allFields.each { field ->
22+
out.println " private ${field.shortTypeName} ${field.variableName};"
23+
}
24+
modelClass.allFields.each { field ->
25+
out.println ""
26+
out.println " public ${field.shortTypeName} get${field.variableName.capitalize()}() {"
27+
out.println " return ${field.variableName};"
28+
out.println " }"
29+
out.println ""
30+
out.println " public void set${field.variableName.capitalize()}(${field.shortTypeName} ${field.variableName}) {"
31+
out.println " this.${field.variableName} = ${field.variableName};"
32+
out.println " }"
33+
}
34+
out.println "}"
35+
}
36+
}
37+
38+
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import tech.wetech.flexmodel.codegen.AbstractGenerator
2+
import tech.wetech.flexmodel.codegen.GenerationContext
3+
import tech.wetech.flexmodel.codegen.ModelClass
4+
5+
import java.nio.file.Path
6+
7+
class MapperInterfaceGenerator extends AbstractGenerator {
8+
9+
@Override
10+
String getTargetFile(GenerationContext context, String targetDirectory) {
11+
ModelClass modelClass = context.modelClass
12+
return Path.of(targetDirectory, modelClass.shortClassName + 'Mapper.java').toString()
13+
}
14+
15+
@Override
16+
void writeModel(PrintWriter out, GenerationContext context) {
17+
def modelClass = context.modelClass
18+
out.println "package ${modelClass.packageName}.mapper;"
19+
out.println ""
20+
out.println "import java.util.List;"
21+
out.println "import java.util.Collection;"
22+
out.println "import org.apache.ibatis.annotations.Mapper;"
23+
out.println "import org.apache.ibatis.annotations.Param;"
24+
out.println "import ${modelClass.packageName}.entity.${modelClass.shortClassName};"
25+
out.println ""
26+
out.println "@Mapper"
27+
out.println "public interface ${modelClass.shortClassName}Mapper {"
28+
out.println " List<${modelClass.shortClassName}> findAll();"
29+
out.println ""
30+
out.println " ${modelClass.shortClassName} findById(@Param(\"id\") Long id);"
31+
out.println ""
32+
out.println " int insert(${modelClass.shortClassName} entity);"
33+
out.println ""
34+
out.println " int insertBatch(@Param(\"list\") List<${modelClass.shortClassName}> entities);"
35+
out.println ""
36+
out.println " int update(${modelClass.shortClassName} entity);"
37+
out.println ""
38+
out.println " int deleteById(@Param(\"id\") Long id);"
39+
out.println ""
40+
out.println " int deleteByIds(@Param(\"ids\") List<Long> ids);"
41+
out.println ""
42+
out.println " List<${modelClass.shortClassName}> findByIds(@Param(\"ids\") List<Long> ids);"
43+
out.println ""
44+
out.println " List<${modelClass.shortClassName}> findPage(@Param(\"offset\") int offset, @Param(\"limit\") int limit);"
45+
out.println ""
46+
out.println " long count();"
47+
out.println ""
48+
out.println " int existsById(@Param(\"id\") Long id);"
49+
out.println "}"
50+
}
51+
}
52+
53+
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import tech.wetech.flexmodel.codegen.AbstractGenerator
2+
import tech.wetech.flexmodel.codegen.GenerationContext
3+
import tech.wetech.flexmodel.codegen.ModelClass
4+
5+
import java.nio.file.Path
6+
7+
class ServiceGenerator extends AbstractGenerator {
8+
9+
@Override
10+
String getTargetFile(GenerationContext context, String targetDirectory) {
11+
ModelClass modelClass = context.modelClass
12+
return Path.of(targetDirectory, modelClass.shortClassName + 'Service.java').toString()
13+
}
14+
15+
@Override
16+
void writeModel(PrintWriter out, GenerationContext context) {
17+
def modelClass = context.modelClass
18+
out.println "package ${modelClass.packageName}.service;"
19+
out.println ""
20+
out.println "import java.util.List;"
21+
out.println "import org.springframework.stereotype.Service;"
22+
out.println "import org.springframework.transaction.annotation.Transactional;"
23+
out.println "import ${modelClass.packageName}.entity.${modelClass.shortClassName};"
24+
out.println "import ${modelClass.packageName}.mapper.${modelClass.shortClassName}Mapper;"
25+
out.println ""
26+
out.println "@Service"
27+
out.println "@Transactional(readOnly = true)"
28+
out.println "public class ${modelClass.shortClassName}Service {"
29+
out.println " private final ${modelClass.shortClassName}Mapper mapper;"
30+
out.println ""
31+
out.println " public ${modelClass.shortClassName}Service(${modelClass.shortClassName}Mapper mapper) {"
32+
out.println " this.mapper = mapper;"
33+
out.println " }"
34+
out.println ""
35+
out.println " public List<${modelClass.shortClassName}> list() {"
36+
out.println " return mapper.findAll();"
37+
out.println " }"
38+
out.println ""
39+
out.println " public List<${modelClass.shortClassName}> page(int offset, int limit) {"
40+
out.println " return mapper.findPage(offset, limit);"
41+
out.println " }"
42+
out.println ""
43+
out.println " public ${modelClass.shortClassName} get(Long id) {"
44+
out.println " return mapper.findById(id);"
45+
out.println " }"
46+
out.println ""
47+
out.println " @Transactional"
48+
out.println " public Long create(${modelClass.shortClassName} entity) {"
49+
out.println " mapper.insert(entity);"
50+
out.println " return entity.getId();"
51+
out.println " }"
52+
out.println ""
53+
out.println " @Transactional"
54+
out.println " public int createBatch(List<${modelClass.shortClassName}> entities) {"
55+
out.println " return mapper.insertBatch(entities);"
56+
out.println " }"
57+
out.println ""
58+
out.println " @Transactional"
59+
out.println " public void update(${modelClass.shortClassName} entity) {"
60+
out.println " mapper.update(entity);"
61+
out.println " }"
62+
out.println ""
63+
out.println " @Transactional"
64+
out.println " public void delete(Long id) {"
65+
out.println " mapper.deleteById(id);"
66+
out.println " }"
67+
out.println ""
68+
out.println " @Transactional"
69+
out.println " public void deleteByIds(List<Long> ids) {"
70+
out.println " mapper.deleteByIds(ids);"
71+
out.println " }"
72+
out.println ""
73+
out.println " public List<${modelClass.shortClassName}> findByIds(List<Long> ids) {"
74+
out.println " return mapper.findByIds(ids);"
75+
out.println " }"
76+
out.println ""
77+
out.println " public long count() {"
78+
out.println " return mapper.count();"
79+
out.println " }"
80+
out.println ""
81+
out.println " public boolean existsById(Long id) {"
82+
out.println " return mapper.existsById(id) > 0;"
83+
out.println " }"
84+
out.println "}"
85+
}
86+
}
87+
88+

0 commit comments

Comments
 (0)