前言:

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

  1. idea快速构建SpringBoot项目
  2. SpringBoot项目使用 Lombok简化开发
  3. idea通过数据库表生成带注解的实体类class
  4. Mybatis-plus的安装

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

1. SpringBoot项目创建

  • 使用 idea 快速构建 Spring boot 应用

fleet spring boot 开发 springboot开发步骤_java

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

fleet spring boot 开发 springboot开发步骤_mybatis_02

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

fleet spring boot 开发 springboot开发步骤_mybatis_03


下一步直接完成点击 finish下一步点击 Import Changes,此时Maven 就在导入依赖

fleet spring boot 开发 springboot开发步骤_java_04

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

Cannot resolve symbol 'springframework'

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

fleet spring boot 开发 springboot开发步骤_mybatis_05

3. 启动测试

创建一个 测试类 如图

fleet spring boot 开发 springboot开发步骤_数据库_06

Application run

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

fleet spring boot 开发 springboot开发步骤_mybatis_07

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

  • provided适合在编译和测试的环境

fleet spring boot 开发 springboot开发步骤_java_08

fleet spring boot 开发 springboot开发步骤_java_09

fleet spring boot 开发 springboot开发步骤_mvc_10

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

fleet spring boot 开发 springboot开发步骤_数据库_11

如果需要更改端口号和其他配置请加入配置文件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, 得到结果

fleet spring boot 开发 springboot开发步骤_mvc_12

Spring Boot Application run

fleet spring boot 开发 springboot开发步骤_mybatis_13


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

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

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

其他常用注解:

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

Settings > Plugins > MarketPlace > Search Lombok > install

fleet spring boot 开发 springboot开发步骤_mvc_14

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

注意:

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

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

fleet spring boot 开发 springboot开发步骤_java_15

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

fleet spring boot 开发 springboot开发步骤_spring_16

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

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

fleet spring boot 开发 springboot开发步骤_java_17

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

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

fleet spring boot 开发 springboot开发步骤_数据库_18

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

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

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

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

fleet spring boot 开发 springboot开发步骤_java_19

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

fleet spring boot 开发 springboot开发步骤_mvc_20

测试连接成功即可

fleet spring boot 开发 springboot开发步骤_spring_21

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

fleet spring boot 开发 springboot开发步骤_数据库_22

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

fleet spring boot 开发 springboot开发步骤_mybatis_23


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

需要注意

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

fleet spring boot 开发 springboot开发步骤_数据库_24

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

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


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


fleet spring boot 开发 springboot开发步骤_数据库_25


找到schema 文件夹,右击,new 一个文件,取名随意, (我的命名 :Generate MyPOJOs.groovy)

fleet spring boot 开发 springboot开发步骤_java_26

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 后,生成如下所示代码:

fleet spring boot 开发 springboot开发步骤_java_27

注意:

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

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

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

search Mybatis-plus

你可能会看见两个 信息

fleet spring boot 开发 springboot开发步骤_java_28

点击此处查看区别