chatgpt代碼生成測試 非低代碼,我寫了一個比ChatGPT還牛的CRUD代碼生成器
7
緣起
大家好呀chatgpt代碼生成測試,我是架構師業余草。
最近在做一個項目,需要新建20多張表
相信大多數同學應該和我一樣,都是比較討厭創建新表這個工作的,因為每創建一張表,都要去創建實體類、創建增刪改查的接口、編寫增刪改查的SQL代碼等等,把這些事情做完,2個小時也就過去了
我就在思考啊,每一張表,就要耗費兩個小時,20多張表,那就是40多個小時,一周的時間就這樣過去了。
思考
這誰受得了呀,所以我打算寫一個工具,把這些代碼都自動生成出來!
代碼都自動生成出來
在連續爆肝了5個晚上之后,我做出了這款自動生成業務代碼的工具!
自動生成業務代碼
我把它放在了我的工具站上,大家可以訪問這個域名直接使用
基于 Boot + Plus + Vue & 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
使用演示
下面給大家演示一下
假設我們現在創建一個商品表
首先填寫表名和表的中文名稱
然后我們添加商品表對應的字段,這些操作和我們日常使用的數據庫工具差不多
把字段填寫好了之后,點擊“一鍵生成代碼”
完成表信息編輯
高潮的地方來了
DB層、業務層、甚至是層的代碼,工具都幫我們自動生成了!
來看下代碼,建表sql、增刪改查sql、表對應的實體類、DB層的接口類、業務層的實體類、業務層的接口類、業務接口的實現類、業務層實體類和db層實體類的轉換器,最后是層,這些代碼全都幫我們生成好了。
代碼全都幫我們生成好了
這是什么概念呢
現在我們只需要把這些代碼拷貝到項目里,簡單設置一下類的引用,增刪改查這些基本功能,就已經可以直接給前端去調用了。
CRUD
很多同學可能會問,如果是現有的數據表,再來這里添加一次感覺太麻煩了
這個問題我也遇到了,所以我做了一個識別建表SQL的功能,常見的數據庫工具對于已經創建好的表,都提供建表語句的復制功能,只需要把建表SQL粘貼到這個文本框里。
點擊“識別”按鈕,這個SQL的信息會自動識別過來,這時候只需要把表的中文名稱填寫上去,點擊“一鍵生成代碼”,就可以馬上得到這個表的業務代碼。
業務代碼生成器
基于 + + + + Vue & 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能
通用性的思考
不知道大家覺得怎么樣哈,如果只是我自己用,我覺著已經非常好了,但既然是開放出來給大家用,通用性肯定還是不夠的。
因為現在看到的這一套自動生成的代碼,可能只是適合我,但不同的人、不同的公司,它們項目結構的分層、代碼的細節,都是不一樣的
所以,我還開發了代碼模版配置的功能
點擊“代碼模版配置”按鈕,在這個彈窗里,我們可以新增、刪除代碼的分類。同樣的,也可以新增、刪除和編輯具體的代碼模版。
代碼模版 代碼生成的原理
在說代碼模版具體怎么配置之前,先給大家講一下代碼自動生成的原理
它由代碼模版和動態參數組成,核心就是匹配 - 替換
首先,工具提供了很多動態參數,這些動態參數,對應的是我們填寫的表名、字段名等等這些信息的原始值,或者處理過后的值。
然后,代碼模版由用戶自行定義,在代碼的關鍵位置,插入動態參數,即可形成一份代碼模版。
最后,工具通過匹配和替換動態參數,最終生成了代碼。
理論上,不論什么語言,你都可以配置專屬于你自己的代碼模版。
舉個簡單的栗子:
我們配置了一份這樣的代碼模版,如下:
/**
?*?$table_desc$Model模型
?*?Created?by?創建人?on?$current_time$.
?*/
public?class?$table_name_hump_A$Model?extends?ToString{
}
可以看到,模版里分別使用了$$(表中文名)、$$(當前時間)、$$(表名轉首字母大寫駝峰) 這三個動態參數。
當我們設置 表名 = 、表中文名 = 商品訂單 時,代碼生成的結果如下所示:
/**
?*?商品訂單Model模型
?*?Created?by?創建人?on?2023-02-05?17:12:32.
?*/
public?class?GoodsOrderModel?extends?ToString{
}
動態參數部分,全部替換成了我們輸入的表信息。
最后希望這個項目對大家有用,之后我會開發更多有意思的項目。
由于這個項目都是晚上加班肝出來的,可能會存在一些BUG,發現了我會盡快修復的,也請大家多多包涵。
代碼模版參考
以下是當前工具里默認的代碼模版,你可以通過參考這些模版,舉一反三,配置出專屬于你自己的代碼模版。
工具提供了模版的導入和導出功能,如果你創建好了一份非常滿意的模版,可以導出,然后發給你的同事直接使用,這樣它就不用重復創建了,你也可以忽悠你的同事來創建,然后分享給你。
建表SQL模版
CREATE?TABLE?`$table_name$`?(
??$create_table_field_list$
??PRIMARY?KEY?(`$primary_key$`)
)?ENGINE=$db_engine$?DEFAULT?CHARSET=$db_encoded$;
實體類模版
主體
/**
?*?$table_desc$DTO模型
?*?Created?by?創建人?on?$current_time$.
?*/
public?class?$table_name_hump_A$DO?{
????$member_param_list$
????$get_set_method_list$
}
成員代碼塊 成員變量列表()
/**?$field_comment$?*/
private?$field_type_java$?$field_name_hump$;
成員代碼塊 方法列表()
public?$field_type_java$?get$field_name_hump_A$()?{
????return?$field_name_hump$;
}
public?void?set$field_name_hump_A$($field_type_java$?$field_name_hump$)?{
????this.$field_name_hump$?=?$field_name_hump$;
}
接口類模版(DB層)
import?org.apache.ibatis.annotations.Mapper;
import?org.apache.ibatis.annotations.Param;
import?java.util.List;
import?java.util.Map;
/**
?*?$table_desc$DB接口
?*?Created?by?創建人?on?$current_time$
?*/
@Mapper
public?interface?$table_name_hump_A$DAO?{
????/**
?????*?添加
?????*?@param?data
?????*?return?影響行數
?????*/
????int?insert($table_name_hump_A$DO?data);
????/**
?????*?修改
?????*?@param?data
?????*?return?影響行數
?????*/
????int?update($table_name_hump_A$DO?data);
????/**
?????*?分頁查詢
?????*?@param?param
?????*?return?結果列表
?????*/
????List<$table_name_hump_A$DO>?pageQuery(Map?param);
????/**
?????*?查詢count
?????*?@param?param
?????*?return?count條數
?????*/
????Long?pageQueryCount(Map?param);
????/**
?????*?根據ID查詢
?????*?@param?id
?????*?return?結果DO對象
?????*/
????$table_name_hump_A$DO?queryById(@Param("$primary_key_hump$")?$primary_key_type_java$?$primary_key_hump$);
????/**
?????*?根據ID查詢(帶鎖)
?????*?@param?id
?????*?return?結果DO對象
?????*/
????$table_name_hump_A$DO?queryByIdLock(@Param("$primary_key_hump$")?$primary_key_type_java$?$primary_key_hump$);
}
CRUD SQL模版
????
????????INSERT?INTO?$table_name$($insert_field_name_list$)
????????VALUES?($insert_field_value_list$);
????
????
????????UPDATE?$table_name$?SET
????????????$update_field_list$
????????WHERE?$primary_key$?=?#{$primary_key_hump$};
????
????
????
????
????
模型轉換器模版
不同層級間,可能會有不同的實體類,那么它們相互之間的數據轉換,也是一個重復且浪費時間的工作,所以也可以配置一個模版。
import?org.springframework.util.CollectionUtils;
import?java.util.ArrayList;
import?java.util.List;
/**
?*?$table_desc$模型轉換器
?*?Created?by?創建人?on?$current_time$
?*/
public?class?$table_name_hump_A$Converter?{
????/**
?????*?dto轉do
?????*?@param?source
?????*?return?do模型
?????*/
????public?static?$table_name_hump_A$DO?toDo($table_name_hump_A$DTO?source){
????????$table_name_hump_A$DO?target?=?new?$table_name_hump_A$DO();
????????$converter_source_to_target_params_list$
????????return?target;
????}
????/**
?????*?do轉dto
?????*?@param?source
?????*?return?dto模型
?????*/
????public?static?$table_name_hump_A$DTO?toDto($table_name_hump_A$DO?source){
????????$table_name_hump_A$DTO?target?=?new?$table_name_hump_A$DTO();
????????$converter_source_to_target_params_list$
????????return?target;
????}
????/**
?????*?do?list?轉?dto
?????*?@param?data
?????*?return?list?dto模型
?????*/
????public?static?List<$table_name_hump_A$DTO>?toDtoList(List<$table_name_hump_A$DO>?data){
????????if?(CollectionUtils.isEmpty(data)){
????????????return?null;
????????}
????????List<$table_name_hump_A$DTO>?list?=?new?ArrayList<>();
????????for?($table_name_hump_A$DO?item?:?data){
????????????list.add($table_name_hump_A$Converter.toDto(item));
????????}
????????return?list;
????}
}
成員代碼塊 模型轉換器參數列表()
target.set$field_name_hump_A$(source.get$field_name_hump_A$());
業務接口實現類模版
import?com.alibaba.fastjson.JSONObject;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?org.springframework.stereotype.Service;
/**
?*?$table_desc$業務實現
?*?Created?by?創建人?on?$current_time$
?*/
@Service
public?class?$table_name_hump_A$ServiceImpl?implements?$table_name_hump_A$Service?{
????private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger($table_name_hump_A$ServiceImpl.class);
????@Resource
????private?$table_name_hump_A$DAO?$table_name_hump$DAO;
????@Override
????public?CommonResult?create(JSONObject?request)?{
????????
????????//?入參轉成對應類型
????????CommonAssert.isNoEmptyObj(request,?"請求參數不可空");
????????$table_name_hump_A$DTO?dto?=?JSON.toJavaObject(request,?$table_name_hump_A$DTO.class);
??
????????//?參數校驗
?????$biz_check_required_params$
????????
????????//?轉成do模型
????????$table_name_hump_A$DO?dataDo?=?$table_name_hump_A$Converter.toDo(dto);
????????//?落庫
????????int?count?=?$table_name_hump$DAO.insert(dataDo);
????????CommonAssert.isTrue(count?>?0,?"創建失敗,請重試");
????????//?返回創建成功的ID數據
????????return?new?CommonResult(dataDo.get$primary_key_hump_A$());
????}
????@Override
????public?CommonResult?modify(JSONObject?request)?{
????????
????????//?入參轉成對應類型
????????CommonAssert.isNoEmptyObj(request,?"請求參數不可空");
????????$table_name_hump_A$DTO?dto?=?JSON.toJavaObject(request,?$table_name_hump_A$DTO.class);
??
????????//?參數校驗
?????$biz_check_required_params$
????????
????????//?轉成do模型
????????$table_name_hump_A$DO?dataDo?=?$table_name_hump_A$Converter.toDo(dto);
????????//?落庫
????????int?count?=?$table_name_hump$DAO.update(dataDo);
????????CommonAssert.greaterThanZero(count,?"修改失敗,請重試");
????????//?返回修改成功的ID數據
????????return?new?CommonResult(dataDo.get$primary_key_hump_A$());
????}
????@Override
????public?CommonResult?pageQuery(JSONObject?request)?{
????????
????????//?入參基本校驗
????????CommonAssert.isNoEmptyObj(request,?"請求參數不可空");
????????
????????//?分頁信息校驗
????????PaginationDO?pagination?=?PaginationDO.setRequestOffsetAndRows(request);
????????CommonAssert.isNoEmptyObj(pagination,?"分頁參數?$pageIndex、$pageSize?不可空");
????????CommonAssert.isTrue(pagination.getPageSize()?<=?100,?"單次查詢條數不可超過100條");
????????//?取分頁列表數據
????????List<$table_name_hump_A$DO>?dbResult?=?$table_name_hump$DAO.pageQuery(request);
????????//?取count數據
????????long?count?=?$table_name_hump$DAO.pageQueryCount(request);
????????//?空返回
????????if?(CollectionUtils.isEmpty(dbResult)){
????????????return?new?CommonResult(new?PaginationResult(null,?request,?count));
????????}
????????//?模型轉換
????????List<$table_name_hump_A$DTO>?list?=?$table_name_hump_A$Converter.toDtoList(dbResult);
????????//?返回分頁結果
????????return?new?CommonResult(new?PaginationResult(list,?request,?count));
????}
????@Override
????public?CommonResult?queryById(JSONObject?request)?{
????????
????????//?取入參
????????CommonAssert.isNoEmptyObj(request,?"請求參數不可空");
????????//?根據ID獲取數據
????????$primary_key_type_java$?$primary_key_hump$?=?request.get$primary_key_type_java$("$primary_key_hump$");
????????CommonAssert.isNoEmptyObj($primary_key_hump$,?"參數錯誤,無法執行查詢");
????????$table_name_hump_A$DO?dbResult?=?$table_name_hump$DAO.queryById($primary_key_hump$);
????????
????????//?未查詢到結果,返回
????????if?(null?==?dbResult){
????????????return?new?CommonResult();
????????}
????????//?模型轉換
????????$table_name_hump_A$DTO?result?=?$table_name_hump_A$Converter.toDto(dbResult);
????????//?返回結果對象
????????return?new?CommonResult(result);
????}
}
成員代碼塊 必填項業務校驗()
CommonAssert.$java_type_adapter_assert_method$(dto.get$field_name_hump_A$(),?"$field_comment$不可空");
模版
import?com.alibaba.fastjson.JSONObject;
import?org.slf4j.Logger;
import?org.slf4j.LoggerFactory;
import?org.springframework.web.bind.annotation.*;
import?javax.annotation.Resource;
/**
?*?$table_desc$HTTP請求控制器
?*?Created?by?創建人?on?$current_time$.
?*/
@CrossOrigin
@RestController
@RequestMapping(value?=?"/$table_name_hump$/")
public?class?$table_name_hump_A$Controller?{
????private?static?final?Logger?LOGGER?=?LoggerFactory.getLogger($table_name_hump_A$Controller.class);
????@Resource
????private?$table_name_hump_A$Service?$table_name_hump$Service;
????/**
?????*?創建
?????*?@param?request
?????*?@return
?????*/
????@RequestMapping(value?=?"create.json",?method?=?{RequestMethod.GET,?RequestMethod.POST})
????@ResponseBody
????public?Object?create(@RequestBody?JSONObject?request){
????????return?CommonTemplate.run(LOGGER,?new?CommonTemplate()?{
????????????@Override
????????????protected?Object?business()?{
????????????????return?$table_name_hump$Service.create(request);
????????????}
????????},?request);
????}
????/**
?????*?修改
?????*?@param?request
?????*?@return
?????*/
????@RequestMapping(value?=?"modify.json",?method?=?{RequestMethod.GET,?RequestMethod.POST})
????@ResponseBody
????public?Object?modify(@RequestBody?JSONObject?request){
????????return?CommonTemplate.run(LOGGER,?new?CommonTemplate()?{
????????????@Override
????????????protected?Object?business()?{
????????????????return?$table_name_hump$Service.modify(request);
????????????}
????????},?request);
????}
????/**
?????*?分頁查詢
?????*?@param?request
?????*?@return
?????*/
????@RequestMapping(value?=?"pageQuery.json",?method?=?{RequestMethod.GET,?RequestMethod.POST})
????@ResponseBody
????public?Object?pageQuery(@RequestBody?JSONObject?request){
????????return?CommonTemplate.run(LOGGER,?new?CommonTemplate()?{
????????????@Override
????????????protected?Object?business()?{
????????????????return?$table_name_hump$Service.pageQuery(request);
????????????}
????????},?request);
????}
????/**
?????*?通過主鍵查詢
?????*?@param?request
?????*?@return
?????*/
????@RequestMapping(value?=?"queryById.json",?method?=?{RequestMethod.GET,?RequestMethod.POST})
????@ResponseBody
????public?Object?queryById(@RequestBody?JSONObject?request){
????????return?CommonTemplate.run(LOGGER,?new?CommonTemplate()?{
????????????@Override
????????????protected?Object?business()?{
????????????????return?$table_name_hump$Service.queryById(request);
????????????}
????????},?request);
????}
}
動態參數 原始表名 $$
?
用戶輸入的表名,不做任何處理。
?
表名駝峰首字母小寫 $$
?
用戶輸入的表名,經過駝峰處理。例如輸入: ,輸出:
?
表名駝峰首字母大寫 $$
?
用戶輸入的表名,經過駝峰處理。例如輸入: ,輸出:
?
原始字段名 $$
?
用戶輸入的表字段名,不做任何處理。
?
字段名駝峰首字母小寫 $$
?
用戶輸入的表字段名,經過駝峰處理。例如輸入: ,輸出:
?
字段名駝峰首字母大寫 $$
?
用戶輸入的表字段名,經過駝峰處理。例如輸入: ,輸出:
?
字段說明 $$
?
用戶輸入的表字段說明,不做任何處理。
?
字段數據類型(對應DB)$$
?
用戶選擇的表字段類型,不做任何處理。
?
字段數據類型(對應Java)$$
?
用戶選擇的表字段類型,會自動匹配對應的Java類型。例如輸入:(),輸出:
?
主鍵字段名 $$
?
用戶選擇的主鍵字段,不做任何處理。例如用戶定義的主鍵是id,那么輸出就是:id
?
主鍵字段名駝峰首字母小寫 $$
?
用戶選擇的主鍵字段,經過駝峰處理。例如輸入: ,輸出:
?
主鍵字段名駝峰首字母大寫 $$
?
用戶選擇的主鍵字段,經過駝峰處理。例如輸入: ,輸出:
?
主鍵字段數據類型(對應Java)$a$
?
用戶選擇的主鍵字段類型,會自動匹配對應的Java類型。例如輸入:(),輸出:
?
插入數據sql,字段名列表 $st$
?
例如表中有三個字段:id(主鍵)、、,輸出:, 。會自動排除主鍵 不僅插入數據時可用,任何需要排除ID,然后使用英文逗號拼接表所有字段信息的地方,都可以使用它
?
插入數據sql,字段值列表 $ist$
?
例如表中有三個字段:id(主鍵)、、,輸出:#{},#{} 。會自動排除主鍵 不僅插入數據時可用,任何需要排除ID,然后使用英文逗號拼接表所有字段信息的地方,都可以使用它
?
修改數據sql,字段名列表 $$
?
例如表中有三個字段:id(主鍵)、、 輸出(會自動換行,會攜帶以下縮進,會自動排除主鍵):
?
goods_name?=?#{goodsName},
price?=?#{price}
查詢數據sql,字段名列表 $$
?
例如表中有三個字段:id(主鍵)、、chatgpt代碼生成測試,輸出:id,, 。帶主鍵
?
字段條件sql,字段名列表 $$
?
例如表中有三個字段:id(主鍵)、、, 輸出(會自動換行,會攜帶以下縮進):
?
????AND?id?=?#{id}
????AND?goods_name?=?#{goodsName}
????AND?price?=?#{price}
創建表-表字段列表 $ist$
?
例如表中有三個字段:id(自增主鍵)、、 輸出(會自動換行chatgpt代碼生成測試,會攜帶以下縮進):
?
`id`?INT(11)?NOT?NULL?AUTO_INCREMENT,
??`goods_name`?VARCHAR(128)?NOT?NULL?DEFAULT?'NULL',
??`price`?DECIMAL(10,2)?NOT?NULL?DEFAULT?'NULL'
當前時間 $$
?
免責聲明:本文系轉載,版權歸原作者所有;旨在傳遞信息,不代表本站的觀點和立場和對其真實性負責。如需轉載,請聯系原作者。如果來源標注有誤或侵犯了您的合法權益或者其他問題不想在本站發布,來信即刪。
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若本站內容侵犯了原著者的合法權益,可聯系本站刪除。