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