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

基于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</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- DB 相关 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- mybatis-plus 相关 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!-- lombok 相关 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- mapstruct 相关 -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <!-- knife4j 相关 -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>${knife4j-spring-boot-starter.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${org.projectlombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.在yml文件中添加链接配置

server:
  port: 9999

#mysql
spring:
  datasource:
    # 数据库配置
    url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxxxx?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
    username: xxxxxx
    password: xxxxxx
    driverClassName: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    # 数据库连接池
    druid:
      #初始化大小,最小,最大
      initialSize: 10
      minIdle: 1
      maxActive: 50
      # 配置获取连接等待超时的时间
      maxWait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      #配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 30000
      validationQuery: select?'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      #打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      #通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

#mybatis-plus
mybatis-plus:
  typeAliasesPackage: com.alan.springmapstruct.mapstructdemo
  mapper-locations: classpath:mappers/*.xml
  global-config:
    #刷新mapper 调试神器
    db-config:
      #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
      id-type: INPUT
      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
      field-strategy: 2
      #驼峰下划线转换
      column-underline: false
      #数据库大写下划线转换
      #capital-mode: true
      #逻辑删除配置
      logic-delete-value: 1
      logic-not-delete-value: 0
    refresh: true
    configuration:
      #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
      map-underscore-to-camel-case: true
      cache-enabled: false
      #配置JdbcTypeForNull, oracle数据库必须配置
      jdbc-type-for-null: 'null'
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      database-id: mysql

3.idea中安装EasyCode插件并录入配置信息

1.在plugin中安装EasyCode插件

2.在Settings找到EasyCode开始配置,第一步先修改作者的信息,并可以导入配置,目前上传的配置只支持保存7天,在上传配置后会返回一个token,输入token即刻全部导入。
在这里插入图片描述
3.根据数据库的表结构完善映射关系
在这里插入图片描述
4.新建一个分组并拷贝模板文件
在这里插入图片描述
下面给出模板文件的详细信息,依次为PO,DTO,VO,modelMapper

PO模板
##引入宏定义
$!init
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/model/po", "Po.java")

##使用宏定义设置包后缀
#setPackageSuffix("model.po")

##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Builder;

##使用宏定义实现类注释信息
#tableComment("实体类")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("$tableInfo.obj.name")
public class $!{tableInfo.name}Po extends Model<$!{tableInfo.name}Po> implements Serializable {
    private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})/**
    * ${column.comment}
    */#end

    #if(${column.comment}=="自增主键")
	@TableId(value="PK_ID")#end
    #if(${column.comment}=="逻辑删除标记(0:正常,1:已删除)")
	@TableLogic(value = "0",delval = "1")#end
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

## 因为使用了lombok,所以去掉get和set方法的生成
#*#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end*#

}
DTO模板
##引入宏定义
$!init
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/model/dto", "Dto.java")

##使用宏定义设置包后缀
#setPackageSuffix("model.dto")

##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Builder;

##使用宏定义实现类注释信息
#tableComment("实体类")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class $!{tableInfo.name}Dto extends Model<$!{tableInfo.name}Dto> implements Serializable {
    private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})/**
    * ${column.comment}
    */#end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

## 因为使用了lombok,所以去掉get和set方法的生成
#*#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end*#

}
VO模板
##引入宏定义
$!init
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/model/vo", "Vo.java")

##使用宏定义设置包后缀
#setPackageSuffix("model.vo")

##使用全局变量实现默认包导入
$!autoImport
import java.io.Serializable;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Builder;

##使用宏定义实现类注释信息
#tableComment("实体类")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "信息类")
public class $!{tableInfo.name}Vo extends Model<$!{tableInfo.name}Vo> implements Serializable {
    private static final long serialVersionUID = $!tool.serial();
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})/**
    * ${column.comment}
    */#end
    
    @ApiModelProperty("$column.comment")
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end

## 因为使用了lombok,所以去掉get和set方法的生成
#*#foreach($column in $tableInfo.fullColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end*#

}
modelMapper模板
##引入宏定义
$!init
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/model/mapper", "ModelMapper.java")

##使用宏定义设置包后缀
#setPackageSuffix("model.mapper")

