Java初始化代码

初始化数据库实体

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;

/**
 * @author yangliwei
 */
@Getter
@Setter
@Table(name = "init_data_record")
@Entity
@ToString
public class InitDataRecord {
    /**
     * 主键ID
     */
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 业务唯一键
     */
    private String businessKey;

    /**
     * 初始化数据唯一Key,系统启动升级一次,第二次将不再升级
     */
    private String initDataKey;


    /**
     * 初始化数据时间
     */
    private LocalDateTime initDataTime;

}

初始化接口

public interface Initializer {

    /**
     * 初始化
     *
     * @param
     * @return void
     * @throws Exception
     */
    void init() throws Exception;

    /**
     * 执行顺序
     *
     * @return
     */
    default int getOrder() {
        return 0;
    }
}

初始化抽象类

@Slf4j
public abstract class AbstractDataUpgradeInitializer implements Initializer {

    private final InitDataRecordMapper initDataRecordMapper;

    protected AbstractDataUpgradeInitializer(InitDataRecordMapper initDataRecordMapper) {
        this.initDataRecordMapper = initDataRecordMapper;
    }


    /**
     * 初始化数据业务唯一标识
     *
     * @return 业务唯一标识
     */
    protected abstract String getBusinessKey();

    /**
     * 初始化数据唯一key
     *
     * @return 唯一key
     */
    protected abstract String getInitDataKey();

    /**
     * 业务处理
     */
    protected abstract void process();

    @Override
    public void init() {
        try {
            initDataUpdate();
        } catch (Exception e) {
            log.error("数据初始化异常", e);
        }
    }

    /**
     * 初始化数据升级
     */
    private void initDataUpdate() {

        InitDataRecord initDataRecord = new InitDataRecord();
        initDataRecord.setBusinessKey(getBusinessKey());
        initDataRecord.setInitDataKey(getInitDataKey());
        // 查询数据初始化记录
        InitDataRecord byBusinessKeyAndInitDataKey = initDataRecordMapper.queryInitDataRecord(initDataRecord);
        if (Objects.nonNull(byBusinessKeyAndInitDataKey)) {
            // 如有记录说明已经做过数据初始化
            return;
        }
        // 业务处理
        process();

        // 本次启动已升级,保存升级记录,下次服务启动将不再升级
        saveInitDataRecord();
    }

    /**
     * 保存数据升级记录
     */
    private void saveInitDataRecord() {
        InitDataRecord initDataRecord = new InitDataRecord();
        initDataRecord.setBusinessKey(getBusinessKey());
        initDataRecord.setInitDataKey(getInitDataKey());
        initDataRecordMapper.insertInitDataRecord(initDataRecord);
    }
}

初始化业务主体实现类

@Slf4j
@Component
public class UpgradeProject extends AbstractDataUpgradeInitializer {

    private PpmProjectMapper ppmProjectMapper;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public UpgradeProject(InitDataRecordMapper initDataRecordMappe,
                          PpmProjectMapper ppmProjectMapper) {
        super(initDataRecordMappe);
        this.ppmProjectMapper = ppmProjectMapper;
    }

    @Override
    protected String getBusinessKey() {
        return "UPGRADE_PROJECT";
    }

    @Override
    protected String getInitDataKey() {
        return Calendar.getInstance().getTimeInMillis()+"";
    }

    @Override
    protected void process() {
        //数据升级
        Long id = ppmProjectMapper.findIdByParentId(-1L);
        ppmProjectMapper.updatePpmProjectParentId(id);
        ppmProjectMapper.updatePpmProjectNodeType();
    }
}

初始化器的容器

@Component
@Slf4j
public class SystemInitialization implements ApplicationRunner {

    /**
     * 初始化器的容器
     */
    @Autowired
    Map<String, Initializer> initializerMap;


    @Override
    public void run(ApplicationArguments args) throws Exception {
        List<Map.Entry<String, Initializer>> list = new ArrayList<Map.Entry<String, Initializer>>(initializerMap.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Initializer>>() {
            @Override
            public int compare(Map.Entry<String, Initializer> o1, Map.Entry<String, Initializer> o2) {
                return o1.getValue().getOrder() - o2.getValue().getOrder();
            }
        });
        log.info("系统启动开始初始化!,共{}条", initializerMap.size());
        int num = 0;
        // 遍历各初始化器进行初始化
        for (Map.Entry<String, Initializer> entry : list) {
            log.info("系统启动项:{},开始初始化", entry.getValue().getClass());
            num++;
            log.info("当前执行的第{}条", num);
            entry.getValue().init();
            log.info("系统启动项:{},初始化结束", entry.getValue().getClass());
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevanLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值