手把手教你擼一個代碼生成器

2020-12-15 一杯82年的Java

由於每次開發後臺管理模塊的時候,發現都是做的事情都是一樣的,做的邏輯都是一樣的,只是業務不一樣而已,並且在創建文件很浪費的時間。

1.為什麼會有代碼生成器的誕生?

發現現在很多開源的框架和公司內部框架都會有自帶的代碼生成器功能,為什麼它會出現在我們的框架的一部分呢?簡單的說,它是為了程式設計師偷懶的一個工具,也可以說,它也是一種敏捷開發的體現。它不會在乎項目的業務是什麼,它關注如何創建文件和一些自動寫好的方法,解決了重複勞動的難題,釋放無聊的CRUD功能的編寫。

2.說一說代碼生成器的原理

首先我們先說一說代碼生成器的原理是什麼,我們根據一個表名通過SQL查詢資料庫,獲取一張表的屬性(列名,數據類型,長度.....) ,然後通過IO流修改模板的數據。

3.根據表名如何手寫 SQL 獲取表結構信息

在這裡我按照mysql的資料庫來舉例子,在MYSQL中,一個庫,一張表也算是一條數據存儲在某張表裡面,那麼我們可以理解某張表的一個列就是一條數據,N個列,就有N行數據.

在MYSQL中,在資料庫information_schema中的表COLUMNS就是存儲所有表的屬性,

下面是COLUMNS的表信息

根據上面的列名和描述,我們可以通 SQL 查詢出 Java Entity 對應要的數據:

SELECT TABLE_SCHEMA AS tableSchema, TABLE_NAME AS tableName, COLUMN_NAME AS columnName, ORDINAL_POSITION AS ordinalPosition, IS_NULLABLE AS notNullFlag, DATA_TYPE AS dataType, CHARACTER_MAXIMUM_LENGTH AS columnLength, COLUMN_KEY AS cloumnKey, COLUMN_COMMENT AS cloumnComent FROM information_schema.columns WHERE table_schema = '' //對應的資料庫名 AND table_name = '' //對應數據表名

舉例說明一下,我先創建一張用戶表 tb_sys_user,下面是 DDL 信息:

