Skip to content

Commit 5a47112

Browse files
committed
optimize the comment of table and column .support the issue of comment on column and comment on table .
1 parent 8a2d198 commit 5a47112

2 files changed

Lines changed: 52 additions & 17 deletions

File tree

README.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66

77
SpringBootCodeGenerator
88
----
9-
基于SpringBoot2+Freemarker的代码生成器用DDL语句生成JPA/JdbcTemplate/Mybatis相关代码,目前以JPA的为主,各大模板也在陆续优化。
9+
基于SpringBoot2+Freemarker的代码生成器用DDL语句生成JPA/JdbcTemplate/Mybatis相关代码,支持mysql/oracle/pgsql三大数据库。目前以JPA的为主,各大模板也在陆续优化。欢迎大家提交模板和交流想法!
1010
<br><br>
11-
感谢bejson三叔将他部署在http://java.bejson.com/generator上
11+
另外,感谢bejson三叔将他部署在http://java.bejson.com/generator上
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>
1616
<tr><td>CSDN博客</td> <td>http://blog.csdn.net/moshowgame</td></tr>
1717
<tr><td></td> <td></td></tr>
1818
<tr><td>更新日期</td> <td>更新内容</td></tr>
19+
<tr><td>20180925<td>优化SQL表和字段备注的推断,包括pgsql/oralce的comment on column/table情况处理等。</td></tr>
1920
<tr><td>20180918<td>优化SQL类型推断。优化PrimaryKey判断。修复jpacontroller中Repository拼写错误问题。</td></tr>
2021
<tr><td>20180917<td>全新首页,静态文件全部采用CDN。新增jdbcTemplate模块。</td></tr>
2122
<tr><td>20180916-2<td>优化oracle支持,优化DDL语句中"或者'或者空格的支持。</td></tr>
@@ -24,6 +25,16 @@ SpringBootCodeGenerator
2425
<tr><td>20180913<td>修复字段没有描述以及类型为DATE型导致的问题。新增JPA的Controller模板。</td></tr>
2526
<tr><td>20180831<td>初始化项目。新增JPA系列Entity+Repository模板。</td></tr>
2627
</tbody></table>
28+
29+
<table><tbody>
30+
<tr><td>类名</td> <td>说明</td></tr>
31+
<tr><td>tableName</td> <td>sql中的表名</td></tr>
32+
<tr><td>className</td> <td>java类名</td></tr>
33+
<tr><td>classComment</td> <td>java类备注</td></tr>
34+
<tr><td>fieldName</td> <td>字段名</td></tr>
35+
<tr><td>fieldComment</td> <td>字段备注</td></tr>
36+
</tbody></table>
37+
2738
<img src="./codegenerator1.png">
2839
<img src="./codegenerator2.png">
2940
<img src="./codegenerator3.png">

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

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static ClassInfo processTableIntoClassInfo(String tableSql) throws IOExce
2929
if (tableSql==null || tableSql.trim().length()==0) {
3030
throw new CodeGenerateException("Table structure can not be empty.");
3131
}
32-
tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").toLowerCase();
32+
tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").replaceAll(",",",").toLowerCase();
3333

3434
// table Name
3535
String tableName = null;
@@ -65,33 +65,47 @@ public static ClassInfo processTableIntoClassInfo(String tableSql) throws IOExce
6565

6666
// class Comment
6767
String classComment = null;
68-
if (tableSql.contains("COMMENT=")) {
69-
String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("COMMENT=")+8).trim();
70-
if (classCommentTmp.contains("'") || classCommentTmp.indexOf("'")!=classCommentTmp.lastIndexOf("'")) {
71-
classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf("'")+1, classCommentTmp.lastIndexOf("'"));
68+
//mysql是comment=,pgsql/oracle是comment on table,
69+
if (tableSql.contains("comment=")) {
70+
String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment=")+8).replaceAll("`","").trim();
71+
if (classCommentTmp.indexOf(" ")!=classCommentTmp.lastIndexOf(" ")) {
72+
classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf(" ")+1, classCommentTmp.lastIndexOf(" "));
7273
}
7374
if (classCommentTmp!=null && classCommentTmp.trim().length()>0) {
7475
classComment = classCommentTmp;
7576
}else{
7677
//修复表备注为空问题
7778
classComment = className;
7879
}
80+
}else if(tableSql.contains("comment on table")) {
81+
//COMMENT ON TABLE CT_BAS_FEETYPE IS 'CT_BAS_FEETYPE';
82+
String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment on table")+17).trim();
83+
//证明这是一个常规的COMMENT ON TABLE xxx IS 'xxxx'
84+
if (classCommentTmp.contains("`")) {
85+
classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf("`")+1);
86+
classCommentTmp = classCommentTmp.substring(0,classCommentTmp.indexOf("`"));
87+
classComment = classCommentTmp;
88+
}else{
89+
//非常规的没法分析
90+
classComment = tableName;
91+
}
7992
}else{
8093
//修复表备注为空问题
81-
classComment = className;
94+
classComment = tableName;
8295
}
8396