##使用全局变量实现默认包导入
$!autoImport
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
import $!{tableInfo.savePackageName}.model.po.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.model.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.model.po.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.model.vo.$!{tableInfo.name}Vo;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})实体转换工具类
 *
 * @author $!author
 * @since $!time.currTime()
 */
@Mapper
public interface $!{tableInfo.name}ModelMapper {
    $!{tableInfo.name}ModelMapper INSTANCE = Mappers.getMapper($!{tableInfo.name}ModelMapper.class);
    
    $!{tableInfo.name}Dto changePO2DTO($!{tableInfo.name}Po $!tool.firstLowerCase($!{tableInfo.name})Po);
    $!{tableInfo.name}Po changeDTO2PO($!{tableInfo.name}Dto $!tool.firstLowerCase($!{tableInfo.name})Dto);
    $!{tableInfo.name}Vo changeDTO2VO($!{tableInfo.name}Dto $!tool.firstLowerCase($!{tableInfo.name})Dto);
    $!{tableInfo.name}Dto changeVO2DTO($!{tableInfo.name}Vo $!tool.firstLowerCase($!{tableInfo.name})Vo);

    List<$!{tableInfo.name}Dto> $!{tool.firstLowerCase($!{tableInfo.name})}POs2$!{tableInfo.name}DTOs(List<$!{tableInfo.name}Po> $!{tool.firstLowerCase($!{tableInfo.name})}PoList);
    List<$!{tableInfo.name}Po> $!{tool.firstLowerCase($!{tableInfo.name})}DTOs2$!{tableInfo.name}POs(List<$!{tableInfo.name}Dto> $!{tool.firstLowerCase($!{tableInfo.name})}DtoList);
    List<$!{tableInfo.name}Dto> $!{tool.firstLowerCase($!{tableInfo.name})}VOs2$!{tableInfo.name}DTOs(List<$!{tableInfo.name}Vo> $!{tool.firstLowerCase($!{tableInfo.name})}VoList);
    List<$!{tableInfo.name}Vo> $!{tool.firstLowerCase($!{tableInfo.name})}DTOs2$!{tableInfo.name}VOs(List<$!{tableInfo.name}Dto> $!{tool.firstLowerCase($!{tableInfo.name})}DtoList);
}
mapper/DAO模板
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Mapper"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;

import $!{tableInfo.savePackageName}.model.po.$!{tableInfo.name}Po;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
 *
 * @author $!author
 * @since $!time.currTime()
 */
@Mapper
public interface $!{tableName} extends BaseMapper<$!{tableInfo.name}Po>{
}
service模板
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

import $!{tableInfo.savePackageName}.model.dto.$!{tableInfo.name}Dto;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表服务接口
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{tableName} {

    /**
     * 通过ID查询单条数据
     *
     * @param $!pk.name 主键
     * @return 实例对象
     */
    $!{tableInfo.name}Dto queryById($!pk.shortType $!pk.name);

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    List<$!{tableInfo.name}Dto> queryAllByLimit(int offset, int limit);

    /**
     * 新增数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name})Dto 实例对象
     * @return 实例对象
     */
    $!{tableInfo.name}Dto insert($!{tableInfo.name}Dto $!tool.firstLowerCase($!{tableInfo.name})Dto);

    /**
     * 修改数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name})Dto 实例对象
     * @return 实例对象
     */
    $!{tableInfo.name}Dto update($!{tableInfo.name}Dto $!tool.firstLowerCase($!{tableInfo.name})Dto);

    /**
     * 通过主键删除数据
     *
     * @param $!pk.name 主键
     * @return 是否成功
     */
    boolean deleteById($!pk.shortType $!pk.name);

}
serviceImpl模板
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;

import $!{tableInfo.savePackageName}.model.po.$!{tableInfo.name}Po;
import $!{tableInfo.savePackageName}.model.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.model.mapper.$!{tableInfo.name}ModelMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Mapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
import org.springframework.beans.BeanUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
 *
 * @author $!author
 * @since $!time.currTime()
 */
@Service("$!tool.firstLowerCase($!{tableInfo.name})Service")
public class $!{tableName} implements $!{tableInfo.name}Service {
    @Resource
    private $!{tableInfo.name}Mapper $!tool.firstLowerCase($!{tableInfo.name})Mapper;

    /**
     * 通过ID查询单条数据
     *
     * @param $!pk.name 主键
     * @return 实例对象
     */
    @Override
    public $!{tableInfo.name}Dto queryById($!pk.shortType $!pk.name) {
        return $!{tableInfo.name}ModelMapper.INSTANCE.changePO2DTO(this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.selectById($!pk.name));
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public List<$!{tableInfo.name}Dto> queryAllByLimit(int offset, int limit) {
        IPage<$!{tableInfo.name}Po> selectPage = new Page<>(offset,limit);
        IPage<$!{tableInfo.name}Po> page = this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.selectPage(selectPage, null);
        return $!{tableInfo.name}ModelMapper.INSTANCE.$!{tool.firstLowerCase($!{tableInfo.name})}POs2$!{tableInfo.name}DTOs(page.getRecords());
    }

    /**
     * 新增数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name})Dto 实例对象
     * @return 实例对象
     */
    @Override
    public $!{tableInfo.name}Dto insert($!{tableInfo.name}Dto $!tool.firstLowerCase($!{tableInfo.name})Dto) {
        this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.insert($!{tableInfo.name}ModelMapper.INSTANCE.changeDTO2PO($!tool.firstLowerCase($!{tableInfo.name})Dto));
        return $!tool.firstLowerCase($!{tableInfo.name})Dto;
    }

    /**
     * 修改数据
     *
     * @param $!tool.firstLowerCase($!{tableInfo.name})Dto 实例对象
     * @return 实例对象
     */
    @Override
    public $!{tableInfo.name}Dto update($!{tableInfo.name}Dto $!tool.firstLowerCase($!{tableInfo.name})Dto) {
        this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.updateById($!{tableInfo.name}ModelMapper.INSTANCE.changeDTO2PO($!tool.firstLowerCase($!{tableInfo.name})Dto));
        return this.queryById($!{tool.firstLowerCase($!{tableInfo.name})}Dto.get$!tool.firstUpperCase($pk.name)());
    }

    /**
     * 通过主键删除数据
     *
     * @param $!pk.name 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById($!pk.shortType $!pk.name) {
        return this.$!{tool.firstLowerCase($!{tableInfo.name})}Mapper.deleteById($!pk.name) > 0;
    }
}
controller模板
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/controller"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}controller;

import $!{tableInfo.savePackageName}.model.vo.$!{tableInfo.name}Vo;
import $!{tableInfo.savePackageName}.model.dto.$!{tableInfo.name}Dto;
import $!{tableInfo.savePackageName}.model.mapper.$!{tableInfo.name}ModelMapper;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表控制层
 *
 * @author $!author
 * @since $!time.currTime()
 */
@Api(tags = "$!{tableInfo.comment}($!{tableInfo.name})") 
@Validated
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} {
    /**
     * 服务对象
     */
    @Resource
    private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("selectOne")
    public $!{tableInfo.name}Vo selectOne($!pk.shortType id) {
        $!{tableInfo.name}Dto $!{tool.firstLowerCase($!{tableInfo.name})}Dto = $!{tool.firstLowerCase($!{tableInfo.name})}Service.queryById(id);
        return $!{tableInfo.name}ModelMapper.INSTANCE.changeDTO2VO($!{tool.firstLowerCase($!{tableInfo.name})}Dto);
    }

}
mapperXml模板
##引入mybatis支持
$!init
$!mybatisSupport

##设置保存名称与保存位置
$!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
$!callback.setSavePath($tool.append($modulePath, "/src/main/resources/mappers"))

##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
    #set($pk = $tableInfo.pkColumn.get(0))
#end

<?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="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Mapper">

    <resultMap type="$!{tableInfo.savePackageName}.model.po.$!{tableInfo.name}Po" id="$!{tableInfo.name}Map">
#foreach($column in $tableInfo.fullColumn)
        <result property="$!column.name" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
#end
    </resultMap>
    
</mapper>

5.对数据库表前缀进行截取
在这里插入图片描述

6.使用IDEA连接Mysql数据库,并使用easycode生成代码
在这里插入图片描述

修改代码生成的包路径点击生成即可。
在这里插入图片描述

代码展示

生成的代码如下:

controller类

在这里插入图片描述

serviceImpl类

在这里插入图片描述

dao类

在这里插入图片描述

mapstruct实体转换类

在这里插入图片描述

数据实体类PO

在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值