1. 通过数据库动态生成自己想要生成的各种模板,需要了解grovery。

  2. view -> Tool Windows -> Database

  1. + -> Data source -> MySQL

  2. 配置数据库信息

  3. 建立存放实体的包

  4. 导入必要maven依赖

  1. <!--mysql-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>5.1.21</version>
  6. </dependency>
  7. <!--jpa-->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-data-jpa</artifactId>
  11. </dependency>
  12. <!-- lombok -->
  13. <dependency>
  14. <groupId>org.projectlombok</groupId>
  15. <artifactId>lombok</artifactId>
  16. <optional>true</optional>
  17. </dependency>
  1. 在database视图区域任意地方右键,然后Scripted Extensions -> Go to Scripts Directory

  2. 复制下面的文件到6中跳转的文件夹中

  • Generate POJOs.groovy
    1. import com.intellij.database.model.DasTable
    2. import com.intellij.database.model.ObjectKind
    3. import com.intellij.database.util.Case
    4. import com.intellij.database.util.DasUtil
    5.  
    6. config = [
    7. impSerializable : true,
    8. extendBaseEntity : false,
    9. extendBaseService: true
    10.  
    11. ]
    12. baseEntityPackage = "com.hhsj.base.BaseEntity"
    13. baseServicePackage = "com.hhsj.base.BaseService"
    14. baseEntityProperties = ["id", "createDate", "lastModifiedDate", "version"]
    15. typeMapping = [
    16. (~/(?i)bool|boolean|tinyint/) : "Boolean",
    17. (~/(?i)bigint/) : "Long",
    18. (~/int/) : "Integer",
    19. (~/(?i)float|double|decimal|real/): "Double",
    20. (~/(?i)datetime|timestamp/) : "java.util.Date",
    21. (~/(?i)date/) : "java.sql.Date",
    22. (~/(?i)time/) : "java.sql.Time",
    23. (~/(?i)/) : "String"
    24. ]
    25.  
    26. FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    27. SELECTION.filter {
    28. it instanceof DasTable && it.getKind() == ObjectKind.TABLE
    29. }.each {
    30. generate(it, dir)
    31. }
    32. }
    33. //dif -> E:\DEVELOPE\Code\jpademo\src\main\java\com\demo\jpa
    34. def generate(table, dir) {
    35.  
    36. def entityPath = "${dir.toString()}\\entity",
    37. servicePath = "${dir.toString()}\\service",
    38. repPath = "${dir.toString()}\\repository",
    39. serviceImpPath = "${dir.toString()}\\service\\impl"
    40.  
    41. mkdirs([entityPath, servicePath, repPath, serviceImpPath])
    42.  
    43. def entityName = javaName(table.getName(), true)
    44. def fields = calcFields(table)
    45. def basePackage = clacBasePackage(dir)
    46.  
    47. new File("${entityPath}\\${entityName}.java").withPrintWriter { out -> genEntity(out, table, entityName, fields, basePackage) }
    48. new File("${servicePath}\\${entityName}Service.java").withPrintWriter { out -> genService(out, table, entityName, fields, basePackage) }
    49. new File("${repPath}\\${entityName}Repository.java").withPrintWriter { out -> genRepository(out, table, entityName, fields, basePackage) }
    50. // new File("${repPath}\\${entityName}RepositoryCustom.java").withPrintWriter { out -> genRepositoryCustom(out, entityName, basePackage) }
    51. new File("${serviceImpPath}\\${entityName}ServiceImpl.java").withPrintWriter { out -> getServiceImpl(out, table, entityName, fields, basePackage) }
    52.  
    53. }
    54.  
    55. def genProperty(out, field) {
    56. if (field.annos != "") out.println " ${field.annos}"
    57. if (field.colum != field.name) {
    58. out.println "\t@Column(name = \"${field.colum}\")"
    59. }
    60. out.println "\tprivate ${field.type} ${field.name};"
    61. out.println ""
    62. }
    63.  
    64. def genEntity(out, table, entityName, fields, basePackage) {
    65. out.println "package ${basePackage}.entity;"
    66. out.println ""
    67. if (config.extendBaseEntity) {
    68. out.println "import $baseEntityPackage;"
    69. }
    70. out.println "import lombok.Data;"
    71. out.println ""
    72. if (config.impSerializable) {
    73. out.println "import java.io.Serializable;"
    74. out.println "import com.fasterxml.jackson.annotation.JsonIgnoreProperties;"
    75. out.println ""
    76. }
    77. out.println "import javax.persistence.*;"
    78. out.println ""
    79. out.println "@Data"
    80. out.println "@Entity"
    81. out.println "@Table(name = \"${table.getName()}\")"
    82. out.println "@JsonIgnoreProperties(value={\"hibernateLazyInitializer\",\"handler\",\"fieldHandler\"})"
    83. out.println "public class $entityName${config.extendBaseEntity ? " extends BaseEntity" : ""}${config.impSerializable ? " implements Serializable" : ""} {"
    84. out.println ""
    85. if (config.extendBaseEntity) {
    86. // 继承父类
    87. fields.each() { if (!isBaseEntityProperty(it.name)) genProperty(out, it) }
    88. } else {
    89. // 不继承父类
    90. out.println "\t@Id"
    91. out.println "\t@GeneratedValue(strategy = GenerationType.IDENTITY)"
    92. fields.each() { genProperty(out, it) }
    93. }
    94. out.println "}"
    95.  
    96. }
    97.  
    98. def genService(out, table, entityName, fields, basePackage) {
    99. out.println "package ${basePackage}.service;"
    100. out.println ""
    101. out.println "import ${basePackage}.repository.${entityName}Repository;"
    102. out.println "import ${basePackage}.base.Result;"
    103. if (config.extendBaseService) {
    104. out.println "import $baseServicePackage;"
    105. out.println "import ${basePackage}.entity.$entityName;"
    106. }
    107. out.println "import org.springframework.stereotype.Service;"
    108. out.println ""
    109. out.println "import javax.annotation.Resource;"
    110. out.println ""
    111. out.println "public interface ${entityName}Service${config.extendBaseService ? " extends BaseService<$entityName, ${fields[0].type}>" : ""} {"
    112. out.println ""
    113. out.println " //根据id查询"
    114. out.println " public Result getOne(${fields[0].type} id);"
    115. out.println ""
    116. out.println " //根据id删除"
    117. out.println " public Result deleteOne(${fields[0].type} id);"
    118. out.println ""
    119. out.println " //根据id保存"
    120. out.println " public Result saveOne(${entityName} entity);"
    121. out.println "}"
    122. }
    123.  
    124. def genRepository(out, table, entityName, fields, basePackage) {
    125. out.println "package ${basePackage}.repository;"
    126. out.println ""
    127. out.println "import ${basePackage}.entity.$entityName;"
    128. out.println "import org.springframework.data.jpa.repository.JpaRepository;"
    129. out.println ""
    130. out.println "public interface ${entityName}Repository extends JpaRepository<$entityName, ${fields[0].type}>{}"
    131. }
    132.  
    133. /*def genRepositoryCustom(out, entityName, basePackage) {
    134. out.println "package ${basePackage}.repository;"
    135. out.println ""
    136. out.println "public interface ${entityName}RepositoryCustom { "
    137. out.println "}"
    138. }*/
    139.  
    140. def getServiceImpl(out, table, entityName, fields, basePackage) {
    141. out.println "package ${basePackage}.service.impl;"
    142. out.println ""
    143. out.println "import ${basePackage}.service.${entityName}Service;"
    144. out.println "import org.springframework.stereotype.Service;"
    145. out.println "import ${basePackage}.base.Result;"
    146. out.println "import ${basePackage}.entity.${entityName};"
    147. out.println "import ${basePackage}.service.${entityName}Service;"
    148. out.println "import ${basePackage}.repository.${entityName}Repository;"
    149. out.println "import org.springframework.beans.factory.annotation.Autowired;"
    150. out.println ""
    151. out.println "@Service"
    152. out.println "public class ${entityName}ServiceImpl implements ${entityName}Service {"
    153. out.println ""
    154. out.println "\t@Autowired"
    155. out.println "\tprivate ${entityName}Repository rep;"
    156. out.println ""
    157. out.println "\t@Override"
    158. out.println "\tpublic Result getOne(${fields[0].type} id){"
    159. out.println " \t\t${entityName} one = rep.getOne(id);"
    160. out.println "\t\treturn Result.builder().success().data(one).build();"
    161. out.println "\t}"
    162. out.println ""
    163. out.println "\t@Override"
    164. out.println "\tpublic Result deleteOne(${fields[0].type} id){"
    165. out.println " \t\trep.deleteById(id);"
    166. out.println "\t\treturn Result.builder().success().build();"
    167. out.println "\t}"
    168. out.println ""
    169. out.println "\t@Override"
    170. out.println "\tpublic Result saveOne(${entityName} entity){"
    171. out.println " \t\t${entityName} one = rep.save(entity);"
    172. out.println "\t\treturn Result.builder().success().data(one).build();"
    173. out.println "\t}"
    174. out.println "}"
    175. }
    176.  
    177. def mkdirs(dirs) {
    178. dirs.forEach {
    179. def f = new File(it)
    180. if (!f.exists()) {
    181. f.mkdirs();
    182. }
    183. }
    184. }
    185.  
    186. def clacBasePackage(dir) {
    187. dir.toString()
    188. .replaceAll("^.+\\\\src\\\\main\\\\java\\\\", "")
    189. .replaceAll("\\\\", ".")
    190. }
    191.  
    192. def isBaseEntityProperty(property) {
    193. baseEntityProperties.find { it == property } != null
    194. }
    195. // 转换类型
    196. def calcFields(table) {
    197. DasUtil.getColumns(table).reduce([]) {
    198. fields, col ->
    199. def spec = Case.LOWER.apply(col.getDataType().getSpecification())
    200. def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
    201. fields += [[
    202. name : javaName(col.getName(), false),
    203. colum: col.getName(),
    204. type : typeStr,
    205. annos: ""]]
    206. }
    207. }
    208.  
    209. def javaName(str, capitalize) {
    210. def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
    211. .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_").replaceAll(/_/, "")
    212. capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
    213. }

    生成模板



spring data jpa 代码生成!!(精华帖)的更多相关文章

  1. Spring data jpa 使用技巧记录

    软件152 尹以操 最近在用Springboot 以及Spring data jpa  ,使用jpa可以让我更方便的操作数据库,特开此帖记录使用jpa的一些小技巧. 一.使用spring data j ...

  2. Spring Data Jpa:分页、Specification、Criteria

    分页的主要接口与类 PagingAndSortingRepository 继承自 CrudRepository 接口,提供了排序以及分页查询能力,提供了两个方法 Iterable<T> f ...

  3. Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码

    大家好,又见面了. 这是本系列的最后一篇文档啦,先来回顾下前面4篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你 ...

  4. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  5. spring boot(五):spring data jpa的使用

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  6. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. 深入浅出学Spring Data JPA

    第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...

  8. spring data jpa 调用存储过程

    网上这方面的例子不是很多,研究了一下,列出几个调用的方法. 假如我们有一个mysql的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1in ...

  9. Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题

    开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...

随机推荐

  1. java 面向对象(二):JVM内存结构

    编译完源程序以后,生成一个或多个字节码文件.我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行.意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析. <JVM规范> ...

  2. 空间金字塔池化 ssp-net

    <Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition>,这篇paper提出了空间金字 ...

  3. com.aliyun.openservices.shade.com.alibaba.fastjson.JSONException: exepct '[', but {, pos 1, line 1, column 2

    报错原因:你放的是一个非List的对象 却想取一个List对象出来 package test; import java.text.SimpleDateFormat; import java.util. ...

  4. 享元模式(c++实现)

    享元模式 目录 享元模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 享元模式(Flyweight),运用共享技术有效的支持大量细粒度的对象. 模式动机 如果一个应用使用了大量的对 ...

  5. 从一次故障聊聊前端 UI 自动化测试

    背景 事件的起因在于老板最近的两次"故障",一次去年的,一次最近.共同原因都是脚手架在发布平台发布打包时出错,导致线上应用白屏不可用. 最神奇的是,事后多次 Code Review ...

  6. Vue使用定时器定时刷新页面

    1. 需求说明 在前端开发中,往往会遇到页面需要实时刷新数据的情况,给用户最新的数据展示. 2. 逻辑分析 如果需要数据实时更新,我们自然是需要使用定时器,不断的调用接口数据,会相对的消耗内存. 3. ...

  7. 大汇总 | 一文学会八篇经典CNN论文

    本文主要是回顾一下一些经典的CNN网络的主要贡献. 论文传送门 [google团队] [2014.09]inception v1: https://arxiv.org/pdf/1409.4842.pd ...

  8. Android 文件存储浅析

    最近做的一个需求和文件存储有关系.由于之前没有系统梳理过,对文件存储方面的知识一直很懵懂.趁着周末有时间,赶紧梳理一波. 这首从网上找到的一张图,很好的概括了外部存储和内部存储. 下面我们再来具体介绍 ...

  9. Android集成百度地图

    1. 百度地图api Android定位SDK Android地图SDK Android地图SDK<------

  10. 数据库层级关系转换为树结构的json

    原文链接:https://blog.csdn.net/Tonysdyp/article/details/80987959 首先是数据库设计: 通过查询数据库,将全局数据作为一个ArrayList< ...