SpingCloud中使用RESTful风格编程有何作用?
简而言之,使用RESTful风格编程可以通过选择不同的请求发送方式(Get、Post、Put、Delete),来代替书写不同的访问路径,较为简洁
一.创建服务提供者Provider
1.导入依赖
<!--引用SpringCloud-API模块-->
<!--Dept实体类所在模块-->
<dependency>
<groupId>org.example</groupId>
<artifactId>SpringCloud-API</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring boot web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>
<!--mysql及mybatis依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--热部署依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.6.7</version>
</dependency>
2.编写主启动类
注:记得添加@SpringBootApplication注解
@SpringBootApplication
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
3.编写DAO层
注:记得添加@Mapper注解
@Mapper
public interface DeptMapper {
Dept queryByDeptNo(Long deptno);
List<Dept> queryAll();
boolean addDept(Dept dept);
boolean updateDept(Dept dept);
boolean deleteDept(Long deptno);
}
4.编写Server层
public interface DeptService {
Dept queryByDeptNo(Long deptno);
List<Dept> queryAll();
boolean addDept(Dept dept);
boolean updateDept(Dept dept);
boolean deleteDept(Long deptno);
}
注:实现类上记得添加@Service注解
@Service
public class DeptServiceImpl implements DeptService{
@Autowired
DeptMapper deptMapper;
@Override
public Dept queryByDeptNo(Long deptno) {
return deptMapper.queryByDeptNo(deptno);
}
@Override
public List<Dept> queryAll() {
return deptMapper.queryAll();
}
@Override
public boolean addDept(Dept dept) {
return deptMapper.addDept(dept);
}
@Override
public boolean updateDept(Dept dept) {
return deptMapper.updateDept(dept);
}
@Override
public boolean deleteDept(Long deptno) {
return deptMapper.deleteDept(deptno);
}
}
5.编写Controller层
GetMapping用于查询、PostMapping用于添加、PutMapping用于修改、DeleteMapping用于删除
RestController为Controller与ResponseBody的合成注解(标记Controller组件及使请求方法返回Json数据)
@RestController
@RequestMapping("/Dept")
public class DeptController {
@Autowired//自动写入实现类
DeptServiceImpl deptServiceImpl;
@GetMapping("/{deptno}")
public Dept queryByDeptNo(@PathVariable("deptno") Long deptno) {
return deptServiceImpl.queryByDeptNo(deptno);
}
@GetMapping
public List<Dept> queryAll() {
return deptServiceImpl.queryAll();
}
@PostMapping()
public boolean addDept(Dept dept) {
return deptServiceImpl.addDept(dept);
}
@PutMapping
public boolean update(Dept dept){
return deptServiceImpl.updateDept(dept);
}
@DeleteMapping("/{deptno}")
public boolean deleteDept(@PathVariable("deptno") Long deptno){
return deptServiceImpl.deleteDept(deptno);
}
}
6.编写Mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.alan.springcloud.DAO.DeptMapper">
<select id="queryByDeptNo" parameterType="Long" resultType="Dept">
select *
from mybatis.dept
where deptno = #{deptno};
</select>
<select id="queryAll" resultType="Dept">
select *
from mybatis.dept;
</select>
<insert id="addDept" parameterType="Dept">
insert into mybatis.dept (dname, db_source)
VALUES (#{dname}, DATABASE());
</insert>
<update id="updateDept" parameterType="Dept">
update mybatis.dept
set dname = #{dname},
db_source = DATABASE()
where deptno = #{deptno};
</update>
<delete id="deleteDept" parameterType="Long">
delete
from mybatis.dept
where deptno = #{deptno}
</delete>
</mapper>
07.配置yml文件
server:
port: 8001
spring:
application:
name: springcloud-provider-dept
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: 数据库用户名
password: 数据库密码
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml #mapper文件路径
type-aliases-package: cn.alan.springcloud.POJO #实体类别名(使得mapper文件中不用写全限定名)
二.创建服务消费者Consumer
基于Feign
1.导入依赖
<!--实体类所在模块-->
<dependency>
<groupId>org.example</groupId>
<artifactId>SpringCloud-API</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.6.7</version>
</dependency>
<!--feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.2</version>
</dependency>
2.编写主启动类
注:记得添加@EnableFeignClients注解用于开启Feign
@SpringBootApplication
@EnableFeignClients//开启Feign
public class DpetConsumer_80_Feign {
public static void main(String[] args) {
SpringApplication.run(DpetConsumer_80_Feign.class);
}
}
3.编写FeignClient
注:记得添加@Component注解(将FeignDeptClient类交给Spring管理)与@FeignClient注解
注:若使用了eureka注册中心,则name属性填写服务名,url无需填写
@Component
@FeignClient(name = "FeignWithoutEureka",url = "http://localhost:8001/Dept/")
public interface FeignDeptClient {
@GetMapping("/{deptno}")
Dept queryByDeptNo(@PathVariable("deptno") Long deptno);
@GetMapping
List<Dept> queryAll();
@PostMapping
boolean addDept(Dept dept);
@PutMapping
boolean updateDept(Dept dept);
@DeleteMapping("/{deptno}")
boolean deleteDept(@PathVariable("deptno") Long deptno);
}
4.编写Controller层
@RestController
@RequestMapping("/Consumer")
public class DeptConsumerController {
@Autowired//自动写入FeignClient(FeignDeptClient类)
FeignDeptClient feignDeptClient;
@GetMapping("/{deptno}")
Dept queryByDeptNo(@PathVariable("deptno") Long deptno) {
return feignDeptClient.queryByDeptNo(deptno);
}
@GetMapping
List<Dept> queryAll(){
return feignDeptClient.queryAll();
}
@PostMapping()
public boolean addDept(Dept dept) {
return feignDeptClient.addDept(dept);
}
@PutMapping
public boolean update(Dept dept){
return feignDeptClient.updateDept(dept);
}
@DeleteMapping("/{deptno}")
public boolean deleteDept(@PathVariable("deptno") Long deptno){
return feignDeptClient.deleteDept(deptno);
}
}
5.配置yml文件
server:
port: 80
基于RestTemplate
1.添加依赖
<!--实体类所在模块-->
<dependency>
<groupId>org.example</groupId>
<artifactId>SpringCloud-API</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>
<!--热部署依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.6.7</version>
</dependency>
2.编写主启动类
注:记得添加@SpringBootApplication注解
@SpringBootApplication
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}
3.编写RestTemplate配置类
注:记得在类上方添加@Configuration注解,方法上方添加@Bean注解
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.编写Controller层
@RestController//Controller和ResponseBody融合注解 向spring标注当前类为controller
@RequestMapping("/Consumer")
public class DeptConsumerController {
@Autowired
RestTemplate restTemplate;//基于http通信 通过RestTemplate调用provider接口
//不使用eureka时 使用服务端口进行调用
private static final String REST_URL_PREFIX = "http://localhost:8001/Dept/";
@GetMapping("/{deptno}")
public Dept queryByDeptNo(@PathVariable("deptno") Long deptno) {
//参数:url 返回值类型
return restTemplate.getForObject(REST_URL_PREFIX + deptno, Dept.class);
}
@GetMapping
public List<Dept> queryAll() {
return restTemplate.getForObject(REST_URL_PREFIX, List.class);//注意此处类型为List 区别于mapper.xml中填写List的泛型的类型
}
@PostMapping
public boolean addDept(Dept dept) {
//参数:url 传递的参数 返回值类型
return restTemplate.postForObject(REST_URL_PREFIX, dept, Boolean.class);
}
5.配置yml文件
server:
port: 80