Spring Boot JPA idea代碼自動生成 其二

之前說過怎么生成,可以參考這里當時拿出一個實體類的生成。最近有把生成的groovy代碼改造了一番算撮,現(xiàn)在可以一鍵生成entityservice县昂、repository類了肮柜。

我們現(xiàn)有的entityservice都是有基類可以選擇繼承的倒彰,主要看看entity的基類BaseEntity

@Data
@MappedSuperclass
@EntityListeners({AuditingEntityListener.class})
public class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, length = 22, unique = true)
    protected Long id;

    @CreatedDate
    @Column(name = "create_date", nullable = false)
    protected Date createDate;

    @LastModifiedDate
    @Column(name = "last_modified_date")
    protected Date lastModifiedDate;

    @Version
    @Column(name = "version", nullable = false)
    protected Integer version;
}

@Datalombok的注解审洞,用于自動生成getset方法,使用lombok需要在添加maven依賴

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

再看看生成好的文件目錄結構

image.png

我們的數(shù)據(jù)表:


image.png

很好這個表是需要繼承基類生成的待讳。

打開代碼進行調整

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

]
baseEntityPackage = "com.yija.project.framework.base.BaseEntity"
baseServicePackage = "com.yija.project.framework.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",
        repImpPath = "${dir.toString()}\\repository\\impl"

    mkdirs([entityPath, servicePath, repPath, repImpPath])

    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("${repImpPath}\\${entityName}RepositoryImpl.java").withPrintWriter { out -> genRepositoryImpl(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 ""
    }
    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 (config.extendBaseEntity) {
        // 繼承父類
        fields.each() { if (!isBaseEntityProperty(it.name)) genProperty(out, it) }
    } else {
        // 不繼承父類
        out.println "\t@Id"
        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;"
    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) {
    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}>, ${entityName}RepositoryCustom{}"
}

def genRepositoryCustom(out, entityName, basePackage) {
    out.println "package ${basePackage}.repository;"
    out.println ""
    out.println "public interface ${entityName}RepositoryCustom { "
    out.println "}"
}

def genRepositoryImpl(out, table, entityName, fields, basePackage) {
    out.println "package ${basePackage}.repository.impl;"
    out.println ""
    out.println "import ${basePackage}.repository.${entityName}RepositoryCustom;"
    out.println "import org.springframework.stereotype.Repository;"
    out.println ""
    out.println "import javax.persistence.EntityManager;"
    out.println "import javax.persistence.PersistenceContext;"
    out.println ""
    out.println "@Repository"
    out.println "public class ${entityName}RepositoryImpl implements ${entityName}RepositoryCustom {"
    out.println ""
    out.println "\t@PersistenceContext"
    out.println "\tprivate EntityManager em;"
    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]
}

config中配置芒澜,需要使用entityservice的基類,實現(xiàn)Serializable接口,然后選擇生成目錄生成

image.png

看看生成好的類吧

  • Entity
package com.demo.jpa.entity;

import com.yija.project.framework.base.BaseEntity;
import lombok.Data;

import java.io.Serializable;

import javax.persistence.*;

@Data
@Entity
@Table(name = "game_history")
public class GameHistory extends BaseEntity implements Serializable {

   @Column(name = "user_id")
   private Long userId;

   private Integer score;
}
  • Service
package com.demo.jpa.service;

import com.demo.jpa.repository.GameHistoryRepository;
import com.yija.project.framework.base.BaseService;
import com.demo.jpa.entity.GameHistory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class GameHistoryService extends BaseService<GameHistory, Long>  {

    @Resource
    private GameHistoryRepository rep;
}
  • Repository
package com.demo.jpa.repository;

import com.demo.jpa.entity.GameHistory;
import org.springframework.data.jpa.repository.JpaRepository;

public interface GameHistoryRepository extends JpaRepository<GameHistory, Long>, GameHistoryRepositoryCustom{
}
  • RepositoryCustom
package com.demo.jpa.repository;

public interface GameHistoryRepositoryCustom { 
}

  • RepositoryImpl
package com.demo.jpa.repository.impl;

import com.demo.jpa.repository.GameHistoryRepositoryCustom;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Repository
public class GameHistoryRepositoryImpl implements GameHistoryRepositoryCustom {

    @PersistenceContext
    private EntityManager em;
}

Spring Boot JPA實體類idea自動生成 其三

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末创淡,一起剝皮案震驚了整個濱河市痴晦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琳彩,老刑警劉巖阅酪,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汁针,居然都是意外死亡,警方通過查閱死者的電腦和手機砚尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門施无,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人必孤,你說我怎么就攤上這事猾骡。” “怎么了敷搪?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵兴想,是天一觀的道長。 經(jīng)常有香客問我赡勘,道長嫂便,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任闸与,我火速辦了婚禮毙替,結果婚禮上岸售,老公的妹妹穿的比我還像新娘。我一直安慰自己厂画,他們只是感情好凸丸,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袱院,像睡著了一般屎慢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忽洛,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天腻惠,我揣著相機與錄音,去河邊找鬼脐瑰。 笑死妖枚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的苍在。 我是一名探鬼主播绝页,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寂恬!你這毒婦竟也來了续誉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤初肉,失蹤者是張志新(化名)和其女友劉穎酷鸦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牙咏,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡臼隔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妄壶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摔握。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丁寄,靈堂內的尸體忽然破棺而出氨淌,到底是詐尸還是另有隱情,我是刑警寧澤伊磺,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布盛正,位于F島的核電站,受9級特大地震影響屑埋,放射性物質發(fā)生泄漏豪筝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壤蚜。 院中可真熱鬧即寡,春花似錦、人聲如沸袜刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著蟹。三九已至墩蔓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萧豆,已是汗流浹背奸披。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涮雷,地道東北人阵面。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像洪鸭,于是被迫代替她去往敵國和親样刷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理览爵,服務發(fā)現(xiàn)置鼻,斷路器,智...
    卡卡羅2017閱讀 134,708評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評論 25 707
  • 醞釀了那么多次的情緒 轉瞬間極度升華 是心給了多少的電壓 頻繁而復雜 盛世中你毅力在哪層高塔 眼前的你猶如望不盡的...
    狒狒傻丫頭_閱讀 121評論 0 0
  • 正念練習:對覺知的正念 #40天身心成長計劃# Day29: 正念練習:對覺知的正念 你關注了什么蜓竹,你就會體驗到什...
    悠悠然a閱讀 177評論 0 0