mybatisX的自定義模板生成

在idea中使用mybtais的自定義模板生成,可以幫我們省去很多重復的代碼。

打開一個項目,我們要修改的主要就兩個文件,一個是生成的mapper接口,另一個是xml文件:
相應的mapper接口模板為:
?

package ${mapperInterface.packageName};import ${tableClass.fullClassName};
import com.scmpt.framework.aop.mybatis.interceptor.unique.UniqueValidation;
import java.util.List;
import org.apache.ibatis.annotations.Param;/**
* @author ${author!}
* @description 針對表【${tableClass.tableName}<#if tableClass.remark?has_content>(${tableClass.remark!})</#if>】的數據庫操作Mapper
* @createDate ${.now?string('yyyy-MM-dd HH:mm:ss')}
* @Entity ${tableClass.fullClassName}
*/
public interface ${mapperInterface.fileName} {@UniqueValidation(table = "${tableClass.tableName}")
int insert(${tableClass.shortClassName} record);${tableClass.shortClassName} getById(Long id);@UniqueValidation(table = "${tableClass.tableName}")
int updateById(${tableClass.shortClassName} record);void deleteRecycle(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);
void recoverRecycle(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);
void deleteBatch(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);List<Long> getToTranslate(@Param("ids") List<Long> ids);List<${tableClass.shortClassName}> getInfoDoByIds(@Param("ids")List<Long> longList);void insertBatch(@Param("doList") List<${tableClass.shortClassName}> managesDos);
}

我們要引用的注解也好,或者是第三方插件也好。都是提前把對應的包路徑引進來。

相應的mapper的XML文件生成模板為:
?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${mapperInterface.packageName}.${baseInfo.fileName}"><resultMap id="BaseResultMap" type="${tableClass.fullClassName}"><#list tableClass.pkFields as field><id property="${field.fieldName}" column="${field.columnName}" <#if baseInfo.needJdbcType>jdbcType="${field.jdbcType}"</#if>/></#list><#list tableClass.baseFields as field><result property="${field.fieldName}" column="${field.columnName}" <#if baseInfo.needJdbcType>jdbcType="${field.jdbcType}"</#if>/></#list></resultMap><sql id="Base_Column_List"><#list tableClass.allFields as field>${field.columnName}<#sep>,<#if field_index &gt; 0 && field_index%5==0>${"\n        "}</#if></#list></sql><select id="getById" parameterType="java.lang.Long" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from ${tableClass.tableName}where <#list tableClass.pkFields as field> ${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>} <#if field_has_next>AND</#if></#list></select><insert id="insert"<#if (tableClass.pkFields?size==1)> keyColumn="${tableClass.pkFields[0].columnName}" keyProperty="${tableClass.pkFields[0].fieldName}" parameterType="${tableClass.fullClassName}" useGeneratedKeys="true"</#if>>insert into ${tableClass.tableName}( <#list tableClass.allFields as field>${field.columnName}<#sep>,<#if field_index &gt; 0 && field_index%5==0>${"\n        "}</#if></#list>)values (<#list tableClass.allFields as field>${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>}<#sep>,<#if field_index &gt; 0 && field_index%5==0>${"\n        "}</#if></#list>)</insert><update id="updateById" parameterType="${tableClass.fullClassName}">update ${tableClass.tableName}<set><#list tableClass.baseBlobFields as field><if test="${field.fieldName} != null">${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>},</if></#list></set>where  <#list tableClass.pkFields as field> ${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>} <#if field_has_next>AND</#if></#list></update><update id="recoverRecycle">update ${tableClass.tableName}set is_recycle = 0,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><update id="deleteRecycle">update ${tableClass.tableName}set is_delete = 1,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><update id="deleteBatch">update ${tableClass.tableName}set is_recycle = 1,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><insert id="insertBatch">INSERT INTO ${tableClass.tableName} (<#list tableClass.allFields as field>${field.columnName}<#sep>,</#list>)VALUES<foreach collection="doList" item="item" separator=",">(<#list tableClass.allFields as field>${'#'}{item.${field.fieldName}}<#sep>,</#list>)</foreach></insert><select id="getInfoDoByIds" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List"/>FROM ${tableClass.tableName}WHERE <#list tableClass.pkFields as field>${field.columnName}</#list> IN<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></select><select id="getToTranslate" resultType="java.lang.Long">SELECT tt.<#list tableClass.pkFields as field>${field.columnName}</#list>FROM (<foreach collection="ids" item="id" separator=" UNION ALL ">SELECT ${'#'}{id} AS <#list tableClass.pkFields as field>${field.columnName}</#list></foreach>) ttLEFT JOIN ${tableClass.tableName} omsON tt.<#list tableClass.pkFields as field>${field.columnName}</#list> = oms.<#list tableClass.pkFields as field>${field.columnName}</#list>WHERE oms.<#list tableClass.pkFields as field>${field.columnName}</#list> IS NULL</select>
</mapper>

至此,我們就可以直接點擊模板生成來進行我們自定義的模板生成策略。

ftl文件:?使用的FreeMark模板語言

Freemarker的基本語法及使用大全_freemarker 語法_小碼哥哥哥的博客-CSDN博客

不太懂freemark和模板中變量含義的結合以上理解就可以進行模板自定義了。

要注意的是,我們修改的是default-all這個生成模板,所以,我們也要使用相應的生成策略才可以。

生成的mapper接口為:

可以看到正確輸出了我們相應的格式。

如果想要恢復默認的生成模板,我們可以直接在項目中恢復默認。

如此,就能把我們的模板恢復為靜態的模板了。相應的代碼生成時的映射關系為:

1. 實體類信息(tableClass.*

變量名說明示例
tableClass.fullClassName類的全限定名com.example.system.entity.UserDO
tableClass.shortClassName類的簡稱(不含包名)UserDO
tableClass.tableName數據庫表名sys_user
tableClass.pkFields主鍵字段集合[id]
tableClass.allFields所有字段集合[id, username, password, ...]
tableClass.baseFields排除主鍵 & BLOB 的字段集合[username, password, ...]
tableClass.baseBlobFields排除主鍵,含 BLOB?的字段集合[username, password, avatar, ...]
tableClass.remark表注釋用戶信息表

2. 字段信息(field.*

變量名說明示例
field.fieldNameJava 屬性名userName
field.columnName數據庫列名user_name
field.jdbcTypeJDBC 類型VARCHAR
field.columnLength列長度64
field.columnScale列精度(小數位)2
field.columnIsArray是否為數組false
field.shortTypeNameJava 類型短名稱String
field.fullTypeNameJava 類型全限定名java.lang.String
field.remark字段注釋用戶名
field.autoIncrement是否自增true
field.nullable是否允許 NULLfalse

3. 配置信息(baseInfo.*

變量名說明示例
baseInfo.shortClassName配置名稱UserDO
baseInfo.tableName配置文件名稱UserDO
baseInfo.pkFields配置名稱id
baseInfo.allFields后綴DO
baseInfo.baseFields包名com.example.system.entity
baseInfo.baseBlobFields模板內容...
baseInfo.remark相對模塊的資源文件路徑src/main/resources

更多的信息請查看官網:

Mybatis X 插件 | MyBatis-Plus

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

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

相關文章

miniz:一個輕量級、高性能的開源壓縮庫

目錄 1.簡介 2.核心特性 3.基本使用示例 4.與 ZLIB 的對比 5.使用場景 6.注意事項 1.簡介 miniz 是一個輕量級、高性能的開源壓縮庫&#xff0c;專注于提供 ZLIB/GZIP 兼容的壓縮和解壓縮功能。它的核心優勢在于體積小巧&#xff08;單文件實現&#xff09;、跨平臺支持和…

Jenkins接口自動化測試(構建)平臺搭建

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;自動化測試流程 在進行平臺搭建前&#xff0c;我們首先要問自己&#xff1a;我需要搭建的平臺的功能是什么&#xff0c;要實現什么目標&#xff1f; 在我的理解中&#xff0c;自動化構建平臺的執行流…

Day 22: 復習

機器學習數據處理與降維技術復習總結 前言 經過6天的學習&#xff0c;我們系統地學習了從基礎的Numpy數組操作到高級的降維算法&#xff0c;這些內容構成了機器學習數據預處理的重要知識體系。本文將對這一系列學習內容進行全面復習和總結&#xff0c;幫助大家建立完整的知識…

力扣 hot100 Day56

46. 全排列 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 //抄的 class Solution { private:vector<vector<int>>result;vector<int> path; public:void backtracking(vector<int>& nu…

Android 編碼規范全指南

在 Android 開發領域&#xff0c;代碼不僅是功能實現的載體&#xff0c;更是團隊協作與項目迭代的基礎。一套完善的編碼規范&#xff0c;能讓代碼從 “可運行” 升級為 “易維護、可擴展、低風險”。本文基于 Google、Square 等頂尖團隊的實踐經驗&#xff0c;結合國內 Android…

[RPA] Excel中的字典處理

案例1一個Excel文件總共有2個Sheet頁&#xff0c;分別為總表和對照表通過對照表sheet頁&#xff0c;設置價格對照字典對照表循環總表sheet頁&#xff0c;根據循環到的商品名稱&#xff0c;找到對應字典中的價格&#xff0c;并計算出總價總表將總價寫入到Excel表中C列&#xff0…

基于NSGAII優化算法的車間生產調度matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.參考文獻 6.完整程序 1.程序功能描述 車間生產調度是制造業的核心環節&#xff0c;其目標是在滿足設備約束、工序優先級等條件下&#xff0c;優化多個相互沖突的生產指標&#xff08;如…

Cmake、VS2019、C++、openGLopenCV環境安裝

在 CMake 和 Visual Studio 2019 環境下安裝和配置 OpenGL、OpenCV 以及 CUDA 可能會有些復雜&#xff0c;因為涉及的組件多且相互依賴。以下是一個詳細的指南&#xff0c;幫助您逐步完成安裝和配置。 1. 前提條件 在開始之前&#xff0c;請確保您已安裝以下軟件&#xff1a; …

視頻二維碼在產品設備說明書中的應用

在當今數字化的時代&#xff0c;傳統的產品設備說明書正面臨著一場變革。文字和圖片雖然能提供基本信息&#xff0c;但在復雜設備的安裝、操作和故障排除方面&#xff0c;往往顯得力不從心。而視頻二維碼的出現&#xff0c;為這一困境提供了完美的解決方案&#xff0c;它將冰冷…

【Pytest 使用教程】

pytest 使用 test_basic.py Pytest 完全實戰手冊 一、核心概念與基礎 1、在pytest框架下運行測試用例&#xff0c;最基礎的一共有三點。導入pytest的包寫一個方法&#xff0c;或者類。后面運行的時候&#xff0c;相當于運行這個方法&#xff0c;或者類里的方法&#xff0c;無需…

基于OpenOCD 的 STM32CubeIDE 開發燒錄調試環境搭建 DAPLINK/STLINK

需要部署一個開發環境,實現h7的板子通過daplink功能給目標板燒寫程序(同事要將這個過程用fpga實現),需要通過openocd+gdb+daplink stm32; 總結:單條命令執行太麻煩,參考4寫成腳本文件: 獨立腳本使用Openocd ? 在**“在Stm32CubeIDE環境下使用DAP-Link仿真”**一文中…

嵌入式硬件篇---zigbee無線串口通信問題

使用 ZigBee 進行無線串口通信時&#xff0c;接收異常&#xff08;如丟包、亂碼、完全無法接收&#xff09;是常見問題&#xff0c;其原因涉及射頻通信特性、網絡機制、硬件配置、環境干擾等多個層面。以下從具體機制出發&#xff0c;詳細分析可能的原因&#xff1a;一、射頻層…

【AI周報】2025年7月26日

【AI周報】2025年7月第四周觀察&#xff1a;GitHub Spark重塑開發范式&#xff0c;中美AI政策對壘升級 省流版靜態頁面周報&#xff0c;為方便各位看官快速食用&#xff0c;我準備了摘要版周報&#xff0c;歡迎訪問&#xff1a;20250726周報 引言&#xff1a;本周焦點速覽 2…

HTML:從 “小白” 到 “標簽俠” 的修煉手冊

目錄 一、HTML&#xff1a;網頁的 “骨架” 不是骷髏架 二、文本標簽&#xff1a;文字的 “華麗變身” 術 1. 標題標簽&#xff1a;文字界的 “領導班子” 2. 段落標簽&#xff1a;文字的 “專屬保姆” 3. 文本格式化標簽&#xff1a;給文字 “穿花衣” 三、鏈接標簽&…

python3GUI--基于YOLO的火焰與煙霧檢測系統By:PyQt5(詳細圖文介紹)

文章目錄一&#xff0e;前言1.引言2.正文二&#xff0e;核心內容1.數據集2.模型訓練3.界面窗口1.登錄注冊界面2.核心功能界面3.檢測告警提示窗口三&#xff0e;.核心界面模塊介紹1.頂部信息區域2.數據輸入3.參數配置4.告警設置5.操作臺6.關于7.指標變化8.異常速覽9.日志輸出10.…

基于Transform、ARIMA、LSTM、Prophet的藥品銷量預測分析

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、數據準備與預處理三、模型選擇與方法設計1. ARIMA 模型&#xff1a;傳統統計方法的基線構建2. LSTM 模型&#xff1a;引入記憶機制的深度學習方法3. Transformer 模型&#…

LLM隱藏層與logits數值的簡單理解

LLM的“隱藏層數值”和“logits數值” 代表什么,范圍是多少 “隱藏層數值”和“logits數值”是兩個關鍵概念——它們分別對應模型“理解信息”和“輸出決策”的核心環節。 一、先明確基礎:LLM的“思考”流程 LLM本質是“輸入文本→處理信息→輸出結果”的神經網絡。簡單說…

Vue》》@ 用法

使用 別名導入 // 導入 src/components/Button.vue import Button from /components/Button.vue// 導入 src/utils/helper.js import { helperFunc } from /utils/helper// 導入 src/store/index.js import store from /store

20250726-1-Kubernetes 網絡-Service存在的意義_筆記

一、Service控制器 1. Service存在的意義 1)基本場景 ?? 動態IP問題:Pod IP具有短暫性,銷毀重建后IP會變化(示例:原IP 169.130重建后變為169.132) 服務發現需求:需要穩定入口訪問同一服務的多個Pod,避免因Pod變動導致服務中斷 負載均衡需求:多個Pod副本需要統一訪…

在一個存在的包里面編寫msg消息文件

前言盡管最佳實踐是在專門的接口包中聲明接口&#xff0c;但有時在同一個包中完成接口的聲明、創建和使用會更為便捷。創建文件創建好msg/AddressBook.msg文件&#xff0c;在你的包的目錄下package.xml<buildtool_depend>rosidl_default_generators</buildtool_depend…