自定义修改IDEA SpringJPA实体模板(第二版)

上篇已经提到了如何使用IDEA自带groovy脚本生成实体类了,这次又更新一些可能会用到的几个地方:

1.增加了生成Dao层接口(也可以指定生成Service类,可参考另一位大佬写的);
2.多个数据源下,可以指定到该包名下(multiplePackage);
3.可设置实体类继承一个公用的BaseEntity;
4.可设置实体类中@Column注解中的name一律小写;
脚本可参考:

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,
        extendBaseManager: true,

]

multiplePackage = "t"
baseEntityPackage = "com.tv189.util.response.BaseEntity"
baseServicePackage = "com.tv189.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)
  }
}

def generate(table, dir) {
  def multipleDir  = "${dir.toString()}"
  def entityPath,repPath
  if (multiplePackage != ""){
     entityPath = "${multipleDir}/model/"+multiplePackage
        repPath = "${multipleDir}/manager/"+multiplePackage
  }else {
     entityPath = "${multipleDir}/model"
      repPath = "${multipleDir}/manager"
  }


  mkdirs([entityPath, repPath])

  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) }
  if (config.extendBaseManager){
    new File("${repPath}/${entityName}Manager.java").withPrintWriter { out -> genRepository(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) {
  if (multiplePackage != ""){
    out.println "package ${basePackage}.model.${multiplePackage};"
  }else{
    out.println "package ${basePackage}.model;"
  }
  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 ""
  }
  out.println "import javax.persistence.*;"
  out.println ""
  out.println "@Data"
  out.println "@Entity"
  out.println "@Table(name = \"${table.getName()}\")"
  out.println "public class $entityName${config.extendBaseEntity ? " extends BaseEntity" : ""}${config.impSerializable ? " implements Serializable" : ""} {"
  out.println ""

  if ((entityName + "_id").equalsIgnoreCase(fields[0].colum) || "id".equalsIgnoreCase(fields[0].colum)) {
    out.println "\t@Id"
    out.println "\t@GeneratedValue(strategy=GenerationType.IDENTITY)"
  }

  fields.each() {
    if (it.annos != "") out.println "  ${it.annos}"
    out.println "\t@Column(name = \"${Case.LOWER.apply(it.colum)}\")"

    if (it.colum != it.name) {
      out.println "\tprivate ${it.type} ${it.colum};"
    }else {
      out.println "\tprivate ${it.type} ${it.name};"
    }
    out.println ""
  }

  out.println "}"

}

def genService(out, table, entityName, fields, basePackage) {
  out.println "package ${basePackage}.service;"
  out.println ""
  out.println "import ${basePackage}.repository.${entityName}Repository;"
  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 "@Service"
  out.println "public class ${entityName}Service${config.extendBaseService ? " extends BaseService<$entityName, ${fields[0].type}>" : ""}  {"
  out.println ""
  out.println "\t@Resource"
  out.println "\tprivate ${entityName}Repository rep;"
  out.println "}"
}

def genRepository(out, table, entityName, fields, basePackage) {
  if (multiplePackage != ""){
    out.println "package ${basePackage}.manager.$multiplePackage;"
    out.println ""
    out.println "import ${basePackage}.model.$multiplePackage.$entityName;"
  }else{
    out.println "package ${basePackage}.manager;"
    out.println ""
    out.println "import ${basePackage}.model.$entityName;"
  }
  out.println "import org.springframework.data.jpa.repository.JpaRepository;"
  out.println "import org.springframework.data.jpa.repository.JpaSpecificationExecutor;"
  out.println ""
  out.println "public interface ${entityName}Manager extends JpaRepository<$entityName, ${fields[0].type}>, JpaSpecificationExecutor<${entityName}>{\r\r}"
}

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]
}

需注意的地方

  • config中配置有是否要生成Dao和BaseEntity的开关;
  • 脚本中用的路径需要自己根据项目灵活配置;
  • 该脚本适用于mac环境,如果是windows用户需要修改一些文件路径的分隔符,windows下是(\),mac、linux下是(/)。
  • 第四点是可选的,我的项目中有这个问题存在所以自己配置了下,想使用驼峰形式则修改108行”${Case.LOWER.apply(it.colum)}>>it.colum“。

参考:

https://www.jianshu.com/p/523af440eaf6

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351