前言:
本文檔包含大致以下內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處。
idea快速構(gòu)建SpringBoot項(xiàng)目
SpringBoot項(xiàng)目使用Lombok簡化開發(fā)
idea通過數(shù)據(jù)庫表生成帶注解的實(shí)體類class
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)測試
創(chuàng)建一個(gè) 測試類 如圖
Application run
以下是通過 Application 的方式 run,(就是所謂的直接用運(yùn)行普通java class 的方式)

如果內(nèi)置的tomcat 依賴中有
<scope>provided</scope>那就要進(jìn)行如下操作
- provided適合在編譯和測試的環(huán)境
回到 main 方法里面,右擊 run,默認(rèn)啟動(dòng) 8080端口
如果需要更改端口號(hào)和其他配置請(qǐng)加入配置文件
application.yml,復(fù)制以下代碼 (也可用properties后綴的格式),其中的參數(shù)請(qǐng)自行修改。注意數(shù)據(jù)庫連接驅(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ù)庫相關(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. 使用插件簡化開發(fā)(安裝教程篇)
idea 安裝 Lombok插件使用@Data簡化 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ù)庫表的 class )
注意:
如果你的
maven庫中已經(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ì)頁面,復(fù)制依賴信息,加入pom.xml,然后 Maven插件提示 import change
idea 通過數(shù)據(jù)庫表生成對(duì)應(yīng)的 class 實(shí)體類
首先把數(shù)據(jù)庫先建立好,在此處就不多說了,數(shù)據(jù)庫設(shè)計(jì)很費(fèi)時(shí)間。(Navicat視圖建表工具)
回到idea,點(diǎn)擊右側(cè)的 database > 點(diǎn)擊 + 號(hào) > 選擇你需要使用的數(shù)據(jù)庫產(chǎn)品(此處為 Mysql)
提示下載驅(qū)動(dòng),點(diǎn)擊下載安裝
輸入對(duì)應(yīng)的參數(shù) 點(diǎn)擊 test Connection 測試連接,成功的前往下一步(跳過)
未成功請(qǐng)到 Advanced 中設(shè)置時(shí)區(qū),或者你可以直接更改數(shù)據(jù)庫的時(shí)區(qū)點(diǎn)擊查看教程
我的數(shù)據(jù)庫版本,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ù)庫時(shí)區(qū)統(tǒng)一
測試連接成功即可
回到工作區(qū)刷新下,或者重新打開,就能展開跟數(shù)據(jù)庫結(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注解,簡化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 注解的威力
在我們最開始的章節(jié)中(啟動(dòng)測試) 創(chuàng)建了一個(gè)測試類,在測試類
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é)大量內(nèi)容參考前輩的文章 ,有些出入。
(大佬文章已說明可轉(zhuǎn)載)出處:悲涼的秋風(fēng),非常感謝
點(diǎn)擊右側(cè) database > 展開數(shù)據(jù)庫表 > 右擊任意空白處 > 找到 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注解來從視覺上簡化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ù)庫表中的字段*/
/*
* 使用 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 簡化開發(fā)(安裝教程篇)
老規(guī)矩,先去Maven庫中查,使用熱度最高的那個(gè)版本,復(fù)制依賴,加入pom.xml
你可能會(huì)看見兩個(gè) 信息
點(diǎn)擊此處查看區(qū)別