Skip to content

Commit c34fccc

Browse files
committed
1.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化.
1 parent c5fadb3 commit c34fccc

File tree

12 files changed

+122
-124
lines changed

12 files changed

+122
-124
lines changed

README.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,37 @@
66

77
SpringBootCodeGenerator
88
----
9-
基于SpringBoot2+Freemarker的代码生成器,用DDL SQL语句生成JPA/JdbcTemplate/Mybatis/BeetlSQL相关代码,支持mysql/oracle/pgsql等三大数据库。以释放双手为目的,各大模板也在陆续补充和优化。欢迎大家Issue提交模板和交流想法,也欢迎提交PullRequest!
10-
<br><br>
9+
基于SpringBoot2+Freemarker的代码生成器,√以释放双手为目的,√支持mysql/oracle/pgsql三大数据库,<br>
10+
√用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。<br><br>
1111
另外,感谢bejson三叔将他部署在 http://java.bejson.com/generator 上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢)。
1212
<br><br>
1313
<table><tbody>
1414
<tr><td>访问路径</td> <td>http://127.0.0.1:1234/generator</td></tr>
1515
<tr><td>在线地址</td> <td>http://java.bejson.com/generator</td></tr>
16-
<tr><td>CSDN博客</td> <td>http://blog.csdn.net/moshowgame</td></tr>
16+
<tr><td>CSDN博客</td> <td>http://zhengkai.blog.csdn.net</td></tr>
1717
<tr><td></td> <td></td></tr>
1818
<tr><td>更新日期</td> <td>更新内容</td></tr>
19+
<tr><td>20191115<td>1.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化. </td></tr>
1920
<tr><td>20191015<td>修复jdbcTemplates中insert语句第一个字段丢失的问题。 </td></tr>
20-
<tr><td>20190915<td>1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用感谢@gaohanghang 的pull request </td></tr>
21+
<tr><td>20190915<td>1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request) </td></tr>
2122
<tr><td>20190910-2<td>优化以及更新Maven依赖,减少打包体积。 </td></tr>
22-
<tr><td>20190910-1<td>1.修复mapper接口load方法,但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解,会影响xml的解析感谢@caojiantao的反馈。3.优化MyBatis的xml文件对Oracle的支持。感谢@wylove1992的反馈 4.新增对boolean的处理感谢@violinxsc的反馈以及优化tinyint类型生成boolean类型问题感谢@hahaYhui的反馈 </td></tr>
23-
<tr><td>20190909<td>添加是否下划线转换为驼峰的选择感谢@youngking28 的pull request。</td></tr>
24-
<tr><td>20190518<td>1.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper感谢@unqin的pull request</td></tr>
25-
<tr><td>20190511<td>优化mybatis模块的dao和xml模板,修改dao接口注解为@Repository,所有dao参数改为包装类,删除update语句最后的UpdateTime = NOW(),修改dao接口文件的方法注释使其更符合javaDoc的标准,修改insert语句增加插入行主键的返回,修改load的方法名为selectByPrimaryKey,修改xml的update语句新增动态if判空,修改xml的insert语句新增动态插入判空,更符合mybatisGenerator标准感谢@Archer-Wen的贡献 。</td></tr>
26-
<tr><td>20190429<td>新增返回封装工具类设置,优化对oracle注释comment on column的支持感谢@liukex反馈,优化对普通和特殊storage关键字的判断感谢@AhHeadFloating的反馈 。</td></tr>
27-
<tr><td>20190211<td>提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类感谢@liutf和@tfgzs的pull request。</td></tr>
28-
<tr><td>20190210<td>实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法感谢@h2so的pull request。</td></tr>
29-
<tr><td>20190106<td>修复处理number/decimal(x,x)类型的逻辑感谢@arthaschan的反馈,修复JdbcTemplates模板两处错误感谢@everflourish的反馈。</td></tr>
30-
<tr><td>20181212<td>首页UI优化,新增MybatisPlus模块感谢@三叔同事的建议,修复作者名和包名获取失败问题感谢@Yanch1994的反馈。</td></tr>
31-
<tr><td>20181122<td>优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断感谢@lshz0088的指导。</td></tr>
32-
<tr><td>20181108<td>修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况感谢@tornadoorz反馈。</td></tr>
33-
<tr><td>20181018<td>支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理感谢@tanwubo的反馈。</td></tr>
23+
<tr><td>20190910-1<td>1.修复mapper接口load方法,但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解,会影响xml的解析(感谢@caojiantao的反馈)。3.优化MyBatis的xml文件对Oracle的支持。(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈) </td></tr>
24+
<tr><td>20190909<td>添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request)。</td></tr>
25+
<tr><td>20190518<td>1.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)</td></tr>
26+
<tr><td>20190511<td>优化mybatis模块的dao和xml模板,修改dao接口注解为@Repository,所有dao参数改为包装类,删除update语句最后的UpdateTime = NOW(),修改dao接口文件的方法注释使其更符合javaDoc的标准,修改insert语句增加插入行主键的返回,修改load的方法名为selectByPrimaryKey,修改xml的update语句新增动态if判空,修改xml的insert语句新增动态插入判空,更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 )。</td></tr>
27+
<tr><td>20190429<td>新增返回封装工具类设置,优化对oracle注释comment on column的支持(感谢@liukex反馈),优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 )。</td></tr>
28+
<tr><td>20190211<td>提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类(感谢@liutf和@tfgzs的pull request)。</td></tr>
29+
<tr><td>20190210<td>实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request)。</td></tr>
30+
<tr><td>20190106<td>修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈),修复JdbcTemplates模板两处错误(感谢@everflourish的反馈)。</td></tr>
31+
<tr><td>20181212<td>首页UI优化,新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈)。</td></tr>
32+
<tr><td>20181122<td>优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断(感谢@lshz0088的指导)。</td></tr>
33+
<tr><td>20181108<td>修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈)。</td></tr>
34+
<tr><td>20181018<td>支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈)。</td></tr>
3435
<tr><td>20181010<td>CDN变更,修复CDN不稳定导致网页js报错问题。</td></tr>
3536
<tr><td>20181003<td>新增element-ui/bootstrap生成。</td></tr>
3637
<tr><td>20181002<td>修复公共CDN之Layer.js404问题,导致项目无法生成。</td></tr>
37-
<tr><td>20180927<td>优化COMMENT提取逻辑,支持多种复杂情况的注释感谢@raodeming的反馈。</td></tr>
38-
<tr><td>20180926<td>全新BeetlSQL模块,以及一些小细节优化感谢@三叔同事的建议。</td></tr>
38+
<tr><td>20180927<td>优化COMMENT提取逻辑,支持多种复杂情况的注释(感谢@raodeming的反馈)。</td></tr>
39+
<tr><td>20180926<td>全新BeetlSQL模块,以及一些小细节优化(感谢@三叔同事的建议)。</td></tr>
3940
<tr><td>20180925<td>优化SQL表和字段备注的推断,包括pgsql/oralce的comment on column/table情况处理等。</td></tr>
4041
<tr><td>20180918<td>优化SQL类型推断。优化PrimaryKey判断。修复jpacontroller中Repository拼写错误问题。</td></tr>
4142
<tr><td>20180917<td>全新首页,静态文件全部采用CDN。新增jdbcTemplate模块。</td></tr>
@@ -61,6 +62,5 @@ SpringBootCodeGenerator
6162
<img src="./codegenerator1.png">
6263
<img src="./codegenerator2.png">
6364
<img src="./codegenerator3.png">
64-
<img src="./codegenerator4.png">
6565
<img src="./donate.jpg">
66-
<table>
66+

