- 建module改pom写yml主启动写业务类
2.搭建父工程 1.新建空项目 2.在空项目中建父项目前后端分离,后端传json字符串给前端,前端不需要了解后端的具体业务,前端按照约定和规范判断里面的编码是不是成功,成功的话就去完成逻辑的展现
3.配置JDK版本 4.在父工程中导入相关依赖删除src无关文件
注意:
父工程dependencyManagement中管理的依赖在你们仓库中可能没有,所以要注释掉dependencyManagement先下载对应版本的依赖dependencyManagement只是声明依赖,并不实现引入,因此子项目需要显示声明需要用的依赖子模块继承之后,提供作用:锁定版本并且子modlue不用写groupId和version如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并没有指定具体版本,才会从父项目中继承该项依赖,并且version和scope都取自父pom如果子项目中指定了版本号,则使用子项目指定的jar版
5.创建数据库UTF-8 1.8 1.8 4.12 1.2.17 1.16.18 8.0.27 1.2.6 1.3.0 org.springframework.boot spring-boot-dependencies2.2.2.RELEASE pom import org.springframework.cloud spring-cloud-dependenciesHoxton.SR1 pom import com.alibaba.cloud spring-cloud-alibaba-dependencies2.2.0.RELEASE pom import mysql mysql-connector-java${mysql.version} com.alibaba druid-spring-boot-starter${druid.verison} org.mybatis.spring.boot mybatis-spring-boot-starter${mybatis.spring.boot.verison} org.projectlombok lombok${lombok.version} junit junit${junit.version} log4j log4j${log4j.version} org.springframework.boot spring-boot-maven-plugintrue true
CREATE DATAbase `cloud` ; USE `cloud`; DROp TABLE IF EXISTS `payment`; CREATE TABLE `payment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `serial` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; insert into `payment`(`id`,`serial`) values (1,'尚硅谷'),(2,'alibaba'),(3,'京东'),(4,'头条');3.搭建cloud-provider-payment8001子工程 1.在父工程下创建cloud-provider-payment8001子工程 2.在子工程中导入相关依赖
3.在子工程中新建application.yml文件org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-actuatororg.mybatis.spring.boot mybatis-spring-boot-startercom.alibaba druid-spring-boot-startermysql mysql-connector-javaorg.springframework.boot spring-boot-starter-jdbcorg.springframework.boot spring-boot-devtoolsruntime true org.projectlombok lomboktrue org.springframework.boot spring-boot-starter-test
注意:
MySQL5用的驱动url是com.mysql.jdbc.DriverMySQL6以后用的是com.mysql.cj.jdbc.Driver
server: port: 8001 #服务端口 spring: application: #设置当前应用的名称,将来会在eureka中显示。将来需要该名称来获取路径 name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource #当前数据源 *** 作类型 driver-class-name: com.mysql.cj.jdbc.Driver #数据库驱动包 #characterEncoding=UTF-8 指定所处理字符的解码和编码的格式 #useSSL=false MySQL在高版本需要指明是否进行SSL连接 1.true 需要连接 2.false 不需要连接 #serverTimezone 配置连接数据库驱动的时区参数 #TC代表的是全球标准时间,是以原子时计时,更加精准,适应现代社会的精确计时。 #GMT格林威治标准时间,是指位于伦敦郊区的皇家格林尼治天文台的标准时间。 #但是我们使用的时间是北京时区也就是东八区,领先UTC和GMT八个小时。 #一般视为无差别,即:北京时间=UTC+8=GMT+8。 #rewriteBatchedStatements 这个参数允许JDBC连接能够一次执行多条增删改查,假如没配这个参数的话,所有批量 *** 作都会报错。 #MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。 #MySQL JDBC驱动在默认情况下会无视executeBatch()语句, #把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库, #批量插入实际上是单条插入,直接造成较低的性能。 #只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL #另外这个选项对INSERT/UPDATE/DELETE都有效 url: jdbc:mysql://localhost:3306/cloud?characterEncoding=UTF-8&&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true username: root password: 123456 devtools: restart: enabled: true mybatis: #如果mapper类和mapper.xml不在同一个路径下的时候,可以指定mapper.xml的路径 #1.classpath:只会到你的classes路径中查找找文件。 #2.classpath*:不仅会到classes路径,还包括jar文件中(classes路径)进行查找。 mapper-locations: classpath*:mapper //@Data:生成@Setter、@Getter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode @Data //@AllArgsConstructor:生产全参构造器 @AllArgsConstructor //@NoArgsConstructor:生产无参构造器 @NoArgsConstructor public class Payment implements Serializable { BigInteger id; String serial; }
Json封装体CommonResult
package com.asule.entities; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor //泛型,不管传过来什么类型都可以接受并且发送给前端 public class CommonResult5.创建dao层{ //报错信息:404 not_found private Integer code; private String message; private T data; //当data为空的时候需要这个构造方法 public CommonResult(Integer code,String message){ this(code,message,null); } }
新建PaymentDao接口
package com.asule.dao; import com.asule.entities.Payment; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @Mapper public interface PaymentDao { int create(Payment payment); Payment getPaymentById(@Param("id")Long id); }
在resources下创建mapper文件夹,并在文件夹下创建PaymentMapper.xml文件
insert into payment(serial) values(#{serial})
创建PaymentService接口
package com.asule.service; import com.asule.entities.Payment; import org.apache.ibatis.annotations.Param; public interface PaymentService { int create(Payment payment); Payment getPaymentById(Long id); }
创建PaymentServiceImpl实现类实现PaymentService接口
package com.asule.service.impl; import com.asule.dao.PaymentDao; import com.asule.entities.Payment; import com.asule.service.PaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class PaymentServiceImpl implements PaymentService { @Autowired private PaymentDao paymentDao; @Override public int create(Payment payment) { return paymentDao.create(payment); } @Override public Payment getPaymentById(Long id) { return paymentDao.getPaymentById(id); } }
@RestController、@Controller、@ResponseBody注解的区别
后续自己写一个自己的理解
package com.asule.controller; import com.asule.entities.CommonResult; import com.asule.entities.Payment; import com.asule.service.PaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController //用于做日志输出 @Slf4j @RequestMapping("/payment") public class PaymentController { @Autowired private PaymentService paymentService; @PostMapping("/create") public CommonResult create(@RequestBody Payment payment){ int result = paymentService.create(payment); log.info("插入数据的ID:t" + payment.getId()); log.info("插入数据的结果:" + result); if (result > 0){ return new CommonResult(200,"插入数据成功",result); }else { return new CommonResult(444,"插入数据失败",null); } } @GetMapping("/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ Payment payment = paymentService.getPaymentById(id); int age = 10/2; System.out.println(age); log.info("***查询结果:" + payment); if(payment != null){ return new CommonResult(200,"查询数据成功",payment); }else { return new CommonResult(444,"没有对应记录",null); } } }8.使用Postman测试
- post测试
get测试
3.在子工程中新建application.yml文件org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-actuatororg.springframework.boot spring-boot-devtoolsruntime true org.projectlombok lomboktrue org.springframework.boot spring-boot-starter-test
server: port: 80 #设置当前应用的名称,将来会在eureka中显示。将来需要该名称来获取路径 spring: application: name: cloud-consumer-order804.启动类(此后启动类代码无特殊情况不再赘述)
package com.asule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Order80Application { public static void main(String[] args) { SpringApplication.run(Order80Application.class,args); } }5.实体类与payment8001工程中相同
直接拷贝payment8001工程中的entities文件
6.使用RestTemplate完成远程调用RestTemplate是一种简单便捷的访问restful服务的模板类,用于在Java代码里访问restful服务。
package com.asule.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class Config { @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }7.创建控制层
package com.asule.controller; import com.asule.entities.CommonResult; import com.asule.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; @RestController @Slf4j @RequestMapping("/consumer") public class OrderController { private final static String PAYMENT_URL = "http://localhost:8001"; @Autowired private RestTemplate restTemplate; @PostMapping ("/payment/create") public CommonResult5.工程重构create(Payment payment){ return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class); } @GetMapping("/payment/get/{id}") public CommonResult getPaymentById(@PathVariable("id") Long id){ return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class); } }
观察到的问题:系统中有重复的部分,所以要重构
建立cloud-api-commons模块
导入相关依赖
org.projectlombok lomboktrue org.springframework.boot spring-boot-devtoolsruntime true cn.hutool hutool-all5.1.0
将消费者和服务者中重复的部分(即entities)拷贝到新模块当中,删除消费者和服务中的重复的那部分
clean
install
将项目本身编译并打包到本地仓库,这样其他项目引用本项目的jar包时不用去私服上下载jar包,直接从本地就可以拿到刚刚编译打包好的项目的jar包
- 在consumer和provider中引入自己所定义的包
com.asule cloud-api-commons1.0-SNAPSHOT
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)