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等应抽象的内容,这里笔者并没有依赖连接池的包,因为不想限制死,后面根据需要可以自行引用。