SpringJpa CRUD 代码生成器
利用业余时间撸了一个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 代码生成器的更多相关文章
- 应用程序框架实战三十六:CRUD实战演练介绍
从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...
- [NHibernate]代码生成器的使用
目录 写在前面 文档与系列文章 代码生成器的使用 总结 写在前面 前面的文章介绍了nhibernate的相关知识,都是自己手敲的代码,有时候显得特别的麻烦,比如你必须编写持久化类,映射文件等等,举得例 ...
- CRUD生成器DBuilder设计与实现
源码位于github:https://github.com/lvyahui8/dbuilder.git .文中图片如果太小看不清楚,请右键点击“在新标签页中打开”即可看到原图 有兴趣还可以加QQ群交流 ...
- 【转】20个Java 代码生成器
From: http://www.cnblogs.com/skyme/archive/2011/12/22/2297592.html 1.1 CodeSmith 一款人气很旺国外的基于模板的dotne ...
- 尝试Spring Data Jpa--告别CRUD
前言 说到我们的web开发架构分层中,持久层是相对底层也是相对稳定的一层,奠定好根基后,我们才能专注于业务逻辑和视图开发.而自从ORM思想蔓延开来后,全自动ORM的Hibernate和半自动ORM的M ...
- mybatis自定义代码生成器(Generator)——自动生成model&dao代码
花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...
- .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...
- mybatis-plus的代码生成器
简介:构建自定义mybatis-plus模板,自动生成mybatis,entity,mapper,service,controller 项目源码:https://github.com/y369q369 ...
- 一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器
一.前言 最近花了一个月时间完成了一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器,目前项目代码已基本完成 止步传统CRUD,进阶代码优化: 该项目可根据数据库字段动态生成 c ...
随机推荐
- linux下手动安装/升级GCC到较高版本
一.环境 VMWare+Centos7 二.写在前面的话 安装GCC最简单的方式当然是[yum -y install gcc]但是我的机器上安装下来后,其版本是4.8.5,感觉有点低,所以想升级一下( ...
- ugligy 转
3.配置gulpfile.js 3.1.基本使用 JavaScript 1 2 3 4 5 6 7 8 var gulp = require('gulp'), uglify = require ...
- 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第五节:小总结带来的优化与重构
在上一节中,我们完成了一个简单的采集示例.本节呢,我们先来小结一下,这个示例可能存在的问题: 没有做异常处理 没有做反爬应对策略 没有做重试机制 没有做并发限制 …… 呃,看似平静的表面下还是隐藏着不 ...
- 【C++】随机数引擎
rand() 基本:使用随机数时,经常见到的是C标准库提供的函数rand(),这个函数会生成一个0到RAND_MAX之间的一个整形数: 分布:为了得到一个给定范围内的随机数,通常会对生成的随机数取余: ...
- HSRP 详解
简介 HSRP(Hot Standby Router Protocol 热备份路由器协议)是Cisco的专有协议.HSRP把多台路由器组成一个“热备份组”,形成一个虚拟路由器.这个组内只有一个路由器是 ...
- C#中HashSet的重复性与判等运算重载
目录 一个故事-- 一个繁荣的遥远国度:泛型容器 但是我也不确定容器里能放些什么东西啊 一个英勇的皇家骑士:HashSet 值类型的HashSet 引用类型的HashSet 另外一个--故--事?? ...
- Spark之RDD本质
1.在一个完整的数据转换流程里往往涉及到多个具有衍生关系RDD,这些RDD其实是通过逻辑串联来利用装饰器模式层层包装扩展的的一堆对象,这些相邻RDD间必须有继承关系.并且比Java中的装饰器来的更彻底 ...
- Java之GUI编程
GUI编程 组建 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1.简介 GUI的核心技术:Swing AWT 为什么不流行? 界面不美观. 需要jre环境.(没必 ...
- View Binding初探
参考翻译:https://developer.android.google.cn/topic/libraries/view-binding View Binding是一项功能,使您可以更轻松地编写与视 ...
- if 语句 总结笔记
1.if 语句 语法: if(condition) statement1; else statement2; graph TD A[JAVA考试] -->|几天后| B(收到成绩单) B --& ...