Day182
</plugins>
</build>
</project>
上面配置的解释:
首先要加 <packaging> pom </packaging>
这个。
聚合版本依赖,dependencyManagement
只声明依赖,并不实现引入
,所以子项目还需要写要引入的依赖。
==> dependencyManagement
和 dependency
的对比
前者的优点:
①子类如果不写版本,则引用他规定的父类版本;写了版本就用子类的(类似重写)
②需要升 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 级或降级项目时,只需要改这里就好,不用每一个都要更改,便于整个工程的管理
他不会真正的引入依赖,而只是声明
后者:
会真正的引入依赖
==> 如何跳过 maven 的test
环节
通过这个闪电的标志跳过 maven 的test
环节
父工程创建完成通过 mvn:install
将父工程发布到仓库方便子工程继承
[](()Rest 微服务工程构建
最开始的订单模块
步骤:
建 module
改 pom
写 yml
主启动
业务类
测试
[](()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
评论