閱讀提示
具有mybatis基礎,熟練使用mybatis-plus。
概述
我們都知道,mybatis-plus是一個mybatis的增強工具,為簡化開發、提高效率而生,我們經常使用mybatis-plus生成controller、service、mapper等文件,對于簡單的curd,可以直接使用mybatis-plus封裝好的方法。
然而,我們經常有這樣那樣的需求,需要額外編寫sql實現,如果直接在mapper.xml文件中編寫,一旦數據庫表結構改動需要重新生成文件就悲催了,不得不花大量精力修改代碼。所以,這里介紹一種方式,自動生成mapper擴展文件,我們自定義編寫的程序存放在擴展文件中,這樣在數據庫表結構改動時,不用擔心程序會被覆蓋,也不用修改代碼。
mybatis-plus版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< 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擴展文件
熟悉mybatis-plus的朋友都知道,mybatis-plus提供了一款代碼生成器,可以自動生成代碼,我們就從這款代碼生成器入手。
代碼生成器配置完畢后,運行時會執行 AutoGenerator.execute() 方法,我們先看看這個東東
熟悉的GlobalConfig、DataSourceConfig等等就不介紹了,我們關注的是InjectionConfig、TemplateConfig和ConfigBuilder。這里先講述一下我們的思路:把ext文件通過配置直接生成,并保留mybatis-plus為service擴展的批量操作,我們需要三個文件,第一個文件生成ext.java,第二個文件生成ext.xml,第三個覆蓋serviceImpl文件(保留mybatis-plus為service擴展的批量操作)
**************************干貨來咯**************************
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
// 生成目錄 public static final String OUTPUT_DIR = "項目路徑/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 文件,并且已存在則不創建 if (filePath.contains(MAPPER_EXT) || fileType == FileType.CONTROLLER || fileType == FileType.SERVICE || fileType == FileType.SERVICE_IMPL) { if ( new File(filePath).exists()) { return false ; } } // 判斷文件夾是否需要創建 checkDir(filePath); return true ; } }); cfg.setFileOutConfigList(focList); ag.setCfg(cfg); |
mapperExt.java.vm配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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配置
1
2
3
4
5
|
<? 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配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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} 服務實現類 * </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補充)
我們概述中所述問題真的存在嗎?mybatis-plus如果需要擴展文件那么他為什么不提供呢?當然是問題不存在,根本不需要擴展文件,如果你存在這樣的問題,你總是覆蓋文件說明你的用法有問題。
這里直接說應該怎么使用,我們把本文所述的擴展的.vm
文件通通刪掉,InjectionConfig
的initMap
方法清空,focList相關全部刪除,修改cfg.setFileCreate(...)
如下所示
1
2
3
4
5
6
7
8
9
10
11
12
|
cfg.setFileCreate( new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // 如果已存在并且不是實體類則不創建 if ( new File(filePath).exists() && fileType != FileType.ENTITY) { return false ; } // 判斷文件夾是否需要創建 checkDir(filePath); return true ; } }); |
我們分析下:文件不存在一般是我們剛剛新建數據庫表或者新增了一個表,此時肯定是要創建文件的。文件存在的時候分兩種情況,一是文件是實體類,為了應對將來可能的新增修改刪除字段,必須重寫,那么使用時不能對該實體做任何增刪改操作;二是文件非實體類,也就是service、map、xml等,因為代碼生成和第一次生成沒有什么區別,也就沒有重寫的必要,而且很多時候也已經編寫了代碼。
如此,我們使用的時候只需要修改我們要生成的表就行了,即使把數據庫表全部作為要生成的表也無所謂啦!
到此這篇關于mybatis-plus生成mapper擴展文件的方法的文章就介紹到這了,更多相關mybatis-plus生成mapper擴展文件內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/sinat_30735061/article/details/105444871