manven工程要发布一些包给别的工程共用时,可以先clean,后install发布到仓库
注意Maven中dependencyManagement和dependencies的区别:dependencyManagement并没有引入jar
支付模块
订单模块调用支付模块(微服务提供者)
记住:约定 》 配置 》 编码
改POM和写Yml一般都不自己写,
但是application.yml中建议有微服务端口号和服务名称
建表
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
lombok使用
引入包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>x.x.x</version>
<scope>provided</scope>
</dependency>
安装lombok插件
开启注解支持
Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。
常用注解:
@Setter :注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter :使用方法同上,区别在于生成的是getter方法。
@ToString :注解在类,添加toString方法。
@EqualsAndHashCode: 注解在类,生成hashCode和equals方法。
@NoArgsConstructor: 注解在类,生成无参的构造方法。
@RequiredArgsConstructor: 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor: 注解在类,生成包含类中所有字段的构造方法。
@Data: 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Slf4j: 注解在类,生成log变量,严格意义来说是常量。
IDEA打开文件显示多行
启动微服务,查询时报错
Invalid bound statement (not found): com.atguigu.springcloud.dao.PaymentDao.getPaymentById
是dao映射出现问题,修改yml
完整yml
server:
port: 8001
#凡是微服务,建议一定要有端口号和微服务名称
spring:
application:
name:cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/db2020?useUnicode=true&characterEncoding=utf-8&useSSL=false # mysql5.7后进行了安全加固
username: root
password: root
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包
插入报错
但是我明明是post请求,
这是因为浏览器大多对post请求支持度不好,
1、对于插入数据库的操作,一般用postman模拟
2、既然是要把数据传给前端妹子,那么你自己要先测试通过
总结一下:
微服务cloud父工程注意:提前把字符编码改好
pom文件依赖导入
接着是子模块:
1、建module
2、改pom,导入需要的依赖
3、写yml,注意最好把端口,服务名都写好,
4、主启动类
5、业务类:业务类从建表开始,创建实体可以使用lombok减少重复代码,还要有一个json封装体,用于给前端妹子传json串
/**
* Json封装体,方便前后端分离,不跟前端讲业务逻辑,只传给他CommonResult
* 按照约定去判断编码是否成功,成功则进行后续显示。
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
private Integer code; //消息的数字编码,类似404
private String message; //给前端的消息,成功或者失败
private T data; //使用泛型,保证类的通用性,任何消息都可以发送
public CommonResult(Integer code, String message){
this(code, message, null);
}
}
dao层,接口注解使用@Mapper,因为用的是mybatis,所以尽量用这个mapper注解,使用Repository可能插入数据有问题
映射文件注意事项
<?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.atguigu.springcloud.dao.PaymentDao">
<!--mybatis数据插入成功,必然会返回来一个数字,如果大于0则插入成功,所以新增方法我们都会返回int,使用useGeneratedKeys="true"返回这个key,
keyProperty="id"表示返回实体类中的id属性-->
<insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
insert into payment(serial) values(#{serial});
</insert>
<resultMap id="BaseResultMap" type="com.atguigu.springcloud.entities.Payment">
<!--jdbcType="BIGINT"指定数据表中类型-->
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="serial" property="serial" jdbcType="VARCHAR"/>
</resultMap>
<!--返回类型最好用resultMap,避免其他人编写不规范而导致映射的麻烦-->
<select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
select * from payment where id=#{id};
</select>
</mapper>
控制层注意事项:
@RestController
@Slf4j //打印日志信息
public class PaymentController {
@Resource
private PaymentService paymentService;
//因为要做前后端分离,所以我们给前端传的是json串,所以返回CommonResult对象
//使用restFul风格,写操作用post
// 现在做的是微服务的提供者,真正操作数据库的,所以写明确,做到望文生义,
//实体payment,操作create
@PostMapping(value = "/payment/create")
public CommonResult create(Payment payment) {
//返回的result大于0表示插入成功
int result = paymentService.create(payment);
//在企业里,使用日志来打印信息
log.info("*****插入结果:" + result);
if (result > 0) {
//插入成功给前端妹子发信息
return new CommonResult(200, "插入数据库成功", result);
} else {
return new CommonResult(444, "插入数据库失败", null);
}
}
//读操作,使用getMapping
@GetMapping(value = "/payment/get/{id}")
public CommonResult create(@PathVariable("id") Long id) {
//返回的result大于0表示插入成功
Payment payment = paymentService.getPaymentById(id);
//在企业里,使用日志来打印信息
log.info("*****查询结果:" + payment);
if (payment != null) {
//插入成功给前端妹子发信息
return new CommonResult(200, "查询成功", payment);
} else {
return new CommonResult(444, "没有对应记录,查询ID:"+id, null);
}
}
}