idea搭建SpringBoot项目,快速开发流程指南,Lombok简化开发,Groovy根据数据库表生成带注解的实体类

前言:

本文档包含大致以下内容,转载请注明出处。

  1. idea快速构建SpringBoot项目

  2. SpringBoot项目使用 Lombok简化开发

  3. idea通过数据库表生成带注解的实体类class

  4. Mybatis-plus的安装

有机会会慢慢更新,还望各位看官多多指导交流。

1. SpringBoot项目创建

  • 使用 idea 快速构建 Spring boot 应用
在这里插入图片描述

Artifact 为项目名称,与 Group组合为 package

在这里插入图片描述

此处只需要选择 web start 就行,后期需要什么就往Maven pom.xml里加依赖

在这里插入图片描述

下一步直接完成点击 finish

下一步点击 Import Changes,此时Maven 就在导入依赖

在这里插入图片描述

2. 创建过程中的常见问题

Cannot resolve symbol 'springframework'

爆红,基本上是因为 maven 依赖没导入成功,解决方法,点击右侧 Maven工具 clean, 再 install

在这里插入图片描述

3. 启动测试

创建一个 测试类 如图

在这里插入图片描述

Application run

以下是通过 Application 的方式 run,(就是所谓的直接用运行普通java class 的方式)


在这里插入图片描述

如果内置的tomcat 依赖中有 <scope>provided</scope> 那就要进行如下操作

  • provided适合在编译和测试的环境
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

回到 main 方法里面,右击 run,默认启动 8080端口

在这里插入图片描述

如果需要更改端口号和其他配置请加入配置文件application.yml,复制以下代码 (也可用properties 后缀的格式),其中的参数请自行修改。注意数据库连接驱动也要在pom.xml中导入

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



spring:
  application:
    name: tiny_shop #应用名称
  datasource: #数据库相关配置
    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 端口号将会变成指定的端口号

在浏览器中输入 http://localhost:8080/hello, 得到结果

在这里插入图片描述

Spring Boot Application run

在这里插入图片描述

4. 使用插件简化开发(安装教程篇)

idea 安装 Lombok插件使用@Data简化 entity class 的编写

  • @Data 提供了 类属性的 getter and setter (常用)
  • @Data 提供了 类的toString 方法 (常用)
  • @Data 提供了 类 的equalsAndHashCode方法
  • etc... 详细信息点击跳转

其他常用注解:

  • @AllArgsConstructor:全参构造函数
  • @NoArgsContructor:无参构造函数

Settings > Plugins > MarketPlace > Search Lombok > install

在这里插入图片描述

此处我们先安装,安装完了重启一次 idea,然后看下一步(一键生成对应数据库表的 class )

注意:

如果你的maven库中已经有了 lombok,则可在实体类上面直接使用(导入lombok后) @Data 来注解class,

如果没有请前往 https://mvnrepository.com/artifact/org.projectlombok/lombok 选中热度最高的进行 pom.xml 添加依赖

在这里插入图片描述

点击版本号 1.18.8 ,进入详细页面,复制依赖信息,加入pom.xml,然后 Maven插件提示 import change

在这里插入图片描述

idea 通过数据库表生成对应的 class 实体类

首先把数据库先建立好,在此处就不多说了,数据库设计很费时间。(Navicat视图建表工具)

在这里插入图片描述

回到idea,点击右侧的 database > 点击 + 号 > 选择你需要使用的数据库产品(此处为 Mysql)

提示下载驱动,点击下载安装


在这里插入图片描述

输入对应的参数 点击 test Connection 测试连接,成功的前往下一步(跳过)

未成功请到 Advanced 中设置时区,或者你可以直接更改数据库的时区点击查看教程

我的数据库版本,Server version: 8.0.13 MySQL Community Server - GPL)

MySQL默认的时区是UTC时区,而我要将serverTimezone的值设为GMT+008(东八区),即告诉IDEA,MySQL服务器时区是东八区时区

在这里插入图片描述

找到 serverTimezone,加上参数 GMT+008,你也可以通过更改数据库时区统一

在这里插入图片描述

测试连接成功即可

在这里插入图片描述

回到工作区刷新下,或者重新打开,就能展开跟数据库结构中一致的表结构了

在这里插入图片描述

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

在这里插入图片描述

然后在弹出的路径中找到你要生成到的目标目录,点击确认即可,生成的代码如下:

需要注意

  • 表名称被驼峰化了
  • 包名是错误的,需要自己修改成项目对应的包名
  • 自动添加了 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注解,简化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;

}

接下来,我们测试下 @Data 注解的威力

在我们最开始的章节中(启动测试) 创建了一个测试类,在测试类 new一个 UserInfo实例

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使用

如果你成功的完成了上一个章节的阅读与实践,那么这个教程也不会太难

本章节大量内容参考前辈的文章 ,有些出入。

(大佬文章已说明可转载)出处:悲凉的秋风,非常感谢

点击右侧 database > 展开数据库表 > 右击任意空白处 > 找到 Go to scripts Directory


在这里插入图片描述

找到schema 文件夹,右击,new 一个文件,取名随意, (我的命名 :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
/* 以上为运行该class 所需要的前置 jar*/

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

packageName = "" // packageName = "com.sample;" 将固定的内容删除,并且在后面自定义函数进行修改
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"

]
/* 打开窗口确认生成目录,这个不用改*/
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() {     // 循环遍历、输出注解
        out.println ""

        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent.toString()}"    //输出个性风格的注释
            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注解来从视觉上简化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 "}"
}

/*该函数用来 计算出数据库表中的字段*/
/*
* 使用 Mybatis-plus 注解
* 使用 JPA 的同学请自行替换注解 
* 
* */
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;"
}

在点击 Generate MyPOJOs.groovy 后,生成如下所示代码:

在这里插入图片描述

注意:

  • 我使用的是 Mybatis-plus ,JPA的用户请自行在 .groovy 中替换注解
  • 未能自动生成 @TableId(Mybatis-plus 用户)、@Id(JPA 用户) 注解。需要自己手动添加

6.使用Mybatis-plus 简化开发(安装教程篇)

老规矩,先去Maven库中查,使用热度最高的那个版本,复制依赖,加入pom.xml

search Mybatis-plus

你可能会看见两个 信息

在这里插入图片描述

点击此处查看区别

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

推荐阅读更多精彩内容