一、导引
1、特点
- 化繁为简,简化配置
- 备受关注,是下一代框架
- 微服务的入门级微框架
2、打包
-
空项目结构
-
打包项目 mvn clean package
打包完成会生成 target 目录。 -
启动 java -jar xxx.jar
上一步打包完成后,可直接在命令行进行启动。
二、配置
1、properties方式
resources/application.properties
# 端口
server.port=8081
# 项目上下文路径
server.servlet.context-path=/luckymoney
2、YML方式
resources/application.yml
server:
port: 800
servlet:
context-path: /luckymoney
# 单个配置
minMoney: 1
description: 最少${limit.minMoney}元 # 配置中可以使用配置
# 配置类
limit:
minMoney: 1
maxMoney: 9999
description: 最少${limit.minMoney}元,最多${limit.maxMoney}元
- 单个配置注入
@Value("${minMoney}") // 配置属性注入
private BigDecimal minMoney;
@Value("${description}")
private String description;
- 配置类注入
@Component
@ConfigurationProperties(prefix = "limit") // 自动注入 limit 项的所有数据
public class LimitConfig {
private BigDecimal minMoney;
private BigDecimal maxMoney;
private String description;
// get、set方法
}
-
环境配置
开发环境和生成环境的配置
- application.yml 环境选择
spring:
profiles:
active: dev
- application-dev.yml 开发环境
server:
port: 800
servlet:
context-path: /luckymoney
limit:
minMoney: 0.01
maxMoney: 9999
description: 最少${limit.minMoney}元,最多${limit.maxMoney}元
- application-prod.yml 生产环境
server:
port: 800
servlet:
context-path: /luckymoney
limit:
minMoney: 1
maxMoney: 9999
description: 最少${limit.minMoney}元,最多${limit.maxMoney}元
-
启动时选择环境
也可在启动时选择配置文件
java -jar -Dspring.profiles.active=prod target/luckymoney_xxx.jar
三、Controller的使用
1、请求
注解 | 说明 |
---|---|
@Controller | 处理http请求 |
@RestController | Spring4之后新加的注解,原来返回 json需要@ResponseBody配合@Controller |
@RequestMapping | 配置url映射 |
-
@RestController = @Controller + @ResponseBody
-
@GetMapping({"/hello", “hi”}) // get请求, 同时绑定多个地址
-
@RequestMapping("/hello") // 同时支持get和post请求 ,可用在类上和方法上
-
@PostMapping("/say") // post请求
2、参数获取
注解 | 说明 |
---|---|
@PathVariable | 获取url中的数据 |
@RequestParam | 获取请求参数的值 |
// 获取url上的数据
// url形式: http://localhost:800/luckymoney/hello/says/100
public String says(@PathVariable("id") Integer id) {
return "id: " + id;
}
// 获取url上键值对形式的数据
// url形式: http://localhost:800/luckymoney/hello/sayss?id=100
// 同时也能获取 post 方式提交的参数
public String sayss(@RequestParam("id") Integer myid) {
return "id: " + myid;
}
// url不提交参数时,赋予默认值
public String sayss(@RequestParam(value = "id",
required = false, defaultValue = "0") Integer myid) { // id的默认为0
return "id: " + myid;
}
四、数据库
1、JPA
JPA – Java Persistence APl 定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。
2、RESTful API设计
请求类型 | 请求路径 | 功能 |
---|---|---|
GET | /luckymoneys | 获取红包列表 |
POST | /luckymoneys | 创建一个红包 |
GET | /luckymoneys/id | 通过id查询红包 |
PUT | /luckymoneys/id | 通过id更新红包 |
3、pom依赖
<!-- 添加 Jpa 和 mysql 的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
4、yml配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/luckymoney?serverTimezone=GMT
username: root
password: 102
jpa:
hibernate:
ddl-auto: create # update
show-sql: true # 日志显示 sql执行语句
6、创建库、实体
创建数据库,数据表在 ddl-auto 属性设置为 create 时,可根据实体类自动生成,注意在创建好后需要将 create 改为 update。
- 实体类注解
@Entity // 该类为实体类
@DynamicUpdate // 该注解启用自动更新, Mysql上设置的自动更新的字段
@Data // lombok 自动补充 get/set方法,toString()方法
public class Girl {
@Id
// 注意:主键策略,否则引发异常:java.sql.SQLSyntaxErrorException:
// Table 'sell.hibernate_sequence' doesn't exist
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// javax.validation 包下的字段校验注解
@NotBlank(message = "这个字段必传")
private String size;
@Min(value = 18, message = "未成年禁止")
// @NotNull
// @Max()
// @Length()
private Integer age;
@NotNull(message = "金额必传")
private Double money;
public Girl() { }
}
- 启动后,自动创建数据表,注意后面要 改为 update .
6、CUDR
- 新建接口继承JpaRepository 获取配置好的操作方法
public interface LuckymoneyRepository
extends JpaRepository<Luckymoney, Integer> {
}
- 控制层直接使用
@RestController
public class LuckymoneyController {
@Autowired
private LuckymoneyRepository repository; // 注入查询资源库
// 查询所有
@GetMapping("/luckymoneys")
public List<Luckymoney> list() {
return repository.findAll();
}
// 保存单条数据
@PostMapping("/luckymoneys")
public Luckymoney create(@RequestParam("producer") String producer,
@RequestParam("money") BigDecimal money) {
Luckymoney luckymoney = new Luckymoney();
luckymoney.setProducer(producer);
luckymoney.setMoney(money);
return repository.save(luckymoney);
}
// 根据Id字段查询
@GetMapping("/luckymoneys/{id}")
public Luckymoney findById(@PathVariable("id") Integer id) {
return repository.findById(id).orElse(null); // Optional对象
}
// save时,如果传入主键则为更新
@PutMapping("/luckymoneys/{id}")
public Luckymoney update(@PathVariable("id") Integer id,
@RequestParam("consumer") String consumer) {
// 要先查询再更新,否则为set的数据都会被更新为null
Optional<Luckymoney> optional = repository.findById(id);
if (optional.isPresent()) {
Luckymoney luckymoney = optional.get();
luckymoney.setId(id);
luckymoney.setConsumer(consumer);
// 依据主键更新数据
return repository.save(luckymoney);
}
return null;
}
}
-
JpaRepository 解析方法规则
规则:find+全局修饰+By+实体的属性名称+限定词+连接词+ …(其它实体属性)+OrderBy+排序属性+排序方向
关键词: IsNull, IsNotNull, Like, NotLike, Containing, In, NotIn …
排序方向: Asc, Desc
连接词: And, Or,Between,LessThan,isNull …
如: findBySalaryLessThan(int max); findByUsernameLike(String user); …
-
更多
7、mysql 时区出错
// 如下错误
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one timezone.
....
安装mysql的时候时区设置的不正确 mysql默认的是美国的时区,而中国大陆要比他们迟8小时,采用+8:00格式
-
解决
在jdbc连接的url后面加上serverTimezone=GMT即可解决问题
url: jdbc:mysql://127.0.0.1:3306/luckymoney?serverTimezone=GMT
五、事务
数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
注解实现事务(数据库提供支持)。
1、Service层
@Service
public class LuckymoneyService {
@Autowired
private LuckymoneyRepository repository;
// 事务 指数据库的事务 (需要InnoDB的引擎支持)
@Transactional
public void createTwo() {
// 两次插入数据要么都成功,要么都失败
Luckymoney luckymoney1 = new Luckymoney();
luckymoney1.setProducer("青雀");
luckymoney1.setMoney(new BigDecimal("120"));
repository.save(luckymoney1);
Luckymoney luckymoney2 = new Luckymoney();
luckymoney2.setProducer("青雀");
luckymoney2.setMoney(new BigDecimal("1120"));
repository.save(luckymoney2);
}
}
2、Controller层
@Autowired
private LuckymoneyService service;
@PostMapping("/luckymoneys/two")
public void createTwo() {
service.createTwo();
}