写点什么

Day182

  • 2022 年 5 月 04 日
  • 本文字数:4779 字

    阅读完需:约 16 分钟

</plugins>


</build>


</project>


上面配置的解释:


首先要加 <packaging> pom </packaging> 这个。


聚合版本依赖,dependencyManagement 只声明依赖,并不实现引入,所以子项目还需要写要引入的依赖。







==> dependencyManagementdependency的对比


前者的优点:


①子类如果不写版本,则引用他规定的父类版本;写了版本就用子类的(类似重写)


②需要升 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 级或降级项目时,只需要改这里就好,不用每一个都要更改,便于整个工程的管理


他不会真正的引入依赖,而只是声明


后者:


会真正的引入依赖




==> 如何跳过 maven 的test环节


通过这个闪电的标志跳过 maven 的test环节





父工程创建完成通过 mvn:install 将父工程发布到仓库方便子工程继承



[](()Rest 微服务工程构建




最开始的订单模块



步骤:


  1. 建 module

  2. 改 pom

  3. 写 yml

  4. 主启动

  5. 业务类

  6. 测试



[](()1. 微服务提供者支付 module 模块 cloud-provider-payment8001

[](()1. 新建模块



子项目名:cloud-provider-payment8001



调整一下父项目 pom 文件




[](()2. 在 pom 添加依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">


<parent>


<artifactId>cloud2021</artifactId>


<groupId>com.achang.springcloud</groupId>


<version>1.0-SNAPSHOT</version>


</parent>


<modelVersion>4.0.0</modelVersion>


<artifactId>cloud-provider-payment8001</artifactId>


<dependencies>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-web</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-actuator</artifactId>


</dependency>


<dependency>


<groupId>org.mybatis.spring.boot</groupId>


<artifactId>mybatis-spring-boot-starter</artifactId>


</dependency>


<dependency>


<groupId>com.alibaba</groupId>


<artifactId>druid-spring-boot-starter</artifactId>


<version>1.1.10</version>


</dependency>


<dependency>


<groupId>mysql</groupId>


<artifactId>mysql-connector-java</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-jdbc</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-devtools</artifactId>


<scope>runtime</scope>


<optional>true</optional>


</dependency>


<dependency>


<groupId>org.projectlombok</groupId>


<artifactId>lombok</artifactId>


<optional>true</optional>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-test</artifactId>


<scope>test</scope>


</dependency>


</dependencies>


</project>



[](()3. 写 yml

在 resources 目录下新建 application.yml 配置文件



#微服务建议一定要写服务端口号和微服务名称


server:


#端口号


port: 8001


spring:


application:


#微服务名称


name: cloud-provider-payment8001


#数据库配置


datasource:


type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型


driver-class-name: com.mysql.jdbc.Driver # mysql 驱动包


url: jdbc:mysql://localhost:3306/cloud2021?useUnicode=true&characterEncoding=UTF-8&useSSL=false


username: "root"


password: "00000"


mybatis:


mapper-locations: classpath:mapper/*.xml


type-aliases-package: com.achang.springcloud.bean # 所有 Bean 别名类所在包


阿昌在这里遇到的问题:


①问题:Injection of resource dependencies failed


===> 找了好久 发现 yaml 配置文件下面的type-aliases-package没有引用正确


②问题:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)


===> 一开始判断我密码是否输入正确,判断正确后;


===> 再判断数据库是否有权限


GRANT ALL ON cloud2021.* TO 'root'@'localhost' IDENTIFIED BY '00000';


===>还不行,就给用户名和密码添加"",双引号!!!



[](()4. 主启动

在 java 包下创建主启动类 com.achang.springcloud.PaymentMain8001



@SpringBootApplication


public class PaymentMain8001 {


// 主启动类


public static void main(String[] args) {


SpringApplication.run(PaymentMain8001.class,args);


}


}

[](()5. 业务类

1、建表 SQL


SQL:


CREATE TABLE payment(


id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',


serial VARCHAR(200) DEFAULT '',


PRIMARY KEY (id)


)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8


INSERT INTO payment(serial)VALUES("张三");




2、bean


在 springcloud 包下新建实体类 bean.Payment



//这三个注解是 lombok 的,除了导入依赖,idea 还需要安装插件(具体操作问度娘)


@Data //set/get 方法


@AllArgsConstructor //有参构造器


@NoArgsConstructor //无参构造器


public class Payment implements Serializable {


private Long id;


private String serial;


}




在 bean 包下新建 CommonResult(json 封装体,传给前端的)


//返回给前端的通用 json 数据串


@Data //set/get 方法


@AllArgsConstructor //有参构造器


@NoArgsConstructor //无参构造器


public class CommonResult<T> {


private Integer code;


private String msg;


private T data; //泛型,对应类型的 json 数据


//自定义两个参数的构造方法


public CommonResult(Integer code, String msg) {


this(code,msg,null);


}


}




3、dao


在 springcloud 包下新建 dao.PaymentDao 接口



@Mapper


public interface PaymentDao {


//增


public int add(Payment payment);


//查 加上 @Param 注解,mapper 中就可以采用 #{}的方式把 @Param 注解括号内的参数进行引用


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


//这里用增和改进行演示,有兴趣的可以自己加其他的方法


}




4、mapper


在 resources 目录下新建 mapper 目录,然后新建 PaymentMapper.xml



<?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="com.achang.springcloud.dao.PaymentDao">


<insert id="add" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">


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


</insert>


<resultMap id="BaseResultMap" type="com.achang.springcloud.bean.Payment" >


<id column="id" property="id" jdbcType="BIGINT"/>


<id column="serial" property="serial" jdbcType="VARCHAR"/>


</resultMap>


<select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">


select * from payment where id = #{id}


</select>


</mapper>




5、service



在 springcloud 包下新建 service.PaymentService 接口


public interface PaymentService {


//增


public int add(Payment payment);


//查


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


}


在 service 包下新建 impl.PaymentServiceIpml 实现类


@Service


public class PaymentServiceImpl implements PaymentService {


//@Autowired 也可以


@Resource


private PaymentDao paymentDao;


@Override


public int add(Payment payment) {


return paymentDao.add(payment);


}


@Override


public Payment getPaymentById(Long id) {


return paymentDao.getPaymentById(id);


}


}




6、controller


在 springcloud 包下新建 controller.PaymentController



@Controller


@Slf4j //日志


public class PaymentController {


@Resource


private PaymentService paymentService;


//前后端分离,所以不能直接返回对象,数据要先经过 CommonResult 封装再返回


@PostMapping(value = "/payment/add")


public CommonResult add(Payment payment){


int result = paymentService.add(payment);


log.info("-----插入结果----: "+ result);


if (result > 0){


//插入成功


return new CommonResult(200,"插入数据库成功",result);


}else {


return new CommonResult(444,"插入数据库失败",null);


}


}


@GetMapping(value = "/payment/get/{id}")


public CommonResult getPaymentById(@PathVariable("id")Long id){


Payment result = paymentService.getPaymentById(id);


log.info("-----查询结果----: "+ result);


if (result != null){


//查询成功


return new CommonResult(200,"查询成功",result);


}else {


return new CommonResult(444,"没有对应记录,查询 id: "+id,null);


}


}


}



[](()6. 测试

启动项目



浏览器输入http://localhost:8001/payment/get/1,查询成功。



因为浏览器一般不支持直接发送 post 请求,所以,需要使用工具进行测试。(我这里用的是 Postman)


重新测试查询,没问题。



输入http://localhost:8001/payment/add?serial=achang21发送 post 请求,往数据库中插入一条数据,需要把数据写到 body 中。



阿昌遇到的问题:


Invalid bound statement (not found)


===> 说我的 mapper 文件找不到,我根据网上找了半天,都无效,最后在 PaymentService 上不应该加 @Mapper 注解,所以才出错


===> 也要注意发送的请求不要拉写,写错



[](()2. 热部署 Devtools(只能在开发阶段使用)

1、在 cloud-provider-payment8001 项目中添加热部署依赖(已经在导入了,所以看看就行了,记一下步骤)


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-devtools</artifactId>


<scope>runtime</scope>


<optional>true</optional>


</dependency>


2、添加一个插件到父类总工程的 pom.xml 里(这一步之前也已经做了)


<build>


<plugins>


<plugin>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-maven-plugin</artifactId>


<configuration>


<fork>true</fork>


<addResources>true</addResources>


</configuration>


</plugin>


</plugins>


</build>


3、开启自动编译的选项



4、热注册开启


组合键Shift+Ctrl+Alt+/(Mac 系统的把 Ctrl 换成 command 键),选中 Registry…





5、重启 IDEA


开完之后感觉有点卡,虽然能自动部署,但是代码提示变慢了,等以后换了电脑再玩自动热部署,现在就不开了。


把第四步打上的勾去掉(原本打上的就不用去掉了),然后重启 idea 就可以了。


不使用自动热部署,也可以使用热部署,按这个绿色的锤子,重新启动,只编译改了的文件,所以比重启快一些。




[](()3. 微服务消费者订单 module 模块 cloud-consumer-order80

[](()1. 新建模块


cloud-consumer-order80




[](()2. 改 pom

往 pom 中添加:


<dependencies>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-web</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-actuator</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-devtools</artifactId>


<scope>runtime</scope>


<optional>true</optional>


</dependency>


<dependency>


<groupId>org.projectlombok</groupId>


<artifactId>lombok</artifactId>


<optional>true</optional>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-test</artifactId>


<scope>test</scope>


</dependency>


</dependencies>


</project>

[](()3. 写 yml

在 resources 目录下新建 application.yml 文件



#访问一个网站时,默认是 80 端口,给用户 80 端口,用户就可以不用加端口直接访问页面


server:


port: 80


123

[](()4. 主启动

com.angenin.springcloud.OrderMain80



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Day182_Java_爱好编程进阶_InfoQ写作社区