2、Pay支付模块构建(服务提供者)

1、创建Module

在父工程下创建Module(cloud-provider-payment8001) 作为服务提供者。
在cloud-provider-payment8001的pom.xml中配置所需依赖

 
        
        
            org.springframework.cloud
            spring-cloud-starter-zipkin
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.16
            
        
        
        
            mysql
            mysql-connector-java
        
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

看见添加的依赖中没有指定版本,原因在上一节提过,在父工程做了统一jar包管理

2、创建数据库

创建数据库db2020
建表语句如下

DROP TABLE IF EXISTS `payment`;
CREATE TABLE `payment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `payment` VALUES (1,'哈哈哈哈'),(2,'真的帅');
image.png

3、编写Module配置文件

server:
  port: 8001
spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql驱动类
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root


mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.kari.springcloud.entities
   # 它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔(value的值一定要是包的全)
  • 端口号:8001
  • 服务名:cloud-payment-service
  • 数据源使用Druid

4、编写entity实体类

创建entities放实体类

image.png

首先创建对应数据表的Payment类

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
    Long id;
    String serial;
}

@Data @AllArgsConstructor @NoArgsConstructorlombok的三个注解省去生成结构体和getset的步骤
@Component注解注入spring

注意这里implements Serializable 序列化是为了方便后面分布式调用
然后创建返回类CommonResult,在前后端分离的当下,我们应该统一返回信息

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
    private Integer code;
    private String message;
    private T data;

    public CommonResult(Integer code,String message){
         this(code,message,null);
    }
}

那这里为什么使用了Lombok的三个注解之后还有创建结构体?因为当错误或者异常情况不返回data

5、编写dao层

image.png

持久层的编写
首先创建dao包存放类
创建抽象类接口PaymentDao.java

@Mapper
public interface PaymentDao {
    public int create(Payment payment);

    public Payment getPaymentById(@Param("id")Long id);
}

@Mapper注解作为持久层注入spring

编写mapper文件

image.png

对应application.yml中配置的路径对应建文件
image.png

创建mapper包以及PaymentMapper.xml文件







   insert into payment (serial) values (#{serial});

    
    


实现PaymentDao接口的数据库sql语句

6、编写service层

image.png

创建service包存放service类
创建抽象类接口PaymentService

@Service
public interface PaymentService {
    public int create(Payment payment);

    public Payment getPaymentById(@Param("id")Long id);
}

@Service作为业务层注入spring

创建实现类PaymentServiceImpl

@Service
public class PaymentServiceImpl implements PaymentService{

    @Autowired
    PaymentDao paymentDao;

    @Override
    public int create(Payment payment) {
        return paymentDao.create(payment);
    }

    @Override
    public Payment getPaymentById(Long id) {
        return  paymentDao.getPaymentById(id);
    }
}

@Service作为业务层注入spring
@Autowired PaymentDao paymentDao;在Service层调用dao层,基操

7、编写Controller层

image.png

创建controller包存放控制器类
创建控制器类PaymentController

@RestController
@Slf4j
public class PaymentController {
    @Autowired
    PaymentService paymentService;

    @Autowired
    Payment payment;

    @PostMapping("/payment/create")
    public CommonResult create(Payment payment){
      int result=paymentService.create(payment);
      log.info("******插入结果"+result);
     if(result>0){
         return  new CommonResult(200,"插入数据库成功",result);
     }else {
         return  new CommonResult(444,"插入数据库失败",null);
     }
    }

    @GetMapping("/payment/get/{id}")
    public  CommonResult getPaymentById(@PathVariable("id")Long id){
        payment=paymentService.getPaymentById(id);
        log.info("******查询到的"+payment);
        if(payment!=null){
            return  new CommonResult(200,"查询成功",payment);
        }else {
            return  new CommonResult(444,"没有对应记录,查询ID"+id,null);
        }
    }

}

注意尽量使用restful风格
并且返回类统一使用 CommonResult

8、启动运行测试

访问控制器下方法getPaymentById,通过浏览器访问接口
访问http://localhost:8001/payment/get/1

image.png

有restful风格的api那味了

使用postman访问post请求的create方法

image.png

测试完毕

服务提供者模块构建完毕

你可能感兴趣的:(2、Pay支付模块构建(服务提供者))