用互聯網思維擴展電商后臺的 CRUD 功能

一、自定義實現MyBatis-Plus逆向工程

多數據源的問題解決了,接下來開始進行實際開發時,你會發現,最麻煩的一件事情就是要創建與數據庫表對應的POJO了。這些沒什么難度,但是繁瑣的內容會占據大量的開發時間。比如一個PmsProducr對象,有三四十個屬性。這就需要開發一個龐大的POJO對象。相反,上層的CRUD操作則相當簡單。只需要繼承MyBatis-plus框架提供的BaseMapper接口即可。

@DS("goods")
public interface PmsProductMapper extends BaseMapper<PmsProduct> {
}

?標準的CRUD操作完全都不需要進行聲明,直接就可以拿來用。只需要補充一些復雜的SQL操作即可。接下來當然是希望能夠用程序快速自動的生成這些POJO類了,這樣可以節省大量的開發時間。
關于如何生成POJO類,你當然可以使用MyBatis的逆向工程或者MyBatis-plus的逆向工程,這些網上有大量的資料,我們這里就不多做介紹。但是,你會不會有一種感覺,這些通用的逆向工程雖然優秀,但是卻都太過復雜。他
們為了工具的通用性,做了很多對我們沒有用的封裝。你有沒有想過自己做一個簡單使用的逆向工程出來呢?做一些這樣的思考會讓你對枯燥的CRUD工作產生一些不一樣的想法。
其實你可以思考一下,需要根據數據庫的表創建出對應的POJO類,需要哪些信息? 其實要的信息并不多。表名、列名、列類型、主鍵信息。有這些就差不多了。而這些信息,其實都可以從最簡單的JDBC操作中獲取到。

public static void main(String[] args) throws Exception {//mysqlClass.forName("com.mysql.cj.jdbc.Driver")?Properties props = new Properties()?props.put("useInformationSchema", "true")? //mysql獲取表注釋需要加上這個屬性props.put("user", "root")?props.put("password", "root")?Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/genserver?serverTimezone=GMT%2B8&characterEncoding=utf-8&autoReconnect=true",props)?System.out.println("========映射表信息==============")?DatabaseMetaData meta = con.getMetaData()?ResultSet tables = meta.getTables("genserver", "%", "black_info", new String[]{"TABLE"})?while(tables.next()) {ResultSetMetaData metaData = tables.getMetaData()?System.out.println(metaData.getColumnCount())?for(int i = 1 ? i <= metaData.getColumnCount()? i ++) {System.out.println(metaData.getColumnName(i)+" ==>"+tables.getString(metaData.getColumnName(i)))?}System.out.println(tables.getString("TABLE_NAME")+" --->>>"+tables.getString("REMARKS"))?}System.out.println("========映射列信息==============")?ResultSet columns = meta.getColumns("genserver", "%", "black_info", "%")?while(columns.next()) {String columnName = columns.getString("COLUMN_NAME")?String columnType = columns.getString("TYPE_NAME")?int datasize = columns.getInt("COLUMN_SIZE")?int digits = columns.getInt("DECIMAL_DIGITS")?int nullable = columns.getInt("NULLABLE")?String remarks = columns.getString("REMARKS")?System.out.println(columnName+" "+columnType+" "+datasize+" "+digits+" "+nullable+" "+remarks)?}System.out.println("========映射主鍵信息==============")?ResultSet primaryKeys = meta.getPrimaryKeys("genserver", "%", "black_info")?while(primaryKeys.next()) {ResultSetMetaData metaData = primaryKeys.getMetaData()?System.out.println(metaData.getColumnCount())?for(int i = 1 ? i <= metaData.getColumnCount()? i ++) {System.out.println(metaData.getColumnName(i)+" ==>"+primaryKeys.getString(metaData.getColumnName(i)))?}}
}

接下來如何將這些信息拼湊成一個POJO呢?你可以使用一個StringBu?er,一點點拼接出POJO的完整代碼,再一次輸出到文件當中,這沒有問題。但是這樣顯然會比較麻煩,而且容易出錯。

MyBatis的逆向工程使用的就是這種方式。

二、使用Freemarker模板引擎實現一鍵開發模式

對于這種問題,其實可以用模版引擎來做。將代碼中靜態的部分寫到模版當中,然后將動態部分交由模版生成。最為常用的模版引擎就是freemarker了。大部分場景下,freemarker通常是用來生成靜態HTML頁面的。比如在我們的電商場景中,就實現了對產品單品頁的靜態化功能。