8497
// field List
8598
List<FieldInfo> fieldList = new ArrayList<FieldInfo>();
8699

100+
// 正常( ) 内的一定是字段相关的定义。
87101
String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")"));
88102

89-
// replave "," by "," in comment
90-
Matcher matcher = Pattern.compile("\\ COMMENT '(.*?)\\'").matcher(fieldListTmp); // "\\{(.*?)\\}"
103+
// 匹配 comment,替换备注里的小逗号, 防止不小心被当成切割符号切割
104+
Matcher matcher = Pattern.compile("\\ comment '(.*?)\\'").matcher(fieldListTmp); // "\\{(.*?)\\}"
91105
while(matcher.find()){
92106

93107
String commentTmp = matcher.group();
94-
commentTmp = commentTmp.replaceAll("\\ COMMENT '|\\'", ""); // "\\{|\\}"
108+
commentTmp = commentTmp.replaceAll("\\ comment '|\\'", ""); // "\\{|\\}"
95109

96110
if (commentTmp.contains(",")) {
97111
String commentTmpFinal = commentTmp.replaceAll(",", ",");
@@ -150,14 +164,24 @@ public static ClassInfo processTableIntoClassInfo(String tableSql) throws IOExce
150164
fieldClass = String.class.getSimpleName();
151165
}
152166

153-
// field comment
167+
// field comment,MySQL的一般位于field行,而pgsql和oralce多位于后面。
154168
String fieldComment = null;
155-
if (columnLine.contains("COMMENT")) {
156-
String commentTmp = fieldComment = columnLine.substring(columnLine.indexOf("COMMENT")+7).trim(); // '用户ID',
157-
if (commentTmp.contains("'") || commentTmp.indexOf("'")!=commentTmp.lastIndexOf("'")) {
158-
commentTmp = commentTmp.substring(commentTmp.indexOf("'")+1, commentTmp.lastIndexOf("'"));
169+
if (columnLine.contains("comment")) {
170+
String commentTmp = columnLine.substring(columnLine.indexOf("comment")+7).trim(); // '用户ID',
171+
if (commentTmp.contains("`") || commentTmp.indexOf("`")!=commentTmp.lastIndexOf("`")) {
172+
commentTmp = commentTmp.substring(commentTmp.indexOf("`")+1, commentTmp.lastIndexOf("`"));
159173
}
160174
fieldComment = commentTmp;
175+
}else if(tableSql.contains("comment on column")&&tableSql.contains("."+columnName+" is `")){
176+
//新增对pgsql/oracle的字段备注支持
177+
//COMMENT ON COLUMN public.check_info.check_name IS '检查者名称';
178+
Matcher columnCommentMatcher = Pattern.compile("."+columnName+" is `").matcher(tableSql); // "\\{(.*?)\\}"
179+
while(columnCommentMatcher.find()){
180+
String columnCommentTmp = columnCommentMatcher.group();
181+
System.out.println(columnCommentTmp);
182+
fieldComment = tableSql.substring(tableSql.indexOf(columnCommentTmp)+columnCommentTmp.length()).trim();
183+
fieldComment = fieldComment.substring(0,fieldComment.indexOf("`")).trim();
184+
}
161185
}else{
162186
//修复comment不存在导致报错的问题
163187
fieldComment = columnName;
@@ -175,7 +199,7 @@ public static ClassInfo processTableIntoClassInfo(String tableSql) throws IOExce
175199
}
176200

177201
if (fieldList.size() < 1) {
178-
throw new CodeGenerateException("Table structure anomaly.");
202+
throw new CodeGenerateException("表结构分析失败,请检查语句或者提交issue给我");
179203
}
180204

181205
ClassInfo codeJavaInfo = new ClassInfo();

0 commit comments

Comments
 (0)