CREATE TABLE `tb_sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id', `username` varchar(20) NOT NULL COMMENT '登錄名', `name` varchar(50) NOT NULL COMMENT '真實姓名', `password` varchar(32) NOT NULL COMMENT '密碼', `sex` varchar(2) NOT NULL DEFAULT '1' COMMENT '性別,1男2女', `staff_no` varchar(20) DEFAULT NULL COMMENT '編號', `email` varchar(50) DEFAULT NULL COMMENT '郵箱', `mobile_phone` varchar(20) DEFAULT NULL COMMENT '手機號碼', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否禁用,0是,1否', `create_time` datetime NOT NULL COMMENT '創建時間', `update_time` datetime NOT NULL COMMENT '修改時間', `department_id` int(11) DEFAULT NULL COMMENT '部門id', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='系統用戶表'

然後我使用上面的 SQL 查詢:

上面查詢出來就是我們想要的 Java Entity 信息。接下來就要根據查詢信息組裝一個 Java Entity。

4. 教你如何自動生成 Java Bean 實體

簡單說一下 Java Bean,Java Bean 必須準守 Java Bean API 規範,它有比較特別的特徵:

提供一個默認無參的構造函數需要被序列化並且實現了 Serializable 接口可能有一系列可讀寫屬性可能有一系列的 getter 或 setter 方法Javabean 屬性格式 getPropertyName()、setPropertyName()

那麼我們定義的一個通用的模板。

package 包路徑import java.io.Serializable;public class 類名 implements java.io.Serializable{ private 數據類型 欄位名; public 類名 () { } public void set首字符大寫的欄位名(數據類型 欄位名){ this.欄位名 = 欄位名; } public 數據類型 get首字符大寫的欄位名(){ RETURN 欄位名; }}

根據上面的模板的,我們通過文件流讀出來,使用字符串的關鍵字替換的方法 String.replace() 方法替換模板的關鍵字,然後再通過指定文件名寫到對應的文件路徑下,這樣自動生成 Java Bean 就出來的,簡單的來說,就是通過 IO 讀對應的 Java Bean 的文件和字符串替換方法。

5. 如何自動生成 Entity、Dao、Service、Controller 和 CRUD 的方法

平時創建一個模板的代碼要建立 Entity、Dao、Service、Controller 對應的文件和添加 CRUD 的方法。那麼我們為了代碼的一致性,減少不必要的錯誤,我們可以先建立一個 BaseDao,把通用的 CRUD 方法寫好,然後我們新建一個對應的業務 Dao,繼承父類 BaseDao,CRUD 的方法就不用寫了,接下來就是對應的模板。下面我舉例說一下:

BaseDao

package org.john.fastcore.base.dao;import java.util.List;import java.util.Map;import org.apache.ibatis.annotations.Param;import org.john.fastcore.base.bean.Page;/** * 基類DAO * * @author JohnDeng 2017年11月9日上午10:31:10 * @param <T> */public interface BaseDao<T, ID> { public T findById(@Param("id") ID id); public List<T> findAll(); public T get(T entity); public List<T> getList(T entity); public List<T> getListByPage(Page<T> page); public int insert(T entity); public int update(T entity); public int deleteById(@Param("id") ID id); public int deleteBatchById(List<T> list); public int insertBatch(List<T> list); public int updateBatch(List<T> list); public List<Map<String, Object>> getListMap(Map<String, Object> param); public List<Map<String, Object>> getListMap(T entity); public int getTotalCount(Page<T> page); public int delete(T entity); public int deleteBatch(List<T> list);}

對應的模板 DAO:

package ${packgePath};import ${extendsBaseDaoPath};import ${entityPackgePath}.${className};import org.apache.ibatis.annotations.Mapper;/** * ${classDescription} * @author ${author} * @datatime ${datatime} */@Mapperpublic interface ${className}Dao extends BaseDao<${className},${primaryKey}>{}

可以看到,我們就只要替換模板的關鍵字就再通過 IO 流寫到指定的文件路徑,創建一個新的 .java 文件,看上去高大上的代碼生成器,其實原理很簡單,對應的 Service、Controller 都是同樣的道理,我就不舉例子,源碼:spring-boot-code-generator。

6. 說一說代碼生成器的原理

上面也說到,原理其實很簡單,使用了 Java 的 IO 流讀文件、字符串的替換,然後使用了把字符串轉成文件流寫到指定路徑,這是整個流程。其中想做成統一的 CRUD 方法,我們還會使用到 Java 泛型,發射等技術。

相關焦點

  • 隨機密碼生成器|給你代碼
    在這個快節奏的數字網絡生活中,當你要創建一個新帳戶,是否為創建符合網站或平臺要求的密碼而頭疼不已?經常對自己的密碼有創造和選擇困難症?看看下面這些密碼:你是不是曾經也使用過它們?這是全球黑客統計出的前十最高使用頻率的密碼!
  • SpringBoot項目與mybatis及代碼生成器
    這個時候就需要代碼生成器出廠了,這就是批量生成血肉的機器。這裡用到的是個依賴rapid-framework的代碼生成器。下面這個是代碼生成器的目錄,generator-output就是代碼輸出目錄,template是代碼生成模板,src目錄是代碼執行部分。這個就是代碼生成模板,java_src目錄下是java代碼和xml,下圖紅藍各異是代碼調整的結果。
  • JAVA代碼生成器,快速開發平臺之魂
    雖然在前後端上選擇了SSH框架系統作為基礎,但還是耗費了太多時間補代碼,再加上業務需求並不明確,導致後期頻繁的改動令人頭大,當時就想,如果有一種方式能將精力集中到業務上就好了。所以,就有了做一個高效寫碼工具的想法。當代年輕人就是這樣,想要就回去做,我在參考CMS網站時,發現很多都是能用模板填充的,且都是統一的實現方式。
  • Java 代碼生成器光 2.0.0 Insight(內省) 發布嘗鮮版 3,代碼變變變
    Java通用代碼生成器光 2.0.0 Insight(內省) 可以兼容所有這些變體,只需要在 Project 頁做簡單的設置,就可以方便地生成這些風格的代碼。如此先進靈活和易用的代碼生成器,您值得一試。
  • 可用於企業級開發的JAVA代碼生成器
    可用於企業級開發的JAVA代碼生成器 相信下面的介紹對剛好需要此工具的開發工程師有幫助。這是用於java快速開發的工具,也可以說是java代碼生成器,它完全可以應用在企業級軟體開發中,這裡就簡要介紹在eclipse環境中安裝捷兔(JETOOL)後該工具的功能和使用:該工具通過可視化建模,直觀建立數據模型,並直接生成可運行的代碼及web頁面:1.
  • 介紹一款極為好用的java代碼生成器
    項目簡介JNPF是種專為提高開發效率而生的低代碼二次開發框架以及基於代碼生成器的java開發平臺。為簡單的增刪改查、複雜的表單、簡單的事務操作提供了完全自動化的開發平臺。項目特色在線解析拖拽式的表單設計器,快速設計使用自動生成表單代碼,清晰可讀易擴展自動生成三層架構的完整項目和代碼
  • 無垠式 Java 通用代碼生成器 Ada 1.5.0 正式版已發布
    無垠式Java通用代碼生成器JEEEU版 Ada 1.5.0 正式版已發布,項目地址: https://gitee.com
  • Java通用代碼生成器光發布1.5.0 嘗鮮版 2,支持 PDF 導出功能
    項目地址:https://gitee.com/jerryshensjf/LightSBMEU第三代動詞算子式代碼生成器:光SBMEU版本代碼生成器支持前後端分離界面了簡介第三代動詞算子式代碼生成器:光SBMEU版,採用Maven, EasyUI,SpringBoot 2, MyBatis
  • Java 通用代碼生成器光 1.5.0 Kama(頓悟)發布 Beta5版,詳盡測試並...
    項目地址:https://gitee.com/jerryshensjf/LightSBMEU二進位發布版下載地址:https://gitee.com/jerryshensjf/LightSBMEU/attach_files第三代動詞算子式代碼生成器:光SBMEU版本代碼生成器支持前後端分離界面了簡介
  • 手把手教你打造一個純CSS圖標庫
    初看方案2的一堆代碼可能會覺得非常難,但其實很多簡單的圖標都是非常容易實現的。 接下來就是妹子們最期待的茄果叔叔手把手教學時間啦。 手抓手教學時間 使用CSS繪製線條,用到的不外乎兩個屬性:border & box-shadow。
  • 免信用卡:手把手教你註冊美區蘋果Apple ID
    原標題:免信用卡:手把手教你註冊美區蘋果Apple ID 微信公眾號AppSo的這篇美國區Apple ID的註冊教程,是一篇舊文的更新版本,所有的步驟都經過我們實測。不過,這不意味著本教程可以涵蓋所有情況,畢竟人生最不缺的就是意外。
  • 萬聖節定製「喪屍生成器」,編輯部親測,效果鬼畜
    機器之心報導作者:張倩、魔王get 了這個網站,今年萬聖節 C 位就是你的!AI 是一個盛產陰間產品的領域,這一點似乎已經毋庸置疑。前不久,有人做了個用來生成「大眼萌」漫畫形象的網站「Toonify」,但很快就有人走向了另一個極端:用類似技術做一個喪屍生成器!利用 Toonify 生成的威爾 · 史密斯漫畫形象。利用「喪屍生成器」生成的威爾 · 斯密斯喪屍形象。被玩壞的兩位美國總統候選人。
  • 手把手教你微軟帳號怎麼申請
    手把手教你微軟帳號怎麼申請:1,首先,打開百度搜索「註冊微軟帳號官網」點擊進入官網。2,在彈出的創建帳戶界面中,輸入電子郵件地址和密碼,點擊一下。2,這裡我們需要填寫一下詳細信息,點擊「下一步」。4,等待一下微軟帳號發來郵件5,打開郵箱找到安全代碼。6,輸入文本框中,點擊下一步。7,輸入驗證碼,點擊下一步。8,出現如圖界面,微軟帳戶註冊成功。
  • 手把手教你怎麼操作
    中新經緯記者手把手來教你→ 打工人注意了,2021年度個稅專項附加扣除開始確認了。按照規定,每年12月份要對次年享受專項附加扣除的內容進行確認,確認後,才可在扣除年度生效。怎麼操作?中新經緯記者手把手來教你→ 打工人注意了,2021年度個稅專項附加扣除開始確認了。
  • MutationObserver: dom變化監聽 給你代碼
    工作中突然有一個需求,必須你要監聽dom的插入,那麼就需要去監聽dom變化。在一般印象中,監聽事件應該是這麼實現的比如 xx.addEventListener(xxx)。而實際上關於這個dom變化有一套html5標準。如在mdn寫到MutationObserver接口提供了監視對DOM樹所做更改的能力。
  • 特殊字符生成器
    特殊字符生成器 聊天社交 大小: 620.45K
  • 手把手教您3D列印一個自動寫字機器人
    1手把手教您3D列印自動寫字機器人    【中關村在線辦公列印頻道原創】近日,在DIY熱站Instructions上,一名網名為MakersBox的用戶共享了一個非常有趣的3D印表機器人,這個小巧的機器人使用的是Arduino
  • 手把手教你做米酒,保證100%成功
    還記得電影《小森林》裡面說「出完汗之後,需要酒」,然後下一個畫面就自顧自釀起了米酒,那喝酒畫面可給美食君饞的呀~今天終於親手做了一遍。美食君手把手一步步教你,保證100%成功~自 制 酒 釀糯米/酒麴/涼開水傳 統 發 酵 法:1.將糯米洗淨放在乾淨容器裡浸泡一夜,然後放入鍋中蒸熟。2.等糯米蒸熟後用筷子打散晾溫,倒入一碗涼白開,使米飯顆粒分明。
  • 網上現大學文憑生成器,各校都有?
    近日,網上出現一種大學畢業證書生成器,不僅是國內大學,國外大學的畢業證也可生成。這種合成的畢業證在應聘中能否矇混過關?偽造證件又會面臨怎樣的處罰?現代快報記者進行了調查。現代快報+/ZAKER南京記者季雨劉遙一鍵生成畢業證,還支持印章、鋼印近日,網上出現一種通用大學畢業證生成器,用戶可自行編輯生成各類大學畢業證圖片。
  • 傻瓜文案生成器在哪裡可以玩?營銷號生成器入口地址分享[視頻][多圖]
    傻瓜文案生成器最近突然在微博上火爆了,很多人都知道有這樣一個小工具,可以生成各種文案,模擬出超級搞笑的文不對題文章,詳細的玩法以及生成器的入口,下面會有連結入口分享,想要體驗試試的玩家可以通過下方的入口前往,生成各種沒有營養但是很搞笑的熱評。