codegenerator1.png

19.9 KB
Loading

codegenerator2.png

25.3 KB
Loading

codegenerator3.png

-4.17 KB
Loading

codegenerator4.png

-9.53 KB
Binary file not shown.

generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.softdev.system.generator.entity.ClassInfo;
44
import com.softdev.system.generator.entity.ReturnT;
5-
import com.softdev.system.generator.util.CodeGeneratorTool;
65
import com.softdev.system.generator.util.FreemarkerTool;
6+
import com.softdev.system.generator.util.TableParseUtil;
77
import freemarker.template.TemplateException;
88
import lombok.extern.slf4j.Slf4j;
99
import org.apache.commons.lang3.StringUtils;
@@ -40,8 +40,9 @@ public ReturnT<Map<String, String>> codeGenerate(String tableSql,
4040
@RequestParam(required = false, defaultValue = "大狼狗") String authorName,
4141
@RequestParam(required = false, defaultValue = "com.softdev.system")String packageName,
4242
@RequestParam(required = false, defaultValue = "ApiReturnUtil")String returnUtil,
43-
@RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase
44-
) {
43+
@RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase,
44+
@RequestParam(required = false, defaultValue = "boolean")String tinyintTransType
45+
) {
4546

4647

4748
try {
@@ -51,17 +52,17 @@ public ReturnT<Map<String, String>> codeGenerate(String tableSql,
5152
}
5253

5354
// parse table
54-
ClassInfo classInfo = CodeGeneratorTool.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase);
55+
ClassInfo classInfo = TableParseUtil.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase, tinyintTransType);
5556

