前言:
本文档包含大致以下内容,转载请注明出处。
idea快速构建SpringBoot项目
SpringBoot项目使用Lombok简化开发
idea通过数据库表生成带注解的实体类class
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
你可能会看见两个 信息
点击此处查看区别