spring data jpa 代码生成!!(精华帖)
- 通过数据库动态生成自己想要生成的各种模板,需要了解grovery。
view -> Tool Windows -> Database
+ -> Data source -> MySQL
配置数据库信息

建立存放实体的包

导入必要maven依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
在database视图区域任意地方右键,然后
Scripted Extensions -> Go to Scripts Directory
复制下面的文件到6中跳转的文件夹中
- Generate POJOs.groovy
import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil config = [
impSerializable : true,
extendBaseEntity : false,
extendBaseService: true ]
baseEntityPackage = "com.hhsj.base.BaseEntity"
baseServicePackage = "com.hhsj.base.BaseService"
baseEntityProperties = ["id", "createDate", "lastModifiedDate", "version"]
typeMapping = [
(~/(?i)bool|boolean|tinyint/) : "Boolean",
(~/(?i)bigint/) : "Long",
(~/int/) : "Integer",
(~/(?i)float|double|decimal|real/): "Double",
(~/(?i)datetime|timestamp/) : "java.util.Date",
(~/(?i)date/) : "java.sql.Date",
(~/(?i)time/) : "java.sql.Time",
(~/(?i)/) : "String"
] FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
SELECTION.filter {
it instanceof DasTable && it.getKind() == ObjectKind.TABLE
}.each {
generate(it, dir)
}
}
//dif -> E:\DEVELOPE\Code\jpademo\src\main\java\com\demo\jpa
def generate(table, dir) { def entityPath = "${dir.toString()}\\entity",
servicePath = "${dir.toString()}\\service",
repPath = "${dir.toString()}\\repository",
serviceImpPath = "${dir.toString()}\\service\\impl" mkdirs([entityPath, servicePath, repPath, serviceImpPath]) def entityName = javaName(table.getName(), true)
def fields = calcFields(table)
def basePackage = clacBasePackage(dir) new File("${entityPath}\\${entityName}.java").withPrintWriter { out -> genEntity(out, table, entityName, fields, basePackage) }
new File("${servicePath}\\${entityName}Service.java").withPrintWriter { out -> genService(out, table, entityName, fields, basePackage) }
new File("${repPath}\\${entityName}Repository.java").withPrintWriter { out -> genRepository(out, table, entityName, fields, basePackage) }
// new File("${repPath}\\${entityName}RepositoryCustom.java").withPrintWriter { out -> genRepositoryCustom(out, entityName, basePackage) }
new File("${serviceImpPath}\\${entityName}ServiceImpl.java").withPrintWriter { out -> getServiceImpl(out, table, entityName, fields, basePackage) } } def genProperty(out, field) {
if (field.annos != "") out.println " ${field.annos}"
if (field.colum != field.name) {
out.println "\t@Column(name = \"${field.colum}\")"
}
out.println "\tprivate ${field.type} ${field.name};"
out.println ""
} def genEntity(out, table, entityName, fields, basePackage) {
out.println "package ${basePackage}.entity;"
out.println ""
if (config.extendBaseEntity) {
out.println "import $baseEntityPackage;"
}
out.println "import lombok.Data;"
out.println ""
if (config.impSerializable) {
out.println "import java.io.Serializable;"
out.println "import com.fasterxml.jackson.annotation.JsonIgnoreProperties;"
out.println ""
}
out.println "import javax.persistence.*;"
out.println ""
out.println "@Data"
out.println "@Entity"
out.println "@Table(name = \"${table.getName()}\")"
out.println "@JsonIgnoreProperties(value={\"hibernateLazyInitializer\",\"handler\",\"fieldHandler\"})"
out.println "public class $entityName${config.extendBaseEntity ? " extends BaseEntity" : ""}${config.impSerializable ? " implements Serializable" : ""} {"
out.println ""
if (config.extendBaseEntity) {
// 继承父类
fields.each() { if (!isBaseEntityProperty(it.name)) genProperty(out, it) }
} else {
// 不继承父类
out.println "\t@Id"
out.println "\t@GeneratedValue(strategy = GenerationType.IDENTITY)"
fields.each() { genProperty(out, it) }
}
out.println "}" } def genService(out, table, entityName, fields, basePackage) {
out.println "package ${basePackage}.service;"
out.println ""
out.println "import ${basePackage}.repository.${entityName}Repository;"
out.println "import ${basePackage}.base.Result;"
if (config.extendBaseService) {
out.println "import $baseServicePackage;"
out.println "import ${basePackage}.entity.$entityName;"
}
out.println "import org.springframework.stereotype.Service;"
out.println ""
out.println "import javax.annotation.Resource;"
out.println ""
out.println "public interface ${entityName}Service${config.extendBaseService ? " extends BaseService<$entityName, ${fields[0].type}>" : ""} {"
out.println ""
out.println " //根据id查询"
out.println " public Result getOne(${fields[0].type} id);"
out.println ""
out.println " //根据id删除"
out.println " public Result deleteOne(${fields[0].type} id);"
out.println ""
out.println " //根据id保存"
out.println " public Result saveOne(${entityName} entity);"
out.println "}"
} def genRepository(out, table, entityName, fields, basePackage) {
out.println "package ${basePackage}.repository;"
out.println ""
out.println "import ${basePackage}.entity.$entityName;"
out.println "import org.springframework.data.jpa.repository.JpaRepository;"
out.println ""
out.println "public interface ${entityName}Repository extends JpaRepository<$entityName, ${fields[0].type}>{}"
} /*def genRepositoryCustom(out, entityName, basePackage) {
out.println "package ${basePackage}.repository;"
out.println ""
out.println "public interface ${entityName}RepositoryCustom { "
out.println "}"
}*/ def getServiceImpl(out, table, entityName, fields, basePackage) {
out.println "package ${basePackage}.service.impl;"
out.println ""
out.println "import ${basePackage}.service.${entityName}Service;"
out.println "import org.springframework.stereotype.Service;"
out.println "import ${basePackage}.base.Result;"
out.println "import ${basePackage}.entity.${entityName};"
out.println "import ${basePackage}.service.${entityName}Service;"
out.println "import ${basePackage}.repository.${entityName}Repository;"
out.println "import org.springframework.beans.factory.annotation.Autowired;"
out.println ""
out.println "@Service"
out.println "public class ${entityName}ServiceImpl implements ${entityName}Service {"
out.println ""
out.println "\t@Autowired"
out.println "\tprivate ${entityName}Repository rep;"
out.println ""
out.println "\t@Override"
out.println "\tpublic Result getOne(${fields[0].type} id){"
out.println " \t\t${entityName} one = rep.getOne(id);"
out.println "\t\treturn Result.builder().success().data(one).build();"
out.println "\t}"
out.println ""
out.println "\t@Override"
out.println "\tpublic Result deleteOne(${fields[0].type} id){"
out.println " \t\trep.deleteById(id);"
out.println "\t\treturn Result.builder().success().build();"
out.println "\t}"
out.println ""
out.println "\t@Override"
out.println "\tpublic Result saveOne(${entityName} entity){"
out.println " \t\t${entityName} one = rep.save(entity);"
out.println "\t\treturn Result.builder().success().data(one).build();"
out.println "\t}"
out.println "}"
} def mkdirs(dirs) {
dirs.forEach {
def f = new File(it)
if (!f.exists()) {
f.mkdirs();
}
}
} def clacBasePackage(dir) {
dir.toString()
.replaceAll("^.+\\\\src\\\\main\\\\java\\\\", "")
.replaceAll("\\\\", ".")
} def isBaseEntityProperty(property) {
baseEntityProperties.find { it == property } != null
}
// 转换类型
def calcFields(table) {
DasUtil.getColumns(table).reduce([]) {
fields, col ->
def spec = Case.LOWER.apply(col.getDataType().getSpecification())
def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
fields += [[
name : javaName(col.getName(), false),
colum: col.getName(),
type : typeStr,
annos: ""]]
}
} def javaName(str, capitalize) {
def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
.join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_").replaceAll(/_/, "")
capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}生成模板
spring data jpa 代码生成!!(精华帖)的更多相关文章
- Spring data jpa 使用技巧记录
软件152 尹以操 最近在用Springboot 以及Spring data jpa ,使用jpa可以让我更方便的操作数据库,特开此帖记录使用jpa的一些小技巧. 一.使用spring data j ...
- Spring Data Jpa:分页、Specification、Criteria
分页的主要接口与类 PagingAndSortingRepository 继承自 CrudRepository 接口,提供了排序以及分页查询能力,提供了两个方法 Iterable<T> f ...
- Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码
大家好,又见面了. 这是本系列的最后一篇文档啦,先来回顾下前面4篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你 ...
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- spring boot(五):spring data jpa的使用
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 深入浅出学Spring Data JPA
第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...
- spring data jpa 调用存储过程
网上这方面的例子不是很多,研究了一下,列出几个调用的方法. 假如我们有一个mysql的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1in ...
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...
随机推荐
- Celery无法注册任务的几种情况
Celery处理异步任务使得程序不必等待任务结束就可以继续执行其它任务或返回数据结果, 在处理耗时任务如发送邮件.发送信息验证码等场景下非常适用! Celery使用方法灵活,根据具体业务有不同的部署和 ...
- 数据可视化之powerBI入门(九)PowerBI数据建模:其实一点都不高深
https://zhuanlan.zhihu.com/p/64149834 数据建模并没有那么高深,你同样可以学会!这篇文章通过一个实例创建一个简单的数据建模,并引出两个重要的概念:度量值和DAX. ...
- Django之 admin组件
本节内容 路由系统 models模型 admin views视图 template模板 Django Admin介绍 admin 是django 自带的用来让你进行数据库管理的web app. 提供 ...
- easyUI传递参数
#======================JSP===================================== <div class="l ...
- 可能这是Redis可视化工具最全的横向评测
1 命令行 不知道大家在日常操作redis时用什么可视化工具呢? 以前总觉得没有什么太好的可视化工具,于是问了一个业内朋友.对方回:你还用可视化工具?直接命令行呀,redis提供了这么多命令,操作起来 ...
- The Prices
题目描述 你要购买\(m\)种物品各一件,一共有\(n\)家商店,你到第\(i\)家商店的路费为\(d[i]\),在第家商店购买第\(j\)种物品的费用为\(c[i][j]\),求最小总费用. 输入格 ...
- 想进大厂?字节跳动等独角兽公司都在招募Python工程师!(Python就是第一语言)
在本文章中,作者通过自身经历,力求客观的谈谈个人选择学习Python的动机,以及独角兽公司对Python工程师的要求及薪资. 从目前各种迹象(企业招聘,语言排名等)看来Python相对Java应该是暂 ...
- 推荐一款技术人必备的接口测试神器:Apifox
1. 背景 作为互联网行业技术从业者,接口调试是必不可少的一项技能,通常我们都会选择使用 Postman 这类工具来进行接口调试,在接口调试方面 Postman 做的确实非常出色.当然除了Postma ...
- 多个activity的博客参考,用mainactivity 调用 明天阅读一下
https://blog.csdn.net/hbwxy521/article/details/53101019
- 【Python】Async异步等待简单例子理解
import time def run(coroutine): try: print("") coroutine.send(None) except StopIteration a ...




