简介
开始
环境
IDE下载
推荐使用 Ultimate 学生邮箱注册终身免费
新建项目
如果你是社区版本是找不到spring Initializr的,可以通过 tstart.spring.io 来创建项目,或者搜索安装插件后会出现spring Initializr
maven 仓库镜像地址使用阿里云(如果慢的话)
删除不需要的文件
目录结构
启动服务
有三种方式
方法一 : IDE启动
方法二: 命令行启动
切换到项目目录下 ,命令行maven命令启动服务
方法三 : 先打包部署在服务器上后的启动
- 如何打包
- jar包启动
java -jar target/luckymony-0.0.1-SNAPSHOT.jar
写个响应
如图目录结构创建一个HelloController.java
localhost:8080/hello
默认8080
项目配置
方式一:修改application.properties文件
修改端口
server.port=8081
server.servlet.context-path=/luckymoney
方式二:修改application.yml文件(推荐)
server:
port: 8081
servlet:
context-path: /luckymoney/
推荐使用第二种yml,删除第一个properties
配置生效,重启服务后,访问之
代码使用配置文件属性
单个配置写法
- 编写配置文件
minMoney: 10
desc: 最少发${minMoney}元
- 引用配置文件的值
package com.example.luckymony.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
@RestController
public class HelloController {
@Value("${minMoney}")
private BigDecimal minMoney;
@Value("${desc}")
private String desc;
@GetMapping("/hello")
public String say() {
return "minMoney:" + minMoney + " desc:" + desc;
}
}
访问结果
配置对象写法
- yml文件
limit:
minMoney: 10
maxMoney: 100
desc: 最少发${limit.minMoney}元,最多发${limit.maxMoney}元,哈哈哈
- 新建一个java类,LimitConfig.java
package com.example.luckymony.controller;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Component
@ConfigurationProperties(prefix = "limit")
public class LimitConfig {
private BigDecimal minMoney;
private BigDecimal maxMoney;
public BigDecimal getMinMoney() {
return minMoney;
}
public void setMinMoney(BigDecimal minMoney) {
this.minMoney = minMoney;
}
public BigDecimal getMaxMoney() {
return maxMoney;
}
public void setMaxMoney(BigDecimal maxMoney) {
this.maxMoney = maxMoney;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
private String desc;
}
- 使用配置
运行
两套配置文件
- 复制yml文件,后缀名-dev
- 原来的yml文件,修改为下图
运行
配置两套文件,不需要手动切换不同配置文件,命令行启动设置配置
dev
java -jar -Dspring.profiles.active=dev target/luckymony-0.0.1-SNAPSHOT.jar
prdo
java -jar -Dspring.profiles.active=prod target/luckymony-0.0.1-SNAPSHOT.jar
配置小结
Controller使用
@Controller 使用模板
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 建立模板
- 使用模板
访问
另外:想使用@Controller返回数据(不是h5页面),需要加上 @ResponseBody,也就是说@Controller+@ResponseBody=@RestController(下图用在类上)
下图用在方法上
同个地址指向同一个方法
get请求+ 我们想 hello/say 如何配置
post请求
同时支持POST GET
三种请求注解
获取请求参数
/连接符
?连接符
没有默认值 id必须传递
有默认值 id可以不传递
Post 传参
数据库
依赖
不加版本号
配置数据库
spring:
profiles:
active: prod
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&allowMultiQueries=true&useUnicode=true&useSSL=true&serverTimezone=GMT%2B8
username: user
password: user
jpa:
database: MYSQL
show-sql: true
hibernate:
ddl-auto: update
naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
编写javabean对应数据库的一个表
package com.example.luckymony.controller;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.math.BigDecimal;
@Entity
public class Luckmoney {
@Id
@GeneratedValue
private Integer id;
private BigDecimal money;
private String producer;
private String consumer;
public Luckmoney() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public BigDecimal getMoney() {
return money;
}
public void setMoney(BigDecimal money) {
this.money = money;
}
public String getProducer() {
return producer;
}
public void setProducer(String producer) {
this.producer = producer;
}
public String getConsumer() {
return consumer;
}
public void setConsumer(String consumer) {
this.consumer = consumer;
}
}
ok,运行一下,会发现数据库有这个Luckymoney表了
MAC数据库可视化工具
接口实现 LuckymoneyController
1.LuckymoneyRepository
package com.example.luckymony.dao;
import com.example.luckymony.bean.Luckmoney;
import org.springframework.data.jpa.repository.JpaRepository;
public interface LuckymoneyRepository extends JpaRepository<Luckmoney,Integer> {//实体类+id类型
}
2. LuckymoneyController
package com.example.luckymony.controller;
import com.example.luckymony.bean.Luckmoney;
import com.example.luckymony.dao.LuckymoneyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class LuckymoneyController {
@Autowired
private LuckymoneyRepository repository;
/**
* 获取红包列表
*/
@GetMapping("/luckymoneys")
public List<Luckmoney> list() {
return repository.findAll();
}
}
ok 看看
数据库随便填写几条数据
3. 创建红包
/**®
* 创建红包
*/
@GetMapping("/create")
public Luckmoney create(@RequestParam("producer") String producer,
@RequestParam("money") BigDecimal money) {
Luckmoney luckmoney = new Luckmoney();
luckmoney.setProducer(producer);
luckmoney.setMoney(money);
return repository.save(luckmoney);
}
如果报错,把之前手动在数据库添加的数据删掉,因为这样会与系统维护的自增长id有冲突
通过id查询红包
/**
* 通过id查询红包
*/
@GetMapping("/getbyid")
public Luckmoney getById(@RequestParam("id") Integer id) {
return repository.findById(id).orElse(null);
}
注意 orElse(null)
更新数据
post方法
PathVariable在url里用/链接
RequestParam在参数里用?链接
/**
* 更新红包(领红包)
*/
@PostMapping("/update/{id}")
public Luckmoney update(@PathVariable("id") Integer id
, @RequestParam("consumer") String consumer) {
Luckmoney luckmoney = new Luckmoney();
luckmoney.setId(id);
luckmoney.setConsumer(consumer);
return repository.save(luckmoney);
}
上面是错的,因为repository.save 执行的是下面的SQL语句,没指定producer,就变成了null
update luckmoney set consumer=?, money=?, producer=? where id=?
修改
/**
* 更新红包(领红包)
*/
@PostMapping("/update/{id}")
public Luckmoney update(@PathVariable("id") Integer id
, @RequestParam("consumer") String consumer) {
// 先查询数据,在去更新数据
Optional<Luckmoney> optional = repository.findById(id);
if (optional.isPresent()){
Luckmoney luckmoney = optional.get();
luckmoney.setConsumer(consumer);
repository.save(luckmoney);
}
return null;
}
正常了
事务
1. 数据库要先支持事物
2. 代码 Service
同事发出去两个红包,如果有错就都不发,(数据库设置了红包字符长度必须小于5,所以1314.00数据库不让写入,520.00是可以写入的,我们的目的是因为1314.00没写入,520.00也不能写入)
package com.example.luckymony.service;
import com.example.luckymony.bean.Luckmoney;
import com.example.luckymony.dao.LuckymoneyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
@Service
public class LuckmoneyService {
@Autowired
private LuckymoneyRepository repository;
@Transactional
public void createTwo() {
Luckmoney luckmoney1 = new Luckmoney();
luckmoney1.setProducer("张无忌");
luckmoney1.setMoney(new BigDecimal("520"));
repository.save(luckmoney1);
Luckmoney luckmoney2 = new Luckmoney();
luckmoney2.setProducer("赵敏");
luckmoney2.setMoney(new BigDecimal("1314"));
repository.save(luckmoney2);
}
}
代码 Controller 使用Service逻辑
结果
红包都没发出去