Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 20 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,37 @@

SpringBootCodeGenerator
----
基于SpringBoot2+Freemarker的代码生成器,用DDL SQL语句生成JPA/JdbcTemplate/Mybatis/BeetlSQL相关代码,支持mysql/oracle/pgsql等三大数据库。以释放双手为目的,各大模板也在陆续补充和优化。欢迎大家Issue提交模板和交流想法,也欢迎提交PullRequest!
<br><br>
基于SpringBoot2+Freemarker的代码生成器,√以释放双手为目的,√支持mysql/oracle/pgsql三大数据库,<br>
√用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。<br><br>
另外,感谢bejson三叔将他部署在 http://java.bejson.com/generator 上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢)。
<br><br>
<table><tbody>
<tr><td>访问路径</td> <td>http://127.0.0.1:1234/generator</td></tr>
<tr><td>在线地址</td> <td>http://java.bejson.com/generator</td></tr>
<tr><td>CSDN博客</td> <td>http://blog.csdn.net/moshowgame</td></tr>
<tr><td>CSDN博客</td> <td>http://zhengkai.blog.csdn.net</td></tr>
<tr><td></td> <td></td></tr>
<tr><td>更新日期</td> <td>更新内容</td></tr>
<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>
<tr><td>20191015<td>修复jdbcTemplates中insert语句第一个字段丢失的问题。 </td></tr>
<tr><td>20190915<td>1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用感谢@gaohanghang 的pull request </td></tr>
<tr><td>20190915<td>1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request) </td></tr>
<tr><td>20190910-2<td>优化以及更新Maven依赖,减少打包体积。 </td></tr>
<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>
<tr><td>20190909<td>添加是否下划线转换为驼峰的选择感谢@youngking28 的pull request。</td></tr>
<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>
<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>
<tr><td>20190429<td>新增返回封装工具类设置,优化对oracle注释comment on column的支持感谢@liukex反馈,优化对普通和特殊storage关键字的判断感谢@AhHeadFloating的反馈 。</td></tr>
<tr><td>20190211<td>提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类感谢@liutf和@tfgzs的pull request。</td></tr>
<tr><td>20190210<td>实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法感谢@h2so的pull request。</td></tr>
<tr><td>20190106<td>修复处理number/decimal(x,x)类型的逻辑感谢@arthaschan的反馈,修复JdbcTemplates模板两处错误感谢@everflourish的反馈。</td></tr>
<tr><td>20181212<td>首页UI优化,新增MybatisPlus模块感谢@三叔同事的建议,修复作者名和包名获取失败问题感谢@Yanch1994的反馈。</td></tr>
<tr><td>20181122<td>优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断感谢@lshz0088的指导。</td></tr>
<tr><td>20181108<td>修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况感谢@tornadoorz反馈。</td></tr>
<tr><td>20181018<td>支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理感谢@tanwubo的反馈。</td></tr>
<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>
<tr><td>20190909<td>添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request)。</td></tr>
<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>
<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>
<tr><td>20190429<td>新增返回封装工具类设置,优化对oracle注释comment on column的支持(感谢@liukex反馈),优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 )。</td></tr>
<tr><td>20190211<td>提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类(感谢@liutf和@tfgzs的pull request)。</td></tr>
<tr><td>20190210<td>实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request)。</td></tr>
<tr><td>20190106<td>修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈),修复JdbcTemplates模板两处错误(感谢@everflourish的反馈)。</td></tr>
<tr><td>20181212<td>首页UI优化,新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈)。</td></tr>
<tr><td>20181122<td>优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断(感谢@lshz0088的指导)。</td></tr>
<tr><td>20181108<td>修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈)。</td></tr>
<tr><td>20181018<td>支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈)。</td></tr>
<tr><td>20181010<td>CDN变更,修复CDN不稳定导致网页js报错问题。</td></tr>
<tr><td>20181003<td>新增element-ui/bootstrap生成。</td></tr>
<tr><td>20181002<td>修复公共CDN之Layer.js404问题,导致项目无法生成。</td></tr>
<tr><td>20180927<td>优化COMMENT提取逻辑,支持多种复杂情况的注释感谢@raodeming的反馈。</td></tr>
<tr><td>20180926<td>全新BeetlSQL模块,以及一些小细节优化感谢@三叔同事的建议。</td></tr>
<tr><td>20180927<td>优化COMMENT提取逻辑,支持多种复杂情况的注释(感谢@raodeming的反馈)。</td></tr>
<tr><td>20180926<td>全新BeetlSQL模块,以及一些小细节优化(感谢@三叔同事的建议)。</td></tr>
<tr><td>20180925<td>优化SQL表和字段备注的推断,包括pgsql/oralce的comment on column/table情况处理等。</td></tr>
<tr><td>20180918<td>优化SQL类型推断。优化PrimaryKey判断。修复jpacontroller中Repository拼写错误问题。</td></tr>
<tr><td>20180917<td>全新首页,静态文件全部采用CDN。新增jdbcTemplate模块。</td></tr>
Expand All @@ -61,6 +62,5 @@ SpringBootCodeGenerator
<img src="./codegenerator1.png">
<img src="./codegenerator2.png">
<img src="./codegenerator3.png">
<img src="./codegenerator4.png">
<img src="./donate.jpg">
<table>

Binary file modified codegenerator1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified codegenerator2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified codegenerator3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed codegenerator4.png
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import com.softdev.system.generator.entity.ClassInfo;
import com.softdev.system.generator.entity.ReturnT;
import com.softdev.system.generator.util.CodeGeneratorTool;
import com.softdev.system.generator.util.FreemarkerTool;
import com.softdev.system.generator.util.TableParseUtil;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -40,8 +40,9 @@ public ReturnT<Map<String, String>> codeGenerate(String tableSql,
@RequestParam(required = false, defaultValue = "大狼狗") String authorName,
@RequestParam(required = false, defaultValue = "com.softdev.system")String packageName,
@RequestParam(required = false, defaultValue = "ApiReturnUtil")String returnUtil,
@RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase
) {
@RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase,
@RequestParam(required = false, defaultValue = "boolean")String tinyintTransType
) {


try {
Expand All @@ -51,17 +52,17 @@ public ReturnT<Map<String, String>> codeGenerate(String tableSql,
}

// parse table
ClassInfo classInfo = CodeGeneratorTool.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase);
ClassInfo classInfo = TableParseUtil.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase, tinyintTransType);

// code genarete
Map<String, Object> params = new HashMap<String, Object>();
Map<String, Object> params = new HashMap<String, Object>(8);
params.put("classInfo", classInfo);
params.put("authorName", authorName);
params.put("packageName", packageName);
params.put("returnUtil", returnUtil);

// result
Map<String, String> result = new HashMap<String, String>();
Map<String, String> result = new HashMap<String, String>(32);

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

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
Expand All @@ -18,8 +17,8 @@
*
* @author xuxueli 2018-05-02 19:56:00
*/
@Slf4j
public class FreemarkerUtil {
private static final Logger logger = LoggerFactory.getLogger(CodeGeneratorTool.class);

/**
* freemarker config
Expand All @@ -40,7 +39,7 @@ public class FreemarkerUtil {
freemarkerConfig.setLocale(Locale.CHINA);
freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
} catch (IOException e) {
logger.error(e.getMessage(), e);
log.error(e.getMessage(), e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class TableParseUtil {
* @param tableSql
* @return
*/
public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase) throws IOException {
public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase,String tinyintTransType)
throws IOException {
if (tableSql==null || tableSql.trim().length()==0) {
throw new CodeGenerateException("Table structure can not be empty.");
}
Expand All @@ -41,7 +42,9 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
}

//新增处理create table if not exists members情况
if (tableName.contains("if not exists")) tableName=tableName.replaceAll("if not exists","");
if (tableName.contains("if not exists")) {
tableName=tableName.replaceAll("if not exists","");
}

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

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

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

if (commentTmp.contains(",")) {
String commentTmpFinal = commentTmp.replaceAll(",", ",");
fieldListTmp = fieldListTmp.replace(matcher.group(), commentTmpFinal);
fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal);
}
}
//2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
Matcher matcher2 = Pattern.compile("\\`(.*?)\\`").matcher(fieldListTmp); // "\\{(.*?)\\}"
String commentPattenStr2="\\`(.*?)\\`";
Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp);
while(matcher2.find()){
String commentTmp2 = matcher2.group();
if (commentTmp2.contains(",")) {
Expand All @@ -123,7 +128,8 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
}
}
//2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
Matcher matcher3 = Pattern.compile("\\((.*?)\\)").matcher(fieldListTmp); // "\\{(.*?)\\}"
String commentPattenStr3="\\((.*?)\\)";
Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp);
while(matcher3.find()){
String commentTmp3 = matcher3.group();
if (commentTmp3.contains(",")) {
Expand All @@ -148,7 +154,6 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
&&!columnLine.contains("pctincrease")
&&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace")
&&!(columnLine.contains("primary")&&i>3));

if (specialFlag){
//如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理
if(columnLine.length()<5) {continue;}
Expand All @@ -157,9 +162,8 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim();
//如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前
columnName = columnLine.substring(0, columnLine.indexOf(" "));

// field Name
// 2019-09-08 yj 添加是否下划线转换为驼峰的判断
// 2019-09-08 yj 添加是否下划线转换为驼峰的判断
String fieldName;
if(isUnderLineToCamelCase){
fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName));
Expand All @@ -184,7 +188,7 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
fieldClass = Float.class.getSimpleName();
} else if (columnLine.contains("double")) {
fieldClass = Double.class.getSimpleName();
} else if (columnLine.contains("datetime") || columnLine.contains("timestamp")) {
} else if (columnLine.contains("time") || columnLine.contains("date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) {
fieldClass = Date.class.getSimpleName();
} else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char")
|| columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) {
Expand Down Expand Up @@ -221,9 +225,12 @@ public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnd
}else{
fieldClass = BigDecimal.class.getSimpleName();
}
} else if (columnLine.contains("boolean")|| columnLine.contains("tinyint") ) {
} else if (columnLine.contains("boolean")) {
//20190910 MOSHOW.K.ZHENG 新增对boolean的处理(感谢@violinxsc的反馈)以及修复tinyint类型字段无法生成boolean类型问题(感谢@hahaYhui的反馈)
fieldClass = Boolean.class.getSimpleName();
} else if (columnLine.contains("tinyint") ) {
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
fieldClass=tinyintTransType;
} else {
fieldClass = String.class.getSimpleName();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
</#if>
</sql>

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