前言:
本文档包含大致以下内容,转载请注明出处。
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 依赖中有
那就要进行如下操作
provided
- 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;
}
}
接下来,我们删除掉其中的 getter
and 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
* 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
你可能会看见两个 信息
点击此处查看区别