【Spring Boot架構(gòu)】集成Mybatis-Plus的實(shí)例詳解

一、簡介

MyBatis-Plus(簡稱 MP)是一個(gè) MyBatis 的增強(qiáng)工具躲叼,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變芦缰,為簡化開發(fā)、提高效率而生枫慷。

特性

  • 無侵入:只做增強(qiáng)不做改變让蕾,引入它不會(huì)對現(xiàn)有工程產(chǎn)生影響,如絲般順滑或听;
  • 損耗刑叫ⅰ:啟動(dòng)即會(huì)自動(dòng)注入基本 CURD,性能基本無損耗誉裆,直接面向?qū)ο蟛僮鳎?/li>
  • 強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper顿颅、通用 Service,僅僅通過少量配置即可實(shí)現(xiàn)單表大部分 CRUD 操作找御,更有強(qiáng)大的條件構(gòu)造器元镀,滿足各類使用需求;
  • 支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式霎桅,方便的編寫各類查詢條件栖疑,無需再擔(dān)心字段寫錯(cuò);
  • 支持主鍵自動(dòng)生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence)滔驶,可自由配置遇革,完美解決主鍵問題;
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用揭糕,實(shí)體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作萝快;
  • 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere );
  • 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 著角、 Model 揪漩、 Service 、 Controller 層代碼吏口,支持模板引擎奄容,更有超多自定義配置等您來使用冰更;
  • 內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作昂勒,配置好插件之后蜀细,寫分頁等同于普通 List 查詢;
  • 分頁插件支持多種數(shù)據(jù)庫:支持 MySQL戈盈、MariaDB奠衔、Oracle、DB2塘娶、H2归斤、HSQL、SQLite刁岸、Postgre官册、SQLServer 等多種數(shù)據(jù)庫;
  • 內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時(shí)間难捌,建議開發(fā)測試時(shí)啟用該功能膝宁,能快速揪出慢查詢;
  • 內(nèi)置全局?jǐn)r截插件:提供全表 delete 根吁、 update 操作智能分析阻斷员淫,也可自定義攔截規(guī)則,預(yù)防誤操作击敌。

二介返、如何使用

1、項(xiàng)目pom.xml引入依賴

<!--mybatis-plus依賴-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency> 復(fù)制代碼

2沃斤、User類

@Data
public class User {
    private Long id;
    private String name;
    private Date CreateDate;
} 復(fù)制代碼

3圣蝎、UserMapper類

public interface UserMapper extends BaseMapper<User> {
} 復(fù)制代碼

4、application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?characterEncoding=utf8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver 復(fù)制代碼

5衡瓶、app啟動(dòng)類徘公,增加配置MapperScan自動(dòng)掃描。

@SpringBootApplication
@MapperScan("com.example.mybatisplus.mapper")
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }

} 復(fù)制代碼

6哮针、寫單元測試類关面,進(jìn)行測試。

@RunWith(SpringRunner.class)
@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        //數(shù)據(jù)庫目前兩條數(shù)據(jù)十厢,這塊驗(yàn)證一下等太,如果數(shù)量一致則通過,就輸出數(shù)據(jù)信息
        Assert.assertEquals(2, userList.size());
        userList.forEach(System.out::println);
    }
} 復(fù)制代碼
image.png

image.png

三蛮放、代碼生成器的使用

1缩抡、項(xiàng)目pom.xml增加依賴

<!--代碼生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.2.0</version>
</dependency>

<!--模板引擎-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency> 
復(fù)制代碼

2、生成代碼的工具類

package com.example.mybatisplus.service;

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;

// 演示例子包颁,執(zhí)行 main 方法控制臺(tái)輸入模塊表名回車自動(dòng)生成對應(yīng)項(xiàng)目目錄中
public class CodeGenerator {
    /**
     * <p>
     * 讀取控制臺(tái)內(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.setAuthor("jobob");
        gc.setOpen(false);
        // gc.setSwagger2(true); 實(shí)體屬性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        // 數(shù)據(jù)源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/testdb?useUnicode=true&useSSL=false&characterEncoding=utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模塊名"));
        pc.setParent("com.example.mybatisplus.mybatis");
        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<>();
        // 自定義配置會(huì)被優(yōu)先輸出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義輸出文件名 挎塌, 如果你 Entity 設(shè)置了前后綴、此處注意 xml 的名稱會(huì)跟著發(fā)生變化D诒摺!
                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) {
                // 判斷自定義文件夾是否需要?jiǎng)?chuàng)建
                checkDir("調(diào)用默認(rèn)方法創(chuàng)建的目錄");
                return false;
            }
        });
        */
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

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

        // 配置自定義輸出模板
        //指定自定義模板路徑待锈,注意不要帶上.ftl/.vm, 會(huì)根據(jù)使用的模板引擎自動(dòng)識(shí)別
        // 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.setSuperEntityColumns("id");
        strategy.setInclude(scanner("表名漠其,多個(gè)英文逗號(hào)分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
} 復(fù)制代碼

3、運(yùn)行工具類竿音,如下:

image.png

image.png

你學(xué)會(huì)了嗎和屎?是不是Mybatis-Plus的配置很簡單,它還有一些強(qiáng)大的功能春瞬,建議可以去官網(wǎng)看詳細(xì)文檔學(xué)習(xí)一下柴信,更多精彩技術(shù)文章可以關(guān)注微信公眾號(hào):java程序員聚集地

作者:Java程序員聚集地
鏈接:https://juejin.im/post/5de9feb2e51d4558242703be
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)宽气,非商業(yè)轉(zhuǎn)載請注明出處随常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萄涯,隨后出現(xiàn)的幾起案子绪氛,更是在濱河造成了極大的恐慌,老刑警劉巖涝影,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枣察,死亡現(xiàn)場離奇詭異,居然都是意外死亡燃逻,警方通過查閱死者的電腦和手機(jī)序目,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伯襟,“玉大人猿涨,你說我怎么就攤上這事∧饭郑” “怎么了嘿辟?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長片效。 經(jīng)常有香客問我红伦,道長,這世上最難降的妖魔是什么淀衣? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任昙读,我火速辦了婚禮,結(jié)果婚禮上膨桥,老公的妹妹穿的比我還像新娘蛮浑。我一直安慰自己唠叛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布沮稚。 她就那樣靜靜地躺著艺沼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蕴掏。 梳的紋絲不亂的頭發(fā)上障般,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音盛杰,去河邊找鬼挽荡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛即供,可吹牛的內(nèi)容都是我干的定拟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼逗嫡,長吁一口氣:“原來是場噩夢啊……” “哼青自!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驱证,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤性穿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后雷滚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體需曾,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年祈远,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呆万。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡车份,死狀恐怖谋减,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扫沼,我是刑警寧澤出爹,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站缎除,受9級特大地震影響严就,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜器罐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一梢为、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦铸董、人聲如沸祟印。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕴忆。三九已至,卻和暖如春悲幅,著一層夾襖步出監(jiān)牢的瞬間套鹅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工夺艰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沉衣。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓郁副,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豌习。 傳聞我的和親對象是個(gè)殘疾皇子存谎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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