idea搭建SpringBoot项目,快速开发流程指南

前言:

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

  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

你可能会看见两个 信息

在这里插入图片描述

点击此处查看区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值