# 内容摘要
- 常用的开发结构
- 星星点点的小技巧
# 1. 常用开发结构
最简单的 Springboot 集成 Spring Data JPA 教程: https://blog.csdn.net/huanongying123/article/details/104279231
-
新建 springboot 项目,命名为 demo,springboot 版本为 2.2.9.RELEASE
1
2
3
4
5
6<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> -
在 pom 文件中,导入依赖的 jar 包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> -
在
resources
目录下新建一个配置文件application.yml
,也可以直接在原有的配置文件application.properties
中添加相关配置1
2
3
4
5
6
7
8
9
10
11
12
13
14server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root # 替换为你本地mysql的用户名和密码
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true # 执行数据库操作时,在控制台打印sql语句
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect # 数据库方言配置
hibernate:
ddl-auto: update # 第一次加载自动建立表,服务重启会进行表的更新设置服务器端口号为 8080,这样我们可以通过 http://127.0.0.1:8080 访问我们的程序
设置数据库 mysql,这里我们需要在本地的 mysql 中创建一个 test 数据库,命令行中操作如下
1
2
3
4[root@host]# mysql -u root -p
Enter password:****** # 登录后进入终端
mysql> create DATABASE test;设置 jpa 相关参数,jpa 全称 Java Persistence API,定义了一系列标准,让实体类和数据库中的表建立一个对应关系,使我们在 java 中操作实体类就能达到操作数据库中表的效果。 jpa 介绍博客 https://zhuanlan.zhihu.com/p/110024146
-
代码分层
spring boot 框架一般分为 dao、model、controller、service 四层。具体代码结构如下图所示:
图中我将 controller 用 rest 代替,仅是个人习惯
-
dao 层
负责访问数据库,无需写复杂的 sql 语言,可以根据命名规则定义相应的查询方法。示例如下:
1
2
3
4
5
6
7
8
9
10package com.example.demo.dao;
import com.example.demo.model.TestBean;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface TestDao extends JpaRepository<TestBean, String> {
Optional<TestBean> findById(String id);
TestBean findByName(String Name);
}TestDao 继承了
JpaRepository
,JpaRepository
可以查找所有实体,执行缓存和数据库同步。JpaRepository
接口有 2 个泛型参数,第一个为实际存储的类型,第二个参数为主键。上例中存储的类型为
TestBean
,而TestBean
的主键类型为 String。根据命名规则我们定义了
findById
方法来查询指定 id 的TestBean
。Optional
用来处理可能出现的空指针问题,具体用法见 https://www.jianshu.com/p/c1480145a961 -
model 层
也称 Entity(实体)层或 pojo(plain old java object)层,一般数据库中一张表对应一个实体类,类属性同表字段一一对应。简单示例如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14package com.example.demo.model;
import lombok.Data;
import javax.persistence.*;
public class TestBean {
private String id;
private String name;
}@Data
可以提高代码的简介度,省去了代码中大量的 get ()、set ()、toString () 等方法。介绍: https://www.jianshu.com/p/c1ee7e4247bf@Entity
声明该类为实体类@Id
标注用于声明一个实体类的属性映射为数据库的主键列@Id
详解 https://xiaoxiami.gitbook.io/spring-boot/guan-xi-xing-shu-ju-ku/spring-data-jpa/id-he-generatedvalue-xiang-jie@Table
将实体类与数据表test_table
绑定,第一次操作实体类会生成相应的数据表 -
rest 层
负责前后端交互,接收前端 GET/POST 请求,调用 service 层中的处理函数,接收 service 层的返回数据,并将其返回给前端。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package com.example.demo.rest;
import com.example.demo.model.TestBean;
import com.example.demo.service.TestServiceImp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
public class TestService {
private TestServiceImp testServiceImp;
public String add( TestBean testBean){
return testServiceImp.add(testBean);
}
}声明了一个接口 “demo/add”,实现了添加 testBean 的功能。成功返回 “success”,失败返回 “fail”。可以通过访问 http://127.0.0.1:8080/demo/add 来调用这个接口
@RequestBody
会自动将 post 中的数据包装为TestBean
形式 -
service 层
业务逻辑层,调用 dao 层接口,完成基本功能设计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.example.demo.service;
import com.example.demo.dao.TestDao;
import com.example.demo.model.TestBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
public class TestServiceImp {
private TestDao testDao;
public String add(TestBean testBean){
try {
testDao.save(testBean);
return "success";
} catch (Exception e) {
log.error("add testBean error!", e);
return "fail";
}
}
}使用
TestDao
操作实体类TestBean
,进行保存。
-
-
程序使用效果
运行程序,使用
postman
进行测试,结果如下:打开
DataGrip
查看数据库中的表,结果如下图:至此,一个极简 springboot 项目就完成了 o。
# 2. 星星点点的小技巧
-
List 和 String 互相转换
1
2
3// List => String
List<Integer> intList = Arrays.asList(1,2,3);
System.out.println(intList.toString());结果:
1
[1, 2, 3]
使用 List.toString () 功能即可得到 List 的 String 表示
1
2
3
4//String => List
String listStr = "[1,2,3]"
ObjectMapper mapper = new ObjectMapper();
List<Integer> resList = Arrays.asList(mapper.readValue(listStr, Integer[].class)); -
restful 接口简单获取 POST/GET 请求参数
1
2
3
4
5// 假设post 请求 {"id": "0"}
public void get( String id){
System.out.println(id);
}使用
@RequestParam
注解,当没有指定 value 时,将会接受与变量名相同的请求参数接收参数的方式: https://juejin.cn/post/6844903866421477384
-
java1.8 Stream 机制
可以用简单的语句完成一系列操作
参考博客: https://colobu.com/2016/03/02/Java-Stream/
使用 Stream 进行数组过滤:
1
2
3
4
5List<Integer> l = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
List<Integer> t = l.stream() // 生成一个stream对象
.filter( i -> i % 2 == 0) // 返回满足断言(predicate)的数据。
.collect(Collectors.toList());
System.out.println(t); //[2, 4, 6, 8] -
依赖全部爆红的解决
博客: https://blog.csdn.net/u014672466/article/details/80211340
把依赖全部注释,Maven 刷新一下,解开注释,再重新刷新一遍,解决。