最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis-plus生成mapper擴(kuò)展文件的方法

 更新時(shí)間:2020年09月01日 14:34:31   作者:sinat_30735061  
這篇文章主要介紹了mybatis-plus生成mapper擴(kuò)展文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

閱讀提示

  具有mybatis基礎(chǔ),熟練使用mybatis-plus。

概述

  我們都知道,mybatis-plus是一個mybatis的增強(qiáng)工具,為簡化開發(fā)、提高效率而生,我們經(jīng)常使用mybatis-plus生成controller、service、mapper等文件,對于簡單的curd,可以直接使用mybatis-plus封裝好的方法。

  然而,我們經(jīng)常有這樣那樣的需求,需要額外編寫sql實(shí)現(xiàn),如果直接在mapper.xml文件中編寫,一旦數(shù)據(jù)庫表結(jié)構(gòu)改動需要重新生成文件就悲催了,不得不花大量精力修改代碼。所以,這里介紹一種方式,自動生成mapper擴(kuò)展文件,我們自定義編寫的程序存放在擴(kuò)展文件中,這樣在數(shù)據(jù)庫表結(jié)構(gòu)改動時(shí),不用擔(dān)心程序會被覆蓋,也不用修改代碼。

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提供了一款代碼生成器,可以自動生成代碼,我們就從這款代碼生成器入手。

  代碼生成器配置完畢后,運(yùn)行時(shí)會執(zhí)行 AutoGenerator.execute() 方法,我們先看看這個東東


熟悉的GlobalConfig、DataSourceConfig等等就不介紹了,我們關(guān)注的是InjectionConfig、TemplateConfig和ConfigBuilder。這里先講述一下我們的思路:把ext文件通過配置直接生成,并保留mybatis-plus為service擴(kuò)展的批量操作,我們需要三個文件,第一個文件生成ext.java,第二個文件生成ext.xml,第三個覆蓋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;
      }
    }
    // 判斷文件夾是否需要創(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文件通通刪掉,InjectionConfiginitMap方法清空,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;
    }
    // 判斷文件夾是否需要創(chuàng)建
    checkDir(filePath);
    return true;
  }
});

  我們分析下:文件不存在一般是我們剛剛新建數(shù)據(jù)庫表或者新增了一個表,此時(shí)肯定是要創(chuàng)建文件的。文件存在的時(shí)候分兩種情況,一是文件是實(shí)體類,為了應(yīng)對將來可能的新增修改刪除字段,必須重寫,那么使用時(shí)不能對該實(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中LinkedHashSet的源碼剖析

    Java中LinkedHashSet的源碼剖析

    這篇文章主要介紹了Java中LinkedHashSet的源碼剖析,LinkedHashSet是HashSet的子類,LinkedHashSet底層是一個LinkedHashMap,底層維護(hù)了一個數(shù)組+雙向鏈表,需要的朋友可以參考下
    2023-09-09
  • Java三元表達(dá)式使用及注意事項(xiàng)詳解

    Java三元表達(dá)式使用及注意事項(xiàng)詳解

    這篇文章主要介紹了Java三元表達(dá)式使用及注意事項(xiàng)的相關(guān)資料,Java中的三元運(yùn)算符是一種簡潔的條件語句,它可以根據(jù)一個條件來選擇兩個不同的值中的一個,適用于簡單的條件賦值場景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java設(shè)計(jì)模式之java策略模式詳解

    Java設(shè)計(jì)模式之java策略模式詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之策略模式,簡單說明了策略模式的概念、原理并結(jié)合實(shí)例形式分析了java策略模式的具有用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2021-09-09
  • java對象和json的來回轉(zhuǎn)換知識點(diǎn)總結(jié)

    java對象和json的來回轉(zhuǎn)換知識點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了一篇關(guān)于java對象和json的來回轉(zhuǎn)換知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • 詳解spring cloud分布式關(guān)于熔斷器

    詳解spring cloud分布式關(guān)于熔斷器

    這篇文章主要介紹了詳解spring cloud分布式關(guān)于熔斷器,詳細(xì)的介紹了什么是熔斷器和使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 圖解Java經(jīng)典算法希爾排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法希爾排序的原理與實(shí)現(xiàn)

    希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經(jīng)過改進(jìn)之后的一個更高效的版本,也稱為縮小增量排序,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)
    2022-09-09
  • JDBC查詢Map轉(zhuǎn)對象實(shí)現(xiàn)過程詳解

    JDBC查詢Map轉(zhuǎn)對象實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了JDBC查詢Map轉(zhuǎn)對象實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java實(shí)現(xiàn)簡單石頭剪刀布游戲

    java實(shí)現(xiàn)簡單石頭剪刀布游戲

    這篇文章主要介紹了java實(shí)現(xiàn)簡單石頭剪刀布游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Windows使用多個JDK的方法詳解

    Windows使用多個JDK的方法詳解

    本文介紹了如何在Windows系統(tǒng)中同時(shí)使用多個JDK版本(JDK8和JDK21),并詳細(xì)描述了修改環(huán)境變量和Path變量的步驟,以實(shí)現(xiàn)JDK版本的切換
    2024-12-12
  • Java中的動態(tài)代理原理及實(shí)現(xiàn)

    Java中的動態(tài)代理原理及實(shí)現(xiàn)

    這篇文章主要介紹了Java中的動態(tài)代理原理及實(shí)現(xiàn),動態(tài)是相對于靜態(tài)而言,何為靜態(tài),即編碼時(shí)手動編寫代理類、委托類,而動態(tài)呢,是不編寫具體實(shí)現(xiàn)類,等到使用時(shí),動態(tài)創(chuàng)建一個來實(shí)現(xiàn)代理的目的,需要的朋友可以參考下
    2023-12-12

最新評論

蒙山县| 特克斯县| 新竹县| 仁怀市| 准格尔旗| 渑池县| 莆田市| 平武县| 漳平市| 克东县| 安国市| 中卫市| 昌江| 平山县| 恭城| 青河县| 沙田区| 德江县| 钟祥市| 嘉禾县| 清水县| 思南县| 客服| 二连浩特市| 民勤县| 中阳县| 麻城市| 洱源县| 康平县| 荔浦县| 怀集县| 佳木斯市| 通城县| 探索| 保亭| 高阳县| 莱芜市| 万源市| 承德县| 出国| 涡阳县|