使用靜態化功能,需要你創建 %{user_home}\template\ftl\目錄下放置report.ftl模版文件,同時需要提前創建 %{user_home}\template\report目錄?

freemarker是一個基于模版和數據輸出文本的通用工具。只需要準備好動態的業務數據,以及基于FTL語言編寫的模版文件,就可以快生成靜態的文本。?

如果你對freemarker不是很了解,可以從這個示例中快速理解freemarker模版引擎。這個引擎上手非常簡單,對于有開發經驗的你,肯定沒什么問題。按照以下幾個步驟就可以快速上手freemarker了。

1、引入maven依賴

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version>
</dependency>

?2、構建后臺數據

public class FreemarkerTest {public static void main(String[] args) throws Exception {// 第一步:創建一個Configuration對象,直接new一個對象。構造方法的參數就是freemarker對于的版本號。Configuration configuration = new Configuration(Configuration.getVersion())?// 第二步:設置模板文件所在的路徑。configuration.setDirectoryForTemplateLoading(new File("D:\\ftl"))?// 第三步:設置模板文件使用的字符集。一般就是utf‐8.注意版本。新版本不需要// configuration.setDefaultEncoding("UTF‐8")?// 第四步:加載一個模板,創建一個模板對象。Template template = configuration.getTemplate("test.ftl")?// 第五步:創建一個模板使用的數據集,可以是pojo也可以是map。一般是Map。Map dataModel = new HashMap<>()?//向數據集中添加數據dataModel.put("hello", "圖靈學院電商VIP")?// 第六步:創建一個Writer對象,一般創建一FileWriter對象,指定生成的文件名。Writer out = new FileWriter(new File("D:\\ftl\\out\\test.html"))?// 第七步:調用模板對象的process方法輸出文件。template.process(dataModel, out)?// 第八步:關閉流。out.close()?}
}

3、編寫ftl模版文件


最簡單模版文件就長這樣

<h1>
${hello}
</h1>

執行完成后,就會將模版中的${hello}部分替換成 圖靈學院電商VIP
一個ftl模版文件,是由少數幾個動態標簽加上其他靜態的內容組成。動態標簽包含以下幾種:

  • 普通參數
    例如${hello}

  • list標簽

    <#list studentList as student>
    student.id/{student.id}/student.id/{studnet.name}
    </#list>

  • if條件標簽

    <#if student_index % 2 == 0>
    <#else>
    </#if>

在if標簽中,還可以進行簡單的null值判斷

<#if a??>
a不為空時。。
<#else>
a為空時###
</#if>
  • 日期標簽

    當前日期:?date?date當前時間:{date?date} 當前時間:date?date當前時間:{date?time}
    當前日期和時間:date?datetime自定義日期格式:{date?datetime} 自定義日期格式:date?datetime自定義日期格式:{date?string("yyyyMM/dd HH:mm: ss")}

  • 包含標簽

    <#include "hello.ftl"/>

接下來如果你發揮一些想象,freemarker既然可以生成html文件,那是不是可以用來生成java源文件呢?顯然是可以的。

?能夠自己生成POJO了,那是不是可以把Service、Mapper、Controller等等這些重復性的代碼一起生成呢?實際上,如果你有這種規范化的思想,你甚至可以將前臺頁面都一并生成了。減少大部分的復制粘貼的重復工作。

最后,有了這個示例后,再來理解MyBatis-plus的逆向工程就非常容易了。 引入對應的依賴.

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.0.5</version>
</dependency>

?之后進入引入的jar包中,就能看到,MyBatis-plus的逆向工程也是使用freemarker和velocity提供的模版完成的逆向工程。

vm是velocity框架的模版文件。velocity是和freemarker功能類似的一個模版引擎。
后續在設計秒殺場景時,也會使用freemarker自動生成前端商品單品頁,實現動態頁面靜態化。

然后,發揮一下你自己的想象力,你還可以給這樣簡單的CRUD項目還能添加哪些與眾不同的,實用的設計?比如,MyBatis-plus使用模板引擎生成了后端代碼, 那么,對于一些長得差不多的數據管理頁面,我們能不能也使用模板引擎,把前臺頁面到后端管理的全棧功能都一起開發出來呢?

三、結合CBoard報表工具實現拖拽式報表開發

當我們將前后端整合到一起之后,就可以繼續發揮想象力,給普通的CRUD工作帶來一些不一樣的樂趣。
CBoard是一款開源的拖拽式報表開發工具,前端使用的是和我們項目一樣的VUE技術。那么,可不可以做這樣的設想,把CBoard中最后展現報表的前端頁面挪用到我們的前端項目中,然后將后端請求通過Dubbo開放出來,這樣我們就可以用很小的代碼集成一套拖拽式的報表開發工具了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93381.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無代碼測試平臺ATECLOUD全場景測試方案

ATECLOUD 智能云測試平臺是有納米軟件開發的一款以無代碼架構與彈性擴展體系為核心的自動化測試平臺&#xff0c;通過數據模型驅動的創新設計&#xff0c;為研發、產線等多場景提供高效可控的測試解決方案。?無代碼架構 ATECLOUD 打破傳統技術壁壘&#xff0c;構建完全可視化的…

當 AI 重構審計流程,CISA 認證為何成為破局關鍵

在南京審計大學最新發布的《面向審計行業 DeepSeek 大模型操作指南》中&#xff0c;一組數據引發行業深思&#xff1a;通過自動化數據處理、智能風險識別和定制化報告生成&#xff0c;AI 大模型能幫助審計人員降低 40% 以上的人工成本&#xff0c;同時將風險識別準確率提升至 9…

NAT技術、代理服務器

NAT/NAPT技術NAT的全稱是network address translation&#xff0c;網絡地址轉換。NAT 能在對外通信時夠將源 IP 轉為新源 IP&#xff0c;對內通信時將目的ip轉換成新目的ip&#xff0c;實現這個操作&#xff0c;靠的是地址轉換表但NAT的說法其實是不準確的&#xff0c;因為多個…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-45,(知識點:負反饋的作用,基礎理解,干擾和噪聲的抑制)

目錄 1、題目 2、解答 步驟一&#xff1a;明確負反饋的作用原理 步驟二&#xff1a;逐一分析選項 3、相關知識點 一、負反饋的基本原理 二、負反饋對干擾和噪聲的抑制機制 三、選項分析與答案 四、擴展思考&#xff1a;如何抑制不同位置的干擾&#xff1f; 總結 題目…

Flutter藍牙BLE開發完全指南(內含高級功能擴展)

Flutter藍牙BLE開發完全指南 我將為您提供一個完整的Flutter藍牙BLE實現方案,包含UI設計、權限處理、設備掃描、連接通信等完整功能。 完整實現方案 1. 添加依賴與權限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 標簽加載并渲染視頻

在部分瀏覽器環境或業務場景下&#xff0c;直接使用 <video> 標簽加載視頻會出現首幀延遲的情況。以下方法通過 WebGPU Canvas 2D 將視頻幀繪制到自定義 Canvas 上&#xff0c;讓 <video> 只做解碼&#xff0c;WebGPU 接管渲染&#xff0c;通過最小化對象創建 精…

基于Flask的智能停車場管理系統開發實踐

在現代城市中&#xff0c;停車難已成為一個普遍問題。為了解決這一問題&#xff0c;我開發了一個基于Python Flask框架的智能停車場管理系統。該系統集成了車牌識別、車位狀態監控、收費管理等多項功能&#xff0c;為停車場的智能化管理提供了完整的解決方案。系統功能概述該停…

【C#獲取高精度時間】

在C#中&#xff0c;有幾種方法可以獲取高精度時間&#xff08;高分辨率時間戳&#xff09;&#xff0c;適用于性能測量、計時等需要高精度的場景。以下是幾種常用方法&#xff1a; 1. 使用 Stopwatch 類&#xff08;推薦&#xff09; Stopwatch 類提供了最高精度的時間測量&…

Spring Boot + React 打造現代化高校成績管理系統實戰記錄

作者: 笙囧同學 發布時間: 2025年7月 技術棧: Spring Boot 3.2.3 React 18 TypeScript 華為云GaussDB 項目類型: 全棧Web應用 開發周期: 30天 代碼量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同學&#xff01;&#x1f64b;?♂? 作為一名計算機科學與技…

形參表不匹配(BUG)

在您的代碼中&#xff0c;存在兩個主要問題導致"形參表中不匹配"的錯誤&#xff1a;erase() 函數中的成員變量名錯誤iterator erase(iterator pos) {// ...size--; // ? 錯誤&#xff1a;成員變量名為 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循環依賴以及三個級別緩存

Spring循環依賴以及三個級別緩存 什么是循環依賴&#xff1f; 循環依賴&#xff0c;顧名思義&#xff0c;就是指兩個或多個 Spring Bean 之間相互依賴&#xff0c;形成一個閉環。 最常見也是 Spring 能夠“解決”的循環依賴是構造器注入 和 setter 注入 混合或單獨使用時&…

《零基礎入門AI:OpenCV圖像預處理進一步學習》

本文全面講解OpenCV圖像預處理的七大核心技術&#xff08;插值方法、邊緣填充、圖像矯正&#xff08;透視變換&#xff09;、圖像掩膜、ROI切割、圖像添加水印、圖像噪點消除&#xff09;&#xff0c;每個知識點都配有詳細解釋和實用代碼示例&#xff0c;幫助初學者建立系統的圖…

MongoDB的內存和核心數對于運行效率的影響

在 MongoDB 線上生產環境中&#xff0c;CPU&#xff08;核心&#xff09; 和 內存 是兩大關鍵硬件資源&#xff0c;它們在不同的操作場景下發揮著核心作用&#xff0c;共同影響著數據庫的性能、穩定性和擴展性。理解它們的作用場景至關重要&#xff0c;是容量規劃、性能優化和故…

自己的SAPGUI嘗試

為滿足用戶需求&#xff0c;博主做了一個臺賬管理程序&#xff0c;嘗試用自己的程序做GUI&#xff0c;用SAP 系統做數據庫。 運行了半年&#xff0c;程序很nice,用戶每天都在高效的使用&#xff0c;已經有十幾萬的數據。 總結一下這次自己的GUI嘗試&#xff0c;好處是C# WINFOR…

高效處理 JSON 數據:JsonUtil 工具類全方位解析與實戰

在現代軟件開發中,JSON(JavaScript Object Notation)已成為數據交換的“通用語言”——從前后端接口通信到微服務數據交互,從配置文件解析到日志格式化,幾乎所有場景都離不開JSON的處理。然而,原生JSON框架(如FastJSON、Jackson)的API往往需要大量重復代碼,且空指針、…

Python 庫手冊:xmlrpc.client 與 xmlrpc.server 模塊

xmlrpc.client 和 xmlrpc.server 是 Python 標準庫中用于構建基于 XML-RPC 協議的遠程過程調用&#xff08;RPC&#xff09;通信模塊。xmlrpc.client 用于編寫客戶端程序&#xff0c;向遠程服務器發起方法調用。xmlrpc.server 用于編寫服務器端&#xff0c;暴露本地方法供遠程客…

渲染篇(一):從零實現一個“微型React”:Virtual DOM的真面目

渲染篇(一)&#xff1a;從零實現一個“微型React”&#xff1a;Virtual DOM的真面目 引子&#xff1a;前端性能的“永恒之問” 在前面兩章中&#xff0c;我們已經奠定了堅實的架構基礎。我們用“任務調度器”建立了聲明式和模塊化的編程范式&#xff0c;并通過對比MVC等模式論…

SWC 深入全面講解

一、核心功能與原理 1. 高性能編譯 Rust 架構優勢&#xff1a;SWC 基于 Rust 編寫&#xff0c;利用 Rust 的性能和并發性優勢&#xff0c;編譯速度比 Babel 快約 20 倍&#xff0c;比 TypeScript 編譯器更快。并行編譯&#xff1a;支持多線程并行處理&#xff0c;在四核基準測試…

XML Expat Parser:深入解析與高效應用

XML Expat Parser:深入解析與高效應用 引言 XML(可擴展標記語言)作為一種廣泛使用的標記語言,在數據交換、存儲和表示中扮演著重要角色。XML Expat Parser 是一個高性能、可擴展的XML解析庫,廣泛應用于各種編程語言中。本文將深入探討XML Expat Parser 的原理、特性以及…

【Python】自動化GIT提交

在日常開發中&#xff0c;我們經常需要頻繁地向 Git 倉庫提交代碼。雖然 git add、git commit、git push 這幾個命令并不復雜&#xff0c;但重復操作容易出錯&#xff0c;也浪費時間。本文將介紹如何使用 Python 腳本自動化完成 Git 提交流程&#xff0c;讓開發更高效&#xff…