5657
// code genarete
57-
Map<String, Object> params = new HashMap<String, Object>();
58+
Map<String, Object> params = new HashMap<String, Object>(8);
5859
params.put("classInfo", classInfo);
5960
params.put("authorName", authorName);
6061
params.put("packageName", packageName);
6162
params.put("returnUtil", returnUtil);
6263

6364
// result
64-
Map<String, String> result = new HashMap<String, String>();
65+
Map<String, String> result = new HashMap<String, String>(32);
6566

6667
//UI
6768
result.put("swagger-ui", freemarkerTool.processString("code-generator/ui/swagger-ui.ftl", params));

generator-web/src/main/java/com/softdev/system/generator/util/CodeGeneratorTool.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

generator-web/src/main/java/com/softdev/system/generator/util/FreemarkerUtil.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import freemarker.template.Template;
55
import freemarker.template.TemplateException;
66
import freemarker.template.TemplateExceptionHandler;
7-
import org.slf4j.Logger;
8-
import org.slf4j.LoggerFactory;
7+
import lombok.extern.slf4j.Slf4j;
98

109
import java.io.File;
1110
import java.io.IOException;
@@ -18,8 +17,8 @@
1817
*
1918
* @author xuxueli 2018-05-02 19:56:00
2019
*/
20+
@Slf4j
2121
public class FreemarkerUtil {
22-
private static final Logger logger = LoggerFactory.getLogger(CodeGeneratorTool.class);
2322

2423
/**
2524
* freemarker config
@@ -40,7 +39,7 @@ public class FreemarkerUtil {
4039
freemarkerConfig.setLocale(Locale.CHINA);
4140
freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
4241
} catch (IOException e) {
43-
logger.error(e.getMessage(), e);
42+
log.error(e.getMessage(), e);
4443
}
4544
}
4645

generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ public class TableParseUtil {
2424
* @param tableSql
2525
* @return
2626
*/
27-
public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase) throws IOException {
27+
public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase,String tinyintTransType)
28+
throws IOException {
2829
if (tableSql==null || tableSql.trim().length()==0) {
2930
throw new CodeGenerateException("Table structure can not be empty.");
3031
}
@@ -41,7 +42,9 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
4142
}
4243

4344
//新增处理create table if not exists members情况
44-
if (tableName.contains("if not exists")) tableName=tableName.replaceAll("if not exists","");
45+
if (tableName.contains("if not exists")) {
46+
tableName=tableName.replaceAll("if not exists","");
47+
}
4548

4649
if (tableName.contains("`")) {
4750
tableName = tableName.substring(tableName.indexOf("`")+1, tableName.lastIndexOf("`"));
@@ -101,20 +104,22 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
101104
String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")"));
102105

103106
// 匹配 comment,替换备注里的小逗号, 防止不小心被当成切割符号切割
104-
Matcher matcher = Pattern.compile("comment `(.*?)\\`").matcher(fieldListTmp); // "\\{(.*?)\\}"
105-
while(matcher.find()){
107+
String commentPattenStr1="comment `(.*?)\\`";
108+
Matcher matcher1 = Pattern.compile(commentPattenStr1).matcher(fieldListTmp);
109+
while(matcher1.find()){
106110

107-
String commentTmp = matcher.group();
111+
String commentTmp = matcher1.group();
108112
//2018-9-27 zhengk 不替换,只处理,支持COMMENT评论里面多种注释
109113
//commentTmp = commentTmp.replaceAll("\\ comment `|\\`", " "); // "\\{|\\}"
110114

111115
if (commentTmp.contains(",")) {
112116
String commentTmpFinal = commentTmp.replaceAll(",", ",");
113-
fieldListTmp = fieldListTmp.replace(matcher.group(), commentTmpFinal);
117+
fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal);
114118
}
115119
}
116120
//2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
117-
Matcher matcher2 = Pattern.compile("\\`(.*?)\\`").matcher(fieldListTmp); // "\\{(.*?)\\}"
121+
String commentPattenStr2="\\`(.*?)\\`";
122+
Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp);
118123
while(matcher2.find()){
119124
String commentTmp2 = matcher2.group();
120125
if (commentTmp2.contains(",")) {
@@ -123,7 +128,8 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
123128
}
124129
}
125130
//2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
126-
Matcher matcher3 = Pattern.compile("\\((.*?)\\)").matcher(fieldListTmp); // "\\{(.*?)\\}"
131+
String commentPattenStr3="\\((.*?)\\)";
132+
Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp);
127133
while(matcher3.find()){
128134
String commentTmp3 = matcher3.group();
129135
if (commentTmp3.contains(",")) {
@@ -148,7 +154,6 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
148154
&&!columnLine.contains("pctincrease")
149155
&&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace")
150156
&&!(columnLine.contains("primary")&&i>3));
151-
152157
if (specialFlag){
153158
//如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理
154159
if(columnLine.length()<5) {continue;}
@@ -157,9 +162,8 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
157162
columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim();
158163
//如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前
159164
columnName = columnLine.substring(0, columnLine.indexOf(" "));
160-
161165
// field Name
162-
// 2019-09-08 yj 添加是否下划线转换为驼峰的判断
166+
// 2019-09-08 yj 添加是否下划线转换为驼峰的判断
163167
String fieldName;
164168
if(isUnderLineToCamelCase){
165169
fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName));
@@ -184,7 +188,7 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
184188
fieldClass = Float.class.getSimpleName();
185189
} else if (columnLine.contains("double")) {
186190
fieldClass = Double.class.getSimpleName();
187-
} else if (columnLine.contains("datetime") || columnLine.contains("timestamp")) {
191+
} else if (columnLine.contains("time") || columnLine.contains("date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) {
188192
fieldClass = Date.class.getSimpleName();
189193
} else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char")
190194
|| columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) {
@@ -221,9 +225,12 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
221225
}else{
222226
fieldClass = BigDecimal.class.getSimpleName();
223227
}
224-
} else if (columnLine.contains("boolean")|| columnLine.contains("tinyint") ) {
228+
} else if (columnLine.contains("boolean")) {
225229
//20190910 MOSHOW.K.ZHENG 新增对boolean的处理(感谢@violinxsc的反馈)以及修复tinyint类型字段无法生成boolean类型问题(感谢@hahaYhui的反馈)
226230
fieldClass = Boolean.class.getSimpleName();
231+
} else if (columnLine.contains("tinyint") ) {
232+
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
233+
fieldClass=tinyintTransType;
227234
} else {
228235
fieldClass = String.class.getSimpleName();
229236
}

generator-web/src/main/resources/templates/code-generator/mybatis/mybatis.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
</#if>
2020
</sql>
2121

22-
<insert id="insert" useGeneratedKeys="true" keyColumn="id" parameterType="${packageName}.entity.${classInfo.className}Entity">
22+
<insert id="insert" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="${packageName}.entity.${classInfo.className}Entity">
2323
INSERT INTO ${classInfo.tableName}
2424
<trim prefix="(" suffix=")" suffixOverrides=",">
2525
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>

0 commit comments

Comments
 (0)