mybatis-plus生成mapper擴(kuò)展文件的方法
閱讀提示
具有mybatis基礎(chǔ),熟練使用mybatis-plus。
概述
我們都知道,mybatis-plus是一個(gè)mybatis的增強(qiáng)工具,為簡(jiǎn)化開發(fā)、提高效率而生,我們經(jīng)常使用mybatis-plus生成controller、service、mapper等文件,對(duì)于簡(jiǎn)單的curd,可以直接使用mybatis-plus封裝好的方法。
然而,我們經(jīng)常有這樣那樣的需求,需要額外編寫sql實(shí)現(xiàn),如果直接在mapper.xml文件中編寫,一旦數(shù)據(jù)庫表結(jié)構(gòu)改動(dòng)需要重新生成文件就悲催了,不得不花大量精力修改代碼。所以,這里介紹一種方式,自動(dòng)生成mapper擴(kuò)展文件,我們自定義編寫的程序存放在擴(kuò)展文件中,這樣在數(shù)據(jù)庫表結(jié)構(gòu)改動(dòng)時(shí),不用擔(dān)心程序會(huì)被覆蓋,也不用修改代碼。
mybatis-plus版本
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.1</version> </dependency>
mybatis-plus生成mapper擴(kuò)展文件
熟悉mybatis-plus的朋友都知道,mybatis-plus提供了一款代碼生成器,可以自動(dòng)生成代碼,我們就從這款代碼生成器入手。
代碼生成器配置完畢后,運(yùn)行時(shí)會(huì)執(zhí)行 AutoGenerator.execute() 方法,我們先看看這個(gè)東東
熟悉的GlobalConfig、DataSourceConfig等等就不介紹了,我們關(guān)注的是InjectionConfig、TemplateConfig和ConfigBuilder。這里先講述一下我們的思路:把ext文件通過配置直接生成,并保留mybatis-plus為service擴(kuò)展的批量操作,我們需要三個(gè)文件,第一個(gè)文件生成ext.java,第二個(gè)文件生成ext.xml,第三個(gè)覆蓋serviceImpl文件(保留mybatis-plus為service擴(kuò)展的批量操作)
**************************干貨來咯**************************
// 生成目錄 public static final String OUTPUT_DIR = "項(xiàng)目路徑/src/main/java"; // mapperExt目錄 public static final String MAPPER_EXT = "ext目錄"; // 模板配置,這里可以自定義模板路徑,如果路徑如下所示,則該部分可以省略 TemplateConfig tc = new TemplateConfig(); tc.setServiceImpl("templates/serviceImpl.java"); ag.setTemplate(tc); // 自定義配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { Map<String, Object> map = new HashMap<>(10); /// 這里可以在 VM 文件中用 ${cfg.MapperExt} 引用該值 map.put("MapperExt", MAPPER_EXT.replace('/', '.')); this.setMap(map); } }; // 自定義輸出配置 List<FileOutConfig> focList = new ArrayList<>(); focList.add(new FileOutConfig("templates/mapperExt.xml.vm") { @Override public String outputFile(TableInfo tableInfo) { return String.format("%s/%s/%sMapperExt%s", OUTPUT_DIR, MAPPER_EXT, tableInfo.getEntityName(), StringPool.DOT_XML); } }); focList.add(new FileOutConfig("templates/mapperExt.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return String.format("%s/%s/%sMapperExt%s", OUTPUT_DIR, MAPPER_EXT, tableInfo.getEntityName(), StringPool.DOT_JAVA); } }); cfg.setFileCreate(new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // 如果是 mapperExt、service、controller 文件,并且已存在則不創(chuàng)建 if (filePath.contains(MAPPER_EXT) || fileType == FileType.CONTROLLER || fileType == FileType.SERVICE || fileType == FileType.SERVICE_IMPL) { if (new File(filePath).exists()) { return false; } } // 判斷文件夾是否需要?jiǎng)?chuàng)建 checkDir(filePath); return true; } }); cfg.setFileOutConfigList(focList); ag.setCfg(cfg);
mapperExt.java.vm配置
package ${cfg.MapperExt}; import ${package.Mapper}.${table.mapperName}; /** * <p> * $!{table.comment} MapperExt 接口 * </p> * * @author ${author} * @since ${date} */ #if(${kotlin}) interface ${table.mapperName}Ext : ${table.mapperName} #else public interface ${table.mapperName}Ext extends ${table.mapperName} { } #end
mapperExt.xml.vm配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="${cfg.MapperExt}.${table.mapperName}Ext"> </mapper>
serviceImpl.java.vm配置
package ${package.ServiceImpl}; import ${package.Entity}.${entity}; import ${cfg.MapperExt}.${table.mapperName}Ext; import ${package.Service}.${table.serviceName}; import ${superServiceImplClassPackage}; import org.springframework.stereotype.Service; /** * <p> * $!{table.comment} 服務(wù)實(shí)現(xiàn)類 * </p> * * @author ${author} * @since ${date} */ @Service #if(${kotlin}) open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}Ext, ${entity}>(), ${table.serviceName} { } #else public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}Ext, ${entity}> implements ${table.serviceName} { } #end
新思路(2020-04-17補(bǔ)充)
我們概述中所述問題真的存在嗎?mybatis-plus如果需要擴(kuò)展文件那么他為什么不提供呢?當(dāng)然是問題不存在,根本不需要擴(kuò)展文件,如果你存在這樣的問題,你總是覆蓋文件說明你的用法有問題。
這里直接說應(yīng)該怎么使用,我們把本文所述的擴(kuò)展的.vm
文件通通刪掉,InjectionConfig
的initMap
方法清空,focList相關(guān)全部刪除,修改cfg.setFileCreate(...)
如下所示
cfg.setFileCreate(new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // 如果已存在并且不是實(shí)體類則不創(chuàng)建 if (new File(filePath).exists() && fileType != FileType.ENTITY) { return false; } // 判斷文件夾是否需要?jiǎng)?chuàng)建 checkDir(filePath); return true; } });
我們分析下:文件不存在一般是我們剛剛新建數(shù)據(jù)庫表或者新增了一個(gè)表,此時(shí)肯定是要?jiǎng)?chuàng)建文件的。文件存在的時(shí)候分兩種情況,一是文件是實(shí)體類,為了應(yīng)對(duì)將來可能的新增修改刪除字段,必須重寫,那么使用時(shí)不能對(duì)該實(shí)體做任何增刪改操作;二是文件非實(shí)體類,也就是service、map、xml等,因?yàn)榇a生成和第一次生成沒有什么區(qū)別,也就沒有重寫的必要,而且很多時(shí)候也已經(jīng)編寫了代碼。
如此,我們使用的時(shí)候只需要修改我們要生成的表就行了,即使把數(shù)據(jù)庫表全部作為要生成的表也無所謂啦!
到此這篇關(guān)于mybatis-plus生成mapper擴(kuò)展文件的方法的文章就介紹到這了,更多相關(guān)mybatis-plus生成mapper擴(kuò)展文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA設(shè)計(jì)模式零基礎(chǔ)解析之單例模式的八種方式
設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性2021-10-10spring中jdbcTemplate.batchUpdate的幾種使用情況
本文主要介紹了spring中jdbcTemplate.batchUpdate的幾種使用情況,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Spring?Security自定義登錄頁面認(rèn)證過程常用配置
這篇文章主要為大家介紹了Spring?Security自定義登錄頁面認(rèn)證過程常用配置示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Java實(shí)現(xiàn)json數(shù)據(jù)處理的常用腳本分享
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)json數(shù)據(jù)處理的常用腳本,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-03-03Android中PreferenceFragment的使用詳解
本文主要介紹了Android中PreferenceFragment的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09SpringBoot中使用MyBatis-Plus實(shí)現(xiàn)分頁接口的詳細(xì)教程
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,在SpringBoot項(xiàng)目中使用MyBatis-Plus可以大大簡(jiǎn)化分頁邏輯的編寫,本文將介紹如何在 SpringBoot項(xiàng)目中使用MyBatis-Plus實(shí)現(xiàn)分頁接口2024-03-03