Mybatis-plus自定義模板生成

所有文章已遷移至csdn,csdn個人主頁https://blog.csdn.net/chaitoudaren
下方代碼引用自mybatis-plus的代碼生成模塊跋理,點(diǎn)擊運(yùn)行即可生成代碼择克。本篇第一部分將介紹代碼生成的使用,第二部分介紹如何自定義自己的模板前普。

一肚邢、代碼模板使用

生成后的效果如下:


代碼生成.png

1.引入maven,共提供3類模板拭卿,本次只以freemarker 為例

        <!-- freemarker 模板引擎 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

2.引入代碼生成模塊

全局配置:主要是配置文件命名方式
數(shù)據(jù)源配置:數(shù)據(jù)庫的相關(guān)信息骡湖,用戶密碼連接驅(qū)動等
包配置:包名
模板引擎:本次使用freemarker,無需修改
自定義模板:下方詳解

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * mybatis代碼生成器
 */
// 演示例子峻厚,執(zhí)行 main 方法控制臺輸入模塊表名回車自動生成對應(yīng)項(xiàng)目目錄中
public class CodeGenerator {

    /**
     * <p>
     * 讀取控制臺內(nèi)容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("請輸入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("請輸入正確的" + tip + "响蕴!");
    }

    public static void main(String[] args) {
        // 代碼生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setServiceName("%sService");//service 命名方式
        gc.setServiceImplName("%sServiceImpl");//service impl 命名方式
        // 自定義文件命名,注意 %s 會自動填充表實(shí)體屬性惠桃!
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setAuthor("cmx");
        gc.setOpen(false);
        // gc.setSwagger2(true); 實(shí)體屬性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        // 數(shù)據(jù)源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:oracle:thin:@xxx:xxx");
        // dsc.setSchemaName("public");
        dsc.setDriverName("oracle.jdbc.OracleDriver");
        dsc.setUsername("xxx");dsc.setPassword("xxx");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模塊名"));
        pc.setParent("com.cmx.tcn");
        mpg.setPackageInfo(pc);

        // 自定義配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 自定義輸出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定義配置會被優(yōu)先輸出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義輸出文件名 浦夷, 如果你 Entity 設(shè)置了前后綴、此處注意 xml 的名稱會跟著發(fā)生變化9纪酢劈狐!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        /*
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判斷自定義文件夾是否需要創(chuàng)建
                checkDir("調(diào)用默認(rèn)方法創(chuàng)建的目錄");
                return false;
            }
        });
        */
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定義輸出模板
        //指定自定義模板路徑,注意不要帶上.ftl/.vm, 會根據(jù)使用的模板引擎自動識別
        // templateConfig.setEntity("templates/entity2.java");
        // templateConfig.setService();
        // templateConfig.setController();

        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
//        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
        strategy.setInclude(scanner("表名呐馆,多個英文逗號分割").split(","));
//        strategy.setSuperEntityColumns("id");
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }

}

直接運(yùn)行即可生成對應(yīng)表的相關(guān)代碼

二肥缔、自定義模板

生成的PO模板如下,由于作者使用的是oracle汹来,主鍵策略為序列辫继,故需要修改原本模板,使其在類上方自動生成@KeySequence("SEQ_ST_USER")

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ST_USER")
// 缺少@KeySequence("SEQ_ST_USER")的主鍵策略
public class StUser implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主鍵
     */
    @TableId("PKID")
    private Long pkid;

1.獲取原模板俗慈,在原模板基礎(chǔ)上進(jìn)行修改


查找模板文件.gif

2.本次要修改PO姑宽,故拷貝一份entity.java.ftl文件至/main/resources/templates文件下方,重命名為entity2.java.ftl(ftl文件為freemarker模板)闺阱,并在類上方加入相關(guān)代碼


image.png

3.在模板模塊炮车,也就是CodeGenerator中,打開自定義模板,并設(shè)置讀取的路徑
image.png

4.點(diǎn)擊運(yùn)行即可生成自定義模板

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘦穆,一起剝皮案震驚了整個濱河市纪隙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扛或,老刑警劉巖绵咱,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熙兔,居然都是意外死亡悲伶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門住涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麸锉,“玉大人,你說我怎么就攤上這事舆声』ǔ粒” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵媳握,是天一觀的道長碱屁。 經(jīng)常有香客問我,道長蛾找,這世上最難降的妖魔是什么娩脾? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮腋粥,結(jié)果婚禮上晦雨,老公的妹妹穿的比我還像新娘。我一直安慰自己隘冲,他們只是感情好闹瞧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著展辞,像睡著了一般奥邮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罗珍,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天洽腺,我揣著相機(jī)與錄音,去河邊找鬼覆旱。 笑死蘸朋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扣唱。 我是一名探鬼主播藕坯,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼团南,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炼彪?” 一聲冷哼從身側(cè)響起吐根,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辐马,沒想到半個月后拷橘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喜爷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年冗疮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞奋。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赌厅,死狀恐怖穷绵,靈堂內(nèi)的尸體忽然破棺而出轿塔,到底是詐尸還是另有隱情,我是刑警寧澤仲墨,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布勾缭,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敌卓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一仆百、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幔虏,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伐蒂。三九已至煞躬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逸邦,已是汗流浹背恩沛。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缕减,地道東北人雷客。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像桥狡,于是被迫代替她去往敵國和親搅裙。 傳聞我的和親對象是個殘疾皇子妓局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容