利用业余时间撸了一个Spring Jpa代码生成器jpa-codegen

简介

这是一款基于Freemarker模板驱动的代码生成器。

依据现有的实体类代码,自动生成CRUD代码,解放双手,加快开发速度。

生成的代码包括但不仅限于(可以自定义生成模块)

  • Form表单代码
  • Repository代码
  • Service代码
  • Controller代码

SpringBoot使用示例

克隆示例项目,体会解放双手的美妙感受!

如何使用

导入仓库

maven {
url 'https://dl.bintray.com/gcdd1993/maven'
}
dependencies {
// jpa code generator
testCompile 'io.github.gcdd1993:jpa-codegen:v1.0.1'
testCompile 'org.freemarker:freemarker:2.3.28'
}

配置代码生成器

配置文件

## 作者
author=gcdd1993
## 代码注释
comments=code generated by jpa-codegen
## 是否覆盖原文件,除非特殊情况,不然请不要覆盖
cover=false
## 代码模板目录
template.dir=src/test/resources/template/
## 实体类包名 Deprecated从v1.0.1开始从配置文件中移除
- entity.package=com.maxtropy.sample.entity
## 实体类标识符 Deprecated从v1.0.1开始从配置文件中移除
- entity.flag=entity
## 以下配置是模块配置(格式 模块名.配置名),必须在模板目录下提供与模块名相同的模板
## 生成的代码后缀
repository.suffix=Repository
## 模板名称
repository.template=repository.ftl
## 模块标识符
repository.flag=entity.repo service.suffix=Service
service.template=service.ftl
service.flag=service
form.suffix=Form
form.template=form.ftl
form.flag=form
controller.suffix=Controller
controller.template=controller.ftl
controller.flag=web

其中

repository.suffix=Repository
repository.template=repository.ftl
repository.flag=entity.repo

是模块配置,什么是模块?

编写代码模板

模板主要基于Freemarker,如Spring Boot2.x代码模板可以像下面这样

package ${packageName};

import ${entity.packageName}.${entity.className};
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
<#list imports as import>
import ${import};
</#list> /**
* repository for ${entity.className} generated by jpa-codegen
* ${comments}
*
* @author ${author}
* Created On ${date}.
*/
public interface ${className} extends JpaRepository<${entity.className}, ${entity.id.className}>, QuerydslPredicateExecutor<${entity.className}> {
}

编写生成器入口

在test模块中编写生成器入口,如

public class Codegen {

    @Test
public void generate() {
new CodeGenerator("src/test/resources/codegen.properties")
.registerRender("repository")
.generate();
} }

然后运行generate(),在项目目录下将会生成

生成的代码完全由模板以及实体类信息决定。

如何编写模板?

模板完全基于FreeMarker以及实体类信息,FreeMarker参考FreeMarker Docs

支持的元素定义如下

基本信息

Freemarker元素 解释 示例输出
${ftlName} 模板名称 controller.ftl
${ftlPath} 模板目录 src/main/resources/template/
${savePath} 保存路径 src/main/resources/io/github/gcdd1993/controller
${packageName} java文件包名 io.github.gcdd1993.controller
${className} java文件类名 UserController
${author} 作者 gaochen
${date} 创建日期,默认为当前日期 2019/6/23
${comments} 注释信息 generated by jpa-codegen
${imports} java文件引入信息 org.springframework.beans.factory.annotation.Autowired

实体信息

Freemarker元素 解释 示例输出
${entity.className} 实体类名,class.getSimpleName() User
${entity.packageName} 实体包名,class.getPackage().getName() io.github.gcdd1993
${entity.tableName} 实体表名,@Table(name="") sys_user
${entity.id.className} 实体主键类名,@Id注释的字段的类名 Integer
${entity.id.packageName} 实体主键包名,@Id注释的字段的包名 java.lang
${entity.fields.className} 实体所有字段(只支持基本类型)类名 String
${entity.fields.packageName} 实体所有字段(只支持基本类型)包名 java.lang
${entity.fields.name} 实体所有字段(只支持基本类型)属性名 name
${entity.fields.annotations.className} 实体所有字段注解的类名 Id
${entity.fields.annotations.packageName} 实体所有字段注解的包名 javax.persistence

自定义配置

除了以上默认的信息之外,可能会有额外的信息需要填入生成的代码中,jpa-codegen提供直接将配置文件中的配置渲染到模板的能力。

例如在配置文件autogen.properties写下一行

custom.additional.comment=this is additional comment

在模板中可以使用${otherParams.additional_comment}获取到该配置。

要注意的是:自定义配置使用custom开头,后面的配置会将.替换为_作为FreeMarker模板的key,例如上述的additional.comment使用${otherParams.additional_comment}获取。

什么是模块?

由于代码千变万化,为了尽可能的做到通用性,jpa-codegen将每一种类型的代码抽象为模块,每一个模块将使用各自的模板,依照实体信息生成代码。

需要为模板配置一下信息:

  • repository.suffix=Repository

模块类名后缀,生成的类名规则由实体类名+后缀构成

  • repository.template=repository.ftl

模块使用的Freemarker模板

  • repository.flag=entity.repo

模块标识符,生成的代码包名由实体类将实体标识符替换为模块标识符来确认。

  • 实体包名:io.github.gcdd1993.entity
  • 实体标识符:entity
  • 模块标识符:entity.repo

则生成的repository代码包名为 --> io.github.gcdd1993.entity.repo

SpringJpa CRUD 代码生成器的更多相关文章

  1. 应用程序框架实战三十六:CRUD实战演练介绍

    从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...

  2. [NHibernate]代码生成器的使用

    目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...

  3. CRUD生成器DBuilder设计与实现

    源码位于github:https://github.com/lvyahui8/dbuilder.git .文中图片如果太小看不清楚,请右键点击“在新标签页中打开”即可看到原图 有兴趣还可以加QQ群交流 ...

  4. 【转】20个Java 代码生成器

    From: http://www.cnblogs.com/skyme/archive/2011/12/22/2297592.html 1.1 CodeSmith 一款人气很旺国外的基于模板的dotne ...

  5. 尝试Spring Data Jpa--告别CRUD

    前言 说到我们的web开发架构分层中,持久层是相对底层也是相对稳定的一层,奠定好根基后,我们才能专注于业务逻辑和视图开发.而自从ORM思想蔓延开来后,全自动ORM的Hibernate和半自动ORM的M ...

  6. mybatis自定义代码生成器(Generator)——自动生成model&dao代码

    花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...

  7. .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现

    本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...

  8. mybatis-plus的代码生成器

    简介:构建自定义mybatis-plus模板,自动生成mybatis,entity,mapper,service,controller 项目源码:https://github.com/y369q369 ...

  9. 一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器

    一.前言 最近花了一个月时间完成了一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器,目前项目代码已基本完成 止步传统CRUD,进阶代码优化: 该项目可根据数据库字段动态生成 c ...

随机推荐

  1. Loj 6002 最小路径覆盖(最大流)

    题意: 求不相交的最小路径覆盖 思路: 连边跑二分图,匹配一条边相当于缩了一条边,答案为n-maxflow 如果是求可以相交的最小路径覆盖的话,先用Floyd跑出可达矩阵,然后所有可达的点连边跑二分图 ...

  2. Github搜索技巧-如何使用github找到自己感兴趣的项目(转载)

    Github现在不仅仅作为一个版本控制工具,更是一个开源的仓库,里面不但有优秀的开源代码,电子书,还有一些五花八门的项目,有些国家的法律也放在上面,作为程序员如何找到自己感兴趣的项目就非常重要了! 欢 ...

  3. 从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...

  4. Hapi+MySql项目实战配置插件-加载文件渲染母版(三)

    加载插件 一般在其它node框架下,我们安装好插件直接require('插件')就能正常使用了,但是在Hapi下我们必须要Server.register()方法,才能正常使用插件.举个例子: serv ...

  5. [Pyhton]连接MSSQL实例并执行SQL语句

    运行环境: 服务器端: MSSQL 2014 Server 2012 R2 程序端: Python 3.7.4 MacOS 10.14.6 CentOS Linux release 7.7.1908 ...

  6. el-menu 菜单展示

    <template> <div class="tab-container"> <el-menu class="el-menu-vertica ...

  7. 惊讶!缓存刚Put再Get居然获取不到?

    最近一直在老家远程办公,微信突然响了下,有同事说遇到了一个奇怪的问题,让我帮忙看下. 现象就是标题所说的缓存获取不到的问题,我一听感觉这个问题挺有意思的,决定一探究竟. 下面给出部分代码还原下案发现场 ...

  8. v-charts x轴字体斜显示

    如下图,因为X轴内容太多,放不下,插件默认间隔显示需求:X轴内容要全部显示出来(只有斜显示或固定宽多余的用省略代替,本来需要就是想显示全部内容,所以只能取斜显示的方案) 先看看v-charts的文档: ...

  9. spring cloud微服务快速教程之(五) ZUUL API网关中心

    0-前言 我们一个个微服务构建好了,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务.当添加API网 ...

  10. Linux学习Day5:Vim编辑器、配置网卡、配置Yum软件仓库

    今天首先学习Vim编辑器的使用,通过它可以对Linux系统的文件进行编写和修改.在Linux系统中一切都是文件,所以熟练掌握Vim编辑器的使用十分重要.最后通过配置主机网卡的实验,来加深Vim编辑器中 ...