1. 程式人生 > 實用技巧 >EasyCode外掛使用及模板參考

EasyCode外掛使用及模板參考

EasyCode外掛使用及模板參考

1、介紹安裝

Easycode是idea的一個外掛,可以直接對資料的表生成entity、controller、service、dao、mapper無需任何編碼,簡單而強大。

我這裡的話是已經那裝好了。

建議大家在安裝一個外掛,叫做Lombok。

Lombok能通過註解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法。出現的神奇就是在原始碼中沒有getter和setter方法,但是在編譯生成的位元組碼檔案中有getter和setter方法。

2、在IDEA配置連線資料庫

在這個之前,新建一個Springboot專案,這個應該是比較簡單的。

建好SpringBoot專案之後,如下圖所示,配置資料來源,我這裡是已經配置完成的。

3、開始生成程式碼

在這個裡面找到你想生成的表,然後右鍵,就會出現如下所示的截面。這裡點選後會選擇生成的檔案型別,以及生成檔案的位置。

如下圖所示,這裡是,我們的選擇方式:

注意:我們在模板中配置過,這裡選擇適合,Package選項是選擇到倒數第二層的位置,下面模板會自動找到所在位置。

4、模板配置

我們在這裡進行配置,模板配置語言是velocity語言,這裡配置的是SPring+通用Mapper

4.1entity層配置

##匯入巨集定義
$!define

##儲存檔案(巨集定義)
#save("/entity", ".java")

##包路徑(巨集定義)
#setPackageSuffix("entity")

##自動匯入包(全域性變數)
$!autoImport
import tk.mybatis.mapper.annotation.NameStyle;
import tk.mybatis.mapper.code.Style;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;

##表註釋(巨集定義)
#tableComment("表實體類")
@Data
@NameStyle(Style.normal)
@Table(name = "$!{tableInfo.name}")
public class $!{tableInfo.name}{
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})//${column.comment}#end
    
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}

注意:

$!define 這個我們不用關注,預設即可

save("/entity", ".java"),這裡是定義了實體類的所在包名,字尾是.java

setPackageSuffix("entity") ,這裡是包路徑

tableComment("表實體類") 是一種註釋

在配置介面有著詳細的方法註釋,可以看著註釋進行更加詳細的配置。

4.2dao層配置

##定義初始變數
#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 tk.mybatis.mapper.common.Mapper;
import com.ctbt.entity.$!{tableInfo.name};
/**
 * $!{tableInfo.comment}($!{tableInfo.name})表資料庫訪問層
 *
 * @author $!author
 * @since $!time.currTime()
 */
public interface $!{tableName} extends Mapper<$!{tableInfo.name}>{

}

注意:

1、這裡我們注意前三行的配置,第一行是一個字串連線操作得到,NameMapper,這種樣子;設定檔名字,字尾是.java;設定儲存路徑

2、注意接下來是拿到主鍵,這個拿到的主鍵$pk不能直接用

3、接下來是配置註釋資訊,我們也可以使用#tableComment("表實體類")來代替這麼多行內容

4.3Service層配置

##定義初始變數
#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}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Mapper;
import cn.hutool.core.collection.CollUtil;
import com.ctbt.enums.ExceptionEnum;
import com.ctbt.exception.CtbtException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表服務介面
 *
 * @author $!author
 * @since $!time.currTime()
 */
@Service
@Transactional
public class $!{tableName} {


    @Autowired(required = false)
    private $!{tableInfo.name}Mapper $!{tool.firstLowerCase($tableInfo.name)}Mapper;

    /**
     *根據引數查詢資料,引數為空時,查詢所有 
     * @param $!tool.firstLowerCase($!tableInfo.name)
     * @return
     */
    public List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)) {
        List<$!{tableInfo.name}> select = $!{tool.firstLowerCase($tableInfo.name)}Mapper.select($!tool.firstLowerCase($!tableInfo.name));
        if (CollUtil.isEmpty(select)) {
            throw new CtbtException(ExceptionEnum.NOT_FOUND_OR_FOUND_ERROR);
        }
        return select;
    }

    /**
     * 插入資料
     * @param $!tool.firstLowerCase($!tableInfo.name)
     */
    public void add($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)) {

        if($!{tool.firstLowerCase($tableInfo.name)}Mapper.selectByPrimaryKey($!{tool.firstLowerCase($!tableInfo.name)}.getId())!=null){
            throw new CtbtException(ExceptionEnum.DATA_ALREADY_EXISTS);
        }
        int insert = $!{tool.firstLowerCase($tableInfo.name)}Mapper.insert($!tool.firstLowerCase($!tableInfo.name));
        if (insert != 1) {
            throw new CtbtException(ExceptionEnum.INSERT_ERROR);
        }
    }

    /**
     * 更新資料
     * @param $!tool.firstLowerCase($!tableInfo.name)
     */
    public void update($!{tableInfo.name} $!tool.firstLowerCase($!tableInfo.name)) {
        int i = $!{tool.firstLowerCase($tableInfo.name)}Mapper.updateByPrimaryKey($!tool.firstLowerCase($!tableInfo.name));
        if (i != 1) {
            throw new CtbtException(ExceptionEnum.UPDATE_ERROR);
        }
    }

#foreach($column in $tableInfo.pkColumn)
     /**
     * 根據主鍵刪除資料
     * @param $column.name
     */
    public void delete($!{tool.getClsNameByFullName($column.type)} $column.name) {
        int i = $!{tool.firstLowerCase($tableInfo.name)}Mapper.deleteByPrimaryKey($column.name);
        if (i != 1) {
            throw new CtbtException(ExceptionEnum.DELETE_ERROR);
        }
    }
    #break
#end

}

注意:

注意前三行以及開頭註釋不再贅述

下面是CRUD操作,注意刪除操作時候,這裡是選擇一個迴圈操作,因為這裡拿到的主鍵,設定不是一個,而預設是多個,所以我們用迴圈拿主鍵。

4.4Controller層配置

##定義初始變數
#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}.entity.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * $!{tableInfo.comment}($!{tableInfo.name})表控制層
 *
 * @author $!author
 * @since $!time.currTime()
 */
@CrossOrigin
@RestController
@RequestMapping("$!tool.firstLowerCase($tableInfo.name)")
public class $!{tableName} {
    
    /**
     * 服務物件
     */
    @Autowired
    private $!{tableInfo.name}Service $!tool.firstLowerCase($tableInfo.name)Service;
    
    /**
     * 根據屬性查詢 (當引數為空時候)查詢所有
     * @param $!tool.firstLowerCase($!tableInfo.name)
     * @return
     */
    @GetMapping("list")
    public ResponseEntity<List<$!{tableInfo.name}>> query(@RequestBody(required = false) $!tableInfo.name $!tool.firstLowerCase($!tableInfo.name)){
        return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll($!tool.firstLowerCase($!tableInfo.name)));
    }
    
    /**
     * 插入一條資料
     * @param $!tool.firstLowerCase($!tableInfo.name)
     * @return
     */
    @PostMapping("add")
    public ResponseEntity<List<$!{tableInfo.name}>> add(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
        $!{tool.firstLowerCase($tableInfo.name)}Service.add($!tool.firstLowerCase($tableInfo.name));
        return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll(new $!{tableInfo.name}()));
    }

    /**
     * 根據主鍵更新資料
     * @param $!tool.firstLowerCase($!tableInfo.name)
     * @return
     */
    @PutMapping("update")
    public ResponseEntity<List<$!{tableInfo.name}>> update(@RequestBody $!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name)){
        $!{tool.firstLowerCase($tableInfo.name)}Service.update($!tool.firstLowerCase($tableInfo.name));
        return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll(new $!{tableInfo.name}()));
    }

#foreach($column in $tableInfo.pkColumn)
     /**
     * 根據主鍵刪除
     * @param $column.name
     * @return
     */
    @DeleteMapping("del/{$column.name}")
    public ResponseEntity<List<$!{tableInfo.name}>> delete(@PathVariable("$column.name") $!{tool.getClsNameByFullName($column.type)} $column.name){
        $!{tool.firstLowerCase($tableInfo.name)}Service.delete($column.name);
        return ResponseEntity.ok($!{tool.firstLowerCase($!{tableInfo.name})}Service.queryAll(new $!{tableInfo.name}()));
    }
    #break
    #end
}

注意:此處配置和Service層差別不大。

總結

這裡,我們的配置不再詳細描述了,根據模板配置的頁面可以很好的可以理解,這裡提一下其中一個語法,這裡給出一個對比

1、

$!{tool.firstLowerCase($tableInfo.name)}Service.delete($column.name);  正確寫法
$!tool.firstLowerCase($tableInfo.name)Service.delete($column.name);  錯誤寫法

這裡第一行和第二行的差別是缺少了一個{},因此要格外注意這個點

2、

private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
private $tool.getClsNameByFullName($column.type) $column.name;

這裡看到第一行相對第二行缺少一個!,這裡是沒有影響的,個人對這個原因不是很清楚,也沒有去查velocity的語法,各位懂這個的可以指出,多謝!