1公共底层封装 · SpringCloud微服务实战 · 看云
导航
本章笔者所演示的分布式事务用的场景都是一样的,因此所用的表也是一样的,因此对此做了一个功能的抽象,本次抽象仅适用于MybatisPlus 环境。
1. 新建公共底层模块
新建模块 fw-cloud-transaction-base-dao,用于对外提供数据库操作的功能
2. maven 配置
引入数据库操作需要的基本包,其中fw-cloud-common是一些功能方法的包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- common -->
<dependency>
<groupId>com.yisu.cloud</groupId>
<artifactId>fw-cloud-common</artifactId>
<version>${version}</version>
</dependency>
</dependencies>
3. 新建实体
这个实体实际上就是电商系统中订单的记录表(此处简要设置,实际不止这些)
@Data
@TableName("fw_trade_log")
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
public class FwTradeLog extends Model<FwTradeLog> {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Date createTime;
private Integer status;
private String statusDsc;
private Long userId;
private Long productId;
private String productName;
private Long orderId;
private BigDecimal orderAmount;
public FwTradeLog(StatusEnum status) {
this.createTime = DateUtil.date();
this.status = status.getValue();
this.statusDsc=status.getDesc();
this.orderAmount=new BigDecimal("100.00");
this.userId=RandomUtil.randomLong(1000000);
this.orderId= RandomUtil.randomLong(1000000);
}
}
这个对象实际是用于RocketMQ 中对事物的记录,方便回滚操作
@Data
@TableName("fw_transaction_log")
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
public class FwTransactionLog extends Model<FwTransactionLog> {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Date createTime;
private String transactionId;
private String remark;
}
4. 新建Mapper
因为我们使用了MybatisPlus,单表的增删改查已经可以直接使用了,因此只需要继承BaseMapper即可。
public interface FwTradeLogMapper extends BaseMapper<FwTradeLog> {
}
事务日志表和订单记录表类似
public interface FwTransactionLogMapper extends BaseMapper<FwTransactionLog> {
}
5. 新建service 及实现
同样,因为使用了MybatisPlus,因此service层也只需要继承IService、ServiceImpl即可,这样单标的基本操作都有了。
public interface FwTradeLogService extends IService<FwTradeLog> {
}
@Service
public class FwTradeLogServiceImpl extends ServiceImpl<FwTradeLogMapper, FwTradeLog> implements FwTradeLogService {
}
事务日志表的service 的操作和订单记录表类似
public interface FwTransactionLogService extends IService<FwTransactionLog> {
}
@Service
public class FwTransactionLogServiceImpl extends ServiceImpl<FwTransactionLogMapper, FwTransactionLog> implements FwTransactionLogService {
}
6. 订单枚举
供后面演示demo 使用
public enum StatusEnum{
ONE(1, "待支付"),
TWO(2, "待发货"),
THREE(3, "待收货"),
FOUR(4, "订单完成"),
FIVE(5, "订单关闭");
private Integer value;
private String desc;
StatusEnum(int value, String desc) {
this.value=value;
this.desc=desc;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
7. MybatisPlus 配置
这里我们需要配置mapper的包位置,并且配置的分页插件,注意mapper包的位置不要配置错,否则后面应用在依赖的时候回启动不了。
@Configuration
@MapperScan(value = "com.yisu.transacation.base.dao.mapper")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
好了,简单的抽象已经结束,后面演示的demo应用可以直接依赖,均不需再写entity、mapper、service、enum等应抽象的内容,这里笔者并没有依赖连接池的包,因为不想限制死,后面根据需要可以自行引用。