修改pom.xml同意springboot版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.neuedu</groupId>
<artifactId>springboot_red_bag</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_red_bag</name>
<description>springboot_red_bag</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>cn.springboot</groupId>
<artifactId>best-pay-sdk</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
常见配置文件的书写
- yml格式配置
server:
port: 8889
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/user_case?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
jackson:
default-property-inclusion: non_null
mvc:
static-path-pattern: /static/**
ddl-auto: 参数说明
- create :每次运行时,都会重新创建表,所以数据会丢失
- create -drop: 每次运行程序会创建表结构, 程序结束删除表
- update :每次运行程序时,没有表会创建表,如果对象发生改变会更新表结构,原来数据不会清空,只会更新(推荐使用)
- validate 校验程序与数据库中字段是否相同, 不同会报错
- none 禁止使用DDL
实体类创建
Lombok常用的几个注解:
- @Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
- @AllArgsConstructor : 注在类上,提供类的全参构造
- @NoArgsConstructor : 注在类上,提供类的无参构造
- @Setter : 注在属性上,提供 set 方法
- @Getter : 注在属性上,提供 get 方法
- @EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
- @Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
package com.neuedu.springboot_red_bag.domain;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.math.BigDecimal;
/**
* @ Author :Eric Lee
* @ Date :Created in 14:30 2021/9/1
* @ Description:
* @ Modified By:
* @ Version : 1.
* // @Data lombok插件的一个注解,标识此注解的实体类不用自己写get和set方法了
* // @Entity 指定该类是实体类、
*/
@Entity
@Data
public class LuckyMoney {
//@Id 代表主键 @GeneratedValue代表自增长
@Id
@GeneratedValue
private Integer id;
// 红包金额
private BigDecimal money;
// 发红包的人
private String producer;
// 收红包的人
private String consumer;
public LuckyMoney(){
}
}
dao
package com.neuedu.springboot_red_bag.dao;
import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @ Author :Eric Lee
* @ Date :Created in 14:34 2021/9/1
* @ Description:
* @ Modified By:
* @ Version : 1.0
*/
// JpaRepository<实体类, 主键类型>
public interface LuckyMoneyRepository extends JpaRepository<LuckyMoney, Integer> {
}
- goto test 编写测试类
package com.neuedu.springboot_red_bag.dao;
import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class LuckyMoneyRepositoryTest {
//注入Bean
@Autowired
private LuckyMoneyRepository repository;
@Test
public void listAll(){
List<LuckyMoney> list = repository.findAll();
for (LuckyMoney luckyMoney : list)
System.out.println(luckyMoney);
}
}
完整测试实体类
package com.neuedu.springboot_red_bag.dao;
import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
@RunWith(SpringRunner.class)
@SpringBootTest
public class LuckyMoneyRepositoryTest {
//注入Bean
@Autowired
private LuckyMoneyRepository repository;
@Test
public void listAll(){
List<LuckyMoney> list = repository.findAll();
for (LuckyMoney luckyMoney : list)
System.out.println(luckyMoney);
}
@Test
public void save(){
LuckyMoney luckyMoney = new LuckyMoney();
luckyMoney.setConsumer("李四");
luckyMoney.setMoney(new BigDecimal(11));
luckyMoney.setProducer("张三");
// repository.save(luckyMoney);
// save 正常的保存
// saveAndFlush 是 在同一事物下提交前就保存
repository.saveAndFlush(luckyMoney);
}
@Test
public void save2(){
LuckyMoney luckyMoney = new LuckyMoney();
luckyMoney.setConsumer("李四");
luckyMoney.setMoney(new BigDecimal(11));
luckyMoney.setProducer("张三");
// repository.save(luckyMoney);
// save 正常的保存
// saveAndFlush 是 在同一事物下提交前就保存
repository.saveAndFlush(luckyMoney);
}
@Test
public void update(){
LuckyMoney luckyMoney = new LuckyMoney();
luckyMoney.setConsumer("王五");
luckyMoney.setMoney(new BigDecimal(21));
luckyMoney.setProducer("赵六");
luckyMoney.setId(2);
repository.save(luckyMoney);
}
@Test
public void getById(){
LuckyMoney luckyMoney = repository.findOne(2);
System.out.println(luckyMoney);
}
@Test
public void delete(){
repository.delete(3);
}
}
编写Controller
- @RestController注解相当于 @Controller + @ResponseBody
- @Controller 是将此类交给Spring进行管理
- @ResponseBody返回给客户端响应,如果是字符串原样返回, 如果是对象会返回Json串
get 请求和post请求
- GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
- GET书签可收藏,POST为书签不可收藏。
- GET能被缓存,POST不能缓存 。
- GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
- GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
- GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
- GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
- 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。
** 在发送密码或其他敏感信息时绝不要使用 GET !** - POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。、
请求路由注解
@RequestMapping ()指定方法的请求路径
@GetMapping() 表示只能发送get请求
@PostMapping() 表示只能发送post请求
编写获取红包列表接口
package com.neuedu.springboot_red_bag.controller;
import com.neuedu.springboot_red_bag.dao.LuckyMoneyRepository;
import com.neuedu.springboot_red_bag.domain.LuckyMoney;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @ Author :Eric Lee
* @ Date :Created in 14:50 2021/9/1
* @ Description:
* @ Modified By:
* @ Version : 1.0
*/
@RestController
@RequestMapping("/bag")
public class LuckMoneyController {
@Autowired
private LuckyMoneyRepository repository;
@GetMapping("/list")
public List<LuckyMoney> listAll(){
return repository.findAll();
}
}
- 发红包
@PostMapping("/post")
public LuckyMoney postRedBag(@RequestParam(value = "producer", required = true) String producer,
@RequestParam(value = "money", required = true) BigDecimal money){
LuckyMoney luckyMoney = new LuckyMoney();
luckyMoney.setMoney(money);
luckyMoney.setProducer(producer);
return repository.save(luckyMoney);
}
- 根据id进行查询
@GetMapping("/find/{id}")
public LuckyMoney findById(@PathVariable("id") Integer id){
return repository.findOne(id);
}
- 收红包
@PutMapping("/put/{id}")
public LuckyMoney put(@PathVariable("id")Integer id,
@RequestParam(value = "consumer", required = true)String consumer){
LuckyMoney luckyMoney = repository.findOne(id);
if (luckyMoney!=null){
luckyMoney.setConsumer(consumer);
return repository.save(luckyMoney);
}
return null;
}
@RequestParam, @PathVariable注解区别
@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来填充
@RequestParam
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
根据上面的这个URL,你可以用这样的方式来进行获取
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
@RequestParam 支持下面四种参数
- defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
- name 绑定本次参数的名称,要跟URL上面的一样
- required 这个参数是不是必须的
- value 跟name一样的作用,是name属性的一个别名
@PathVariable
这个注解能够识别URL里面的一个模板,我们看下面的一个URL
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
@RequestMapping("/hello/{id}")
public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}