基于mybatisPlus+Easycode+mapstruct实现的代码生成器

本文介绍了一个基于MyBatis Plus、EasyCode及MapStruct的代码生成器解决方案,旨在提高开发效率,减少重复工作。该方案利用这些工具自动化生成CRUD操作的基础代码。

基于mybatisPlus+Easycode+mapstruct实现的代码生成器

需求出发点

1.使用mybatis plus的原生代码生成器,很不方便,需要引入模板引擎,还有生成器依赖,而且生成的代码,会有些你不想要的东西,再去处理也很麻烦。

2.对PO,VO,DTO的相互转换我们一般使用的是BeanUtils,在接触过mapstruct后,决定使用mapstruct来替换BeanUtils的相互拷贝。

基本概念

1.Mybatis 和 Mybatis Plus 的区别

MyBatis:
  • 所有SQL语句全部自己写
  • 手动解析实体关系映射转换为MyBatis内部对象注入容器
  • 不支持Lambda形式调用
Mybatis Plus:
  • 强大的条件构造器,满足各类使用需求
  • 内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作
  • 支持Lambda形式调用
  • 提供了基本的CRUD功能,连SQL语句都不需要编写
  • 自动解析实体关系映射转换为MyBatis内部对象注入容器

2.EasyCode是什么?

EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则支持自定义设置.

3.PO、DTO和VO

PO:persistent object 持久对象,对应数据库中的一条记录。

VO:view object 表现层对象,最终返回给前端的对象。

DTO:data transfer object数据传输对象,如dubbo服务之间传输的对象。

4.mapstruct的优点

与手工编写映射代码相比:
  • MapStruct通过生成冗长且容易出错的代码来节省时间。
与动态映射框架相比:
  • 效率更高:使用简单的Java方法调用代替反射;
  • 编译时类型安全:只能映射相同名称或带映射标记的属性;
  • 编译时产生错误报告:如果映射不完整(存在未被映射的目标属性)或映射不正确(找不到合适的映射方法或类型转换)则会在编译时抛出异常。

mapstruct 对于实体转换的一些操作

package com.alan.springmapstruct.mapstructdemo.mapper;

import com.alan.springmapstruct.mapstructdemo.bean.constants.StatusEnum;
import com.alan.springmapstruct.mapstructdemo.bean.dto.OrderDto;
import com.alan.springmapstruct.mapstructdemo.bean.po.OrderPo;
import com.alan.springmapstruct.mapstructdemo.bean.vo.OrderVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * @author alan
 */
@Mapper(imports={StatusEnum.class})
public interface OrderMapper {

    OrderMapper INSTANCE = Mappers.getMapper(OrderMapper.class);
    @Mappings({
            //对时间类型不同进行处理
            @Mapping(source = "created", target = "createdTime", dateFormat = "yyyy-MM-dd HH:mm:ss"),
            //对枚举进行key-value转换(使用自定义方法对属性进行自定义处理)
            @Mapping(target = "status", expression = "java(StatusEnum.getDesc(orderPo.getStatus()))"),
            //自定义字段转换(添加或者字节处理)
            @Mapping(target = "orderId", expression = "java(OrderMapper.handlerOrderId(orderPo.getOrderId()))")
    })
    OrderDto po2Dto(OrderPo orderPo);

    OrderPo dto2Po(OrderDto orderDto);

    OrderVo dto2Vo(OrderDto orderDto);

    OrderDto vo2Dto(OrderVo orderVo);

    /**
     * 对实体对象集合进行转换
     * @param orderPoList
     * @return
     */
    List<OrderDto> orderPOs2OrderDTOs(List<OrderPo> orderPoList);

    static String handlerOrderId(String orderId){
        return "OID_"+orderId;
    }

    /**
     * 对转换进行自定义处理,
     * 切忌:如果该mapper内有collection相关的转换,必须保证只有一个对象<->对象转换的方法
     */
    /*default OrderDto orderPO2OrderDTO(OrderPo orderPo) {
        if (orderPo == null) {
            return null;
        }
        OrderDto orderDto = new OrderDto();
        orderDto.setBuyerId(orderPo.getBuyerId());
        orderDto.setStatus(StatusEnum.getDesc(orderPo.getStatus()));
        return orderDto;
    }*/
}

代码生成后的预览

在这里插入图片描述

快速开始

这次我们的脚手架使用了MybatisPlus,EasyCode,mapstruct,swagger2来生成CRUD的标准代码。

1.在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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.alan.springmapstruct</groupId>
    <artifactId>mapstructdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mapstructdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <org.mapstruct.version>1.4.1.Final</org.mapstruct.version>
        <org.projectlombok.version>1.18.12</org.projectlombok.version>
        <mysql-connector-java.version>8.0.20</mysql-connector-java.version>
        <druid.version>1.1.16</druid.version>
        <mybatis-plus.version>3.3.0</mybatis-plus.version>
        <knife4j-spring-boot-starter.version>2.0.2</knife4j-spring-boot-starter.version>
    </properties>

    <dependencies>
        <!-- SpringBoot与web相关 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值