idea搭建SpringBoot項(xiàng)目,快速開發(fā)流程指南,Lombok簡(jiǎn)化開發(fā),Groovy根據(jù)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類

前言:

本文檔包含大致以下內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處。

  1. idea快速構(gòu)建SpringBoot項(xiàng)目

  2. SpringBoot項(xiàng)目使用 Lombok簡(jiǎn)化開發(fā)

  3. idea通過數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類class

  4. Mybatis-plus的安裝

有機(jī)會(huì)會(huì)慢慢更新,還望各位看官多多指導(dǎo)交流。

1. SpringBoot項(xiàng)目創(chuàng)建

  • 使用 idea 快速構(gòu)建 Spring boot 應(yīng)用
在這里插入圖片描述

Artifact 為項(xiàng)目名稱,與 Group組合為 package

在這里插入圖片描述

此處只需要選擇 web start 就行,后期需要什么就往Maven pom.xml里加依賴

在這里插入圖片描述

下一步直接完成點(diǎn)擊 finish

下一步點(diǎn)擊 Import Changes,此時(shí)Maven 就在導(dǎo)入依賴

在這里插入圖片描述

2. 創(chuàng)建過程中的常見問題

Cannot resolve symbol 'springframework'

爆紅,基本上是因?yàn)?maven 依賴沒導(dǎo)入成功,解決方法,點(diǎn)擊右側(cè) Maven工具 clean, 再 install

在這里插入圖片描述

3. 啟動(dòng)測(cè)試

創(chuàng)建一個(gè) 測(cè)試類 如圖

在這里插入圖片描述

Application run

以下是通過 Application 的方式 run,(就是所謂的直接用運(yùn)行普通java class 的方式)


在這里插入圖片描述

如果內(nèi)置的tomcat 依賴中有 <scope>provided</scope> 那就要進(jìn)行如下操作

  • provided適合在編譯和測(cè)試的環(huán)境
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

回到 main 方法里面,右擊 run,默認(rèn)啟動(dòng) 8080端口

在這里插入圖片描述

如果需要更改端口號(hào)和其他配置請(qǐng)加入配置文件application.yml,復(fù)制以下代碼 (也可用properties 后綴的格式),其中的參數(shù)請(qǐng)自行修改。注意數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)也要在pom.xml中導(dǎo)入

server:
  port: 8080
  tomcat:
    uri-encoding: utf-8
  servlet:
    session:
      timeout: 30m



spring:
  application:
    name: tiny_shop #應(yīng)用名稱
  datasource: #數(shù)據(jù)庫(kù)相關(guān)配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tiny_shop
    username: root
    password: 123456
    max-idle: 10
    max-wait: 10000
    min-idle: 5
    initial-size: 5
  thymeleaf: #模版引擎
    cache: false
    prefix: classpath:/templates/
    suffix: .html
    encoding: UTF-8
    servlet:
      content-type: text/html

再次 run 端口號(hào)將會(huì)變成指定的端口號(hào)

在瀏覽器中輸入 http://localhost:8080/hello, 得到結(jié)果

在這里插入圖片描述

Spring Boot Application run

在這里插入圖片描述

4. 使用插件簡(jiǎn)化開發(fā)(安裝教程篇)

idea 安裝 Lombok插件使用@Data簡(jiǎn)化 entity class 的編寫

  • @Data 提供了 類屬性的 getter and setter (常用)
  • @Data 提供了 類的toString 方法 (常用)
  • @Data 提供了 類 的equalsAndHashCode方法
  • etc... 詳細(xì)信息點(diǎn)擊跳轉(zhuǎn)

其他常用注解:

  • @AllArgsConstructor:全參構(gòu)造函數(shù)
  • @NoArgsContructor:無參構(gòu)造函數(shù)

Settings > Plugins > MarketPlace > Search Lombok > install

在這里插入圖片描述

此處我們先安裝,安裝完了重啟一次 idea,然后看下一步(一鍵生成對(duì)應(yīng)數(shù)據(jù)庫(kù)表的 class )

注意:

如果你的maven庫(kù)中已經(jīng)有了 lombok,則可在實(shí)體類上面直接使用(導(dǎo)入lombok后) @Data 來注解class,

如果沒有請(qǐng)前往 https://mvnrepository.com/artifact/org.projectlombok/lombok 選中熱度最高的進(jìn)行 pom.xml 添加依賴

在這里插入圖片描述

點(diǎn)擊版本號(hào) 1.18.8 ,進(jìn)入詳細(xì)頁(yè)面,復(fù)制依賴信息,加入pom.xml,然后 Maven插件提示 import change

在這里插入圖片描述

idea 通過數(shù)據(jù)庫(kù)表生成對(duì)應(yīng)的 class 實(shí)體類

首先把數(shù)據(jù)庫(kù)先建立好,在此處就不多說了,數(shù)據(jù)庫(kù)設(shè)計(jì)很費(fèi)時(shí)間。(Navicat視圖建表工具)

在這里插入圖片描述

回到idea,點(diǎn)擊右側(cè)的 database > 點(diǎn)擊 + 號(hào) > 選擇你需要使用的數(shù)據(jù)庫(kù)產(chǎn)品(此處為 Mysql)

提示下載驅(qū)動(dòng),點(diǎn)擊下載安裝


在這里插入圖片描述

輸入對(duì)應(yīng)的參數(shù) 點(diǎn)擊 test Connection 測(cè)試連接,成功的前往下一步(跳過)

未成功請(qǐng)到 Advanced 中設(shè)置時(shí)區(qū),或者你可以直接更改數(shù)據(jù)庫(kù)的時(shí)區(qū)點(diǎn)擊查看教程

我的數(shù)據(jù)庫(kù)版本,Server version: 8.0.13 MySQL Community Server - GPL)

MySQL默認(rèn)的時(shí)區(qū)是UTC時(shí)區(qū),而我要將serverTimezone的值設(shè)為GMT+008(東八區(qū)),即告訴IDEA,MySQL服務(wù)器時(shí)區(qū)是東八區(qū)時(shí)區(qū)

在這里插入圖片描述

找到 serverTimezone,加上參數(shù) GMT+008,你也可以通過更改數(shù)據(jù)庫(kù)時(shí)區(qū)統(tǒng)一

在這里插入圖片描述

測(cè)試連接成功即可

在這里插入圖片描述

回到工作區(qū)刷新下,或者重新打開,就能展開跟數(shù)據(jù)庫(kù)結(jié)構(gòu)中一致的表結(jié)構(gòu)了

在這里插入圖片描述

右擊表名,Scripted Extensions > Generate POJOs . groovy,

在這里插入圖片描述

然后在彈出的路徑中找到你要生成到的目標(biāo)目錄,點(diǎn)擊確認(rèn)即可,生成的代碼如下:

需要注意

  • 表名稱被駝峰化了
  • 包名是錯(cuò)誤的,需要自己修改成項(xiàng)目對(duì)應(yīng)的包名
  • 自動(dòng)添加了 getter and setter (接下來我們要去掉)
package com.sample;


public class UserInfo {

  private long userId;
  private String userPhoneNum;
  private String userNickName;
  private String userRealName;
  private java.sql.Date userBirthday;
  private String userEmail;
  private String address;
  private String userPassword;


  public long getUserId() {
    return userId;
  }

  public void setUserId(long userId) {
    this.userId = userId;
  }


  public String getUserPhoneNum() {
    return userPhoneNum;
  }

  public void setUserPhoneNum(String userPhoneNum) {
    this.userPhoneNum = userPhoneNum;
  }


  public String getUserNickName() {
    return userNickName;
  }

  public void setUserNickName(String userNickName) {
    this.userNickName = userNickName;
  }


  public String getUserRealName() {
    return userRealName;
  }

  public void setUserRealName(String userRealName) {
    this.userRealName = userRealName;
  }


  public java.sql.Date getUserBirthday() {
    return userBirthday;
  }

  public void setUserBirthday(java.sql.Date userBirthday) {
    this.userBirthday = userBirthday;
  }


  public String getUserEmail() {
    return userEmail;
  }

  public void setUserEmail(String userEmail) {
    this.userEmail = userEmail;
  }


  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }


  public String getUserPassword() {
    return userPassword;
  }

  public void setUserPassword(String userPassword) {
    this.userPassword = userPassword;
  }

}

接下來,我們刪除掉其中的 getterand setter方法,使用Lombok@Data注解,簡(jiǎn)化class(視覺上)

import lombok.Data;

@Data
public class UserInfo {

  private long userId;
  private String userPhoneNum;
  private String userNickName;
  private String userRealName;
  private java.sql.Date userBirthday;
  private String userEmail;
  private String address;
  private String userPassword;

}

接下來,我們測(cè)試下 @Data 注解的威力

在我們最開始的章節(jié)中(啟動(dòng)測(cè)試) 創(chuàng)建了一個(gè)測(cè)試類,在測(cè)試類 new一個(gè) UserInfo實(shí)例

package cn.wuyuwei.tiny_shop.controller;

import cn.wuyuwei.tiny_shop.entity.UserInfo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @RequestMapping("/hello")
    public String hello(){

        UserInfo u = new UserInfo();
                
        return "hello spring boot";
    }
}

在 13行編寫 輸入u. ,可以看到,getter setter 方法都有了

在這里插入圖片描述

5. idea 生成帶注解的 class,配合Mybatis-plus使用

如果你成功的完成了上一個(gè)章節(jié)的閱讀與實(shí)踐,那么這個(gè)教程也不會(huì)太難

本章節(jié)大量?jī)?nèi)容參考前輩的文章 ,有些出入。

(大佬文章已說明可轉(zhuǎn)載)出處:悲涼的秋風(fēng),非常感謝

點(diǎn)擊右側(cè) database > 展開數(shù)據(jù)庫(kù)表 > 右擊任意空白處 > 找到 Go to scripts Directory


在這里插入圖片描述

找到schema 文件夾,右擊,new 一個(gè)文件,取名隨意, (我的命名 :Generate MyPOJOs.groovy)

在這里插入圖片描述

Generate MyPOJOs.groovy 中貼入代碼:

import com.intellij.database.model.ObjectKind
import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.io.*
import java.text.SimpleDateFormat
/* 以上為運(yùn)行該class 所需要的前置 jar*/

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "" // packageName = "com.sample;" 將固定的內(nèi)容刪除,并且在后面自定義函數(shù)進(jìn)行修改
typeMapping = [
        (~/(?i)tinyint|smallint|mediumint/)      : "Integer",
        (~/(?i)int/)                             : "Long",
        (~/(?i)bool|bit/)                        : "Boolean",
        (~/(?i)float|double|decimal|real/)       : "Double",
        (~/(?i)datetime|timestamp|date|time/)    : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                                : "String"

]
/* 打開窗口確認(rèn)生成目錄,這個(gè)不用改*/
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 className = javaName(table.getName(), true)
    def fields = calcFields(table)
    packageName = getPackageName(dir)
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
    printWriter.withPrintWriter {out -> generate(out, className, fields,table)}
    //new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields) }
}


// 獲取包所在文件夾路徑
def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}


def generate(out, className, fields,table) {
    out.println "package $packageName"
    out.println ""
    out.println ""

    out.println "import java.io.Serializable;"  //序列化
   /* Lombok 的注解
    out.println "import lombok.Getter;"
    out.println "import lombok.Setter;"
    out.println "import lombok.ToString;"
    */
    out.println "import com.baomidou.mybatisplus.annotation.TableField;"
    out.println "import com.baomidou.mybatisplus.annotation.TableName;"

    out.println "import lombok.Data;"  //此處我直接用 Data注解

    Set types = new HashSet()

    fields.each() {
        types.add(it.type)
    }

    if (types.contains("Date")) {
        out.println "import java.util.Date;"
    }

    if (types.contains("InputStream")) {
        out.println "import java.io.InputStream;"
    }
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author  HelloWorld\n" +
            " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
            " */"
    out.println ""
    /*
    out.println "@Setter"
    out.println "@Getter"
    out.println "@ToString"
    */
    out.println "@Data" // 使用 lombok注解

    out.println "@TableName (\""+table.getName() +"\" )"
    out.println "public class $className  implements Serializable {"
    out.println ""
    out.println genSerialID()
    fields.each() {     // 循環(huán)遍歷、輸出注解
        out.println ""

        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent.toString()}"    //輸出個(gè)性風(fēng)格的注釋
            out.println "\t */"
        }

        if (it.annos != ""){
            out.println "${it.annos.replace("[@TableId]", "")}"

        }

        // 輸出成員變量
        out.println "\tprivate ${it.type} ${it.name};"
    }

    out.println ""


    /*
     * 輸出 setter and getter,我們采用 lombok 的 @Data注解來從視覺上簡(jiǎn)化class
    fields.each() {
        out.println ""
        out.println "  public ${it.type} get${it.name.capitalize()}() {"
        out.println "    return ${it.name};"
        out.println "  }"
        out.println ""
        out.println "  public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
        out.println "    this.${it.name} = ${it.name};"
        out.println "  }"
        out.println ""
    }

    */
    out.println "}"
}

/*該函數(shù)用來 計(jì)算出數(shù)據(jù)庫(kù)表中的字段*/
/*
* 使用 Mybatis-plus 注解
* 使用 JPA 的同學(xué)請(qǐng)自行替換注解 
* 
* */
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
        def comm = [
                colName : col.getName(),
                name :  javaName(col.getName(), false),
                type : typeStr,
                commoent: col.getComment(),
                annos: "\t@TableField(\""+col.getName()+"\" )"
        ]

        if ("id".equals(Case.LOWER.apply(col.getName())))
        {
            comm.annos +=["@TableId"]
        }

        fields += [comm]
    }

}

def javaName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}


def isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}


static String genSerialID()
{
    return "\tprivate static final long serialVersionUID =  "+Math.abs(new Random().nextLong())+"L;"
}

在點(diǎn)擊 Generate MyPOJOs.groovy 后,生成如下所示代碼:

在這里插入圖片描述

注意:

  • 我使用的是 Mybatis-plus ,JPA的用戶請(qǐng)自行在 .groovy 中替換注解
  • 未能自動(dòng)生成 @TableId(Mybatis-plus 用戶)、@Id(JPA 用戶) 注解。需要自己手動(dòng)添加

6.使用Mybatis-plus 簡(jiǎn)化開發(fā)(安裝教程篇)

老規(guī)矩,先去Maven庫(kù)中查,使用熱度最高的那個(gè)版本,復(fù)制依賴,加入pom.xml

search Mybatis-plus

你可能會(huì)看見兩個(gè) 信息

在這里插入圖片描述

點(diǎn)擊此處查看區(qū)別

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容