1. 程式人生 > >JavaWeb專案從零開始(3)--- 整合Mybatis-Plus,簡化開發,增強工作效率

JavaWeb專案從零開始(3)--- 整合Mybatis-Plus,簡化開發,增強工作效率

mybatis每次查詢都要寫sql是不是很煩?每次都要貼上複製一個Controller、Service、Dao、mapper.xml是不是不想每次都重複這樣的工作? Mybatis-Plus 可以幫你解決上述的煩惱。

(一)簡介

Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。

(二)特性

  • 無侵入:Mybatis-Plus 在 Mybatis 的基礎上進行擴充套件,只做增強不做改變,引入 Mybatis-Plus 不會對您現有的
    Mybatis 構架產生任何影響,而且 MP 支援所有 Mybatis 原生的特性

  • 依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring

  • 損耗小:啟動即會自動注入基本CURD,效能基本無損耗,直接面向物件操作
  • 預防Sql注入:內建Sql注入剝離器,有效預防Sql注入攻擊
  • 通用CRUD操作:內建通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
  • 多種主鍵策略:支援多達4種主鍵策略(內含分散式唯一ID生成器),可自由配置,完美解決主鍵問題
  • 支援熱載入:Mapper 對應的 XML 支援熱載入,對於簡單的 CRUD 操作,甚至可以無 XML 啟動
  • 支援ActiveRecord:支援 ActiveRecord 形式呼叫,實體類只需繼承 Model 類即可實現基本 CRUD 操作
  • 支援程式碼生成:採用程式碼或者 Maven 外掛可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼,支援模板引擎,更有超多自定義配置等您來使用(P.S. 比 Mybatis 官方的 Generator 更加強大!)
  • 支援自定義全域性通用操作:支援全域性通用方法注入( Write once, use anywhere )
    支援關鍵詞自動轉義:支援資料庫關鍵詞(order、key……)自動轉義,還可自定義關鍵詞
  • 內建分頁外掛:基於Mybatis物理分頁,開發者無需關心具體操作,配置好外掛之後,寫分頁等同於普通List查詢
  • 內建效能分析外掛:可輸出Sql語句以及其執行時間,建議開發測試時啟用該功能,能有效解決慢查詢
  • 內建全域性攔截外掛:提供全表 delete 、 update 操作智慧分析阻斷,預防誤操作

(三)快速整合

pom.xml

加入相關依賴、把之前引入的mybatis相關包註釋掉或刪掉

特別說明:Mybatis及Mybatis-Spring依賴請勿加入專案配置,以免引起版本衝突!!!Mybatis-Plus會自動幫你維護!

        <!-- MyBatis -->
        <!--<dependency>-->
            <!--<groupId>org.mybatis</groupId>-->
            <!--<artifactId>mybatis</artifactId>-->
            <!--<version>3.4.4</version>-->
        <!--</dependency>-->

        <!--<dependency>-->
            <!--<groupId>org.mybatis</groupId>-->
            <!--<artifactId>mybatis-spring</artifactId>-->
            <!--<version>1.3.1</version>-->
        <!--</dependency>-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.0.8</version>
        </dependency>

        <!-- 模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

spring-context.xml

把之前mybatis配置的 sqlSessionFactory 換成下面的。

    <!-- 配置MyBatis plus -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <!-- 配置資料來源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 自動掃描 Xml 檔案位置 -->
        <property name="mapperLocations" value="classpath:mapper/*/*.xml"/>
        <!-- 配置 Mybatis 配置檔案(可無) -->
        <property name="configLocation" value="classpath:config/mybatis-config.xml"/>
        <!-- 配置包別名 -->
        <property name="typeAliasesPackage" value="com.baomidou.springmvc.model"/>

        <!-- 以上配置和傳統 Mybatis 一致 -->

        <!-- 外掛配置 -->
        <property name="plugins">
            <array>
                <!-- 分頁外掛配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                    <!-- 指定資料庫方言 -->
                    <property name="dialectType" value="mysql"/>
                </bean>
                <!-- 如需要開啟其他外掛,可配置於此 -->
            </array>
        </property>

        <!-- MP 全域性配置注入 -->
        <property name="globalConfig" ref="globalConfig"/>
    </bean>

    <!-- 定義 MP 全域性策略 -->
    <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <!-- 主鍵策略配置 -->
        <!-- 可選引數
            AUTO->`0`("資料庫ID自增")
            INPUT->`1`(使用者輸入ID")
            ID_WORKER->`2`("全域性唯一ID")
            UUID->`3`("全域性唯一ID")
        -->
        <property name="idType" value="2"/>

        <!-- 資料庫型別配置 -->
        <!-- 可選引數(預設mysql)
            MYSQL->`mysql`
            ORACLE->`oracle`
            DB2->`db2`
            H2->`h2`
            HSQL->`hsql`
            SQLITE->`sqlite`
            POSTGRE->`postgresql`
            SQLSERVER2005->`sqlserver2005`
            SQLSERVER->`sqlserver`
        -->
        <property name="dbType" value="mysql"/>

        <!-- 全域性表為下劃線命名設定 true -->
        <property name="dbColumnUnderline" value="true"/>
    </bean>

    <!-- XML檔案熱載入 -->
    <bean class="com.baomidou.mybatisplus.spring.MybatisMapperRefresh">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <constructor-arg name="mapperLocations" value="classpath:mapper/*/*.xml"/>
        <constructor-arg name="enabled" value="true"/>
    </bean>

OK整合完畢,簡單吧

(四)程式碼生成器

在專案中新建一個類檔案,run一下就行了,具體配置看註釋

import java.util.HashMap;
import java.util.Map;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * <p>
 * 程式碼生成器演示
 * </p>
 */
public class MpGenerator {

    /**
     * <p>
     * MySQL 生成演示
     * </p>
     */
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();

        // 全域性配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("D://");
        gc.setFileOverride(true);
        gc.setActiveRecord(true);
        gc.setEnableCache(false);// XML 二級快取
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(false);// XML columList
        gc.setAuthor("Yanghu");

        // 自定義檔案命名,注意 %s 會自動填充表實體屬性!
        // gc.setMapperName("%sDao");
        // gc.setXmlName("%sDao");
        // gc.setServiceName("MP%sService");
        // gc.setServiceImplName("%sServiceDiy");
        // gc.setControllerName("%sAction");
        mpg.setGlobalConfig(gc);

        // 資料來源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setTypeConvert(new MySqlTypeConvert(){
            // 自定義資料庫表字段型別轉換【可選】
            @Override
            public DbColumnType processTypeConvert(String fieldType) {
                System.out.println("轉換型別:" + fieldType);
                return super.processTypeConvert(fieldType);
            }
        });
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("521");
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mybatis-plus?characterEncoding=utf8");
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
    // strategy.setCapitalMode(true);// 全域性大寫命名 ORACLE 注意
        strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此處可以修改為您的表字首
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        // strategy.setInclude(new String[] { "user" }); // 需要生成的表
        // strategy.setExclude(new String[]{"test"}); // 排除生成的表
        // 自定義實體父類
        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
        // 自定義實體,公共欄位
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
        // 自定義 mapper 父類
        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
        // 自定義 service 父類
        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
        // 自定義 service 實現類父類
        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
        // 自定義 controller 父類
        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
        // 【實體】是否生成欄位常量(預設 false)
        // public static final String ID = "test_id";
        // strategy.setEntityColumnConstant(true);
        // 【實體】是否為構建者模型(預設 false)
        // public User setName(String name) {this.name = name; return this;}
        // strategy.setEntityBuliderModel(true);
        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.baomidou");
        pc.setModuleName("test");
        mpg.setPackageInfo(pc);

        // 注入自定義配置,可以在 VM 中使用 cfg.abc 【可無】
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };

        // 自定義 xxList.jsp 生成
        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
        focList.add(new FileOutConfig("/template/list.jsp.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義輸入檔名稱
                return "D://my_" + tableInfo.getEntityName() + ".jsp";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

    // 調整 xml 生成目錄演示
         focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 關閉預設 xml 生成,調整生成 至 根目錄
        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);

        // 自定義模板配置,可以 copy 原始碼 mybatis-plus/src/main/resources/template 下面內容修改,
        // 放置自己專案的 src/main/resources/template 目錄下, 預設名稱一下可以不配置,也可以自定義模板名稱
        // TemplateConfig tc = new TemplateConfig();
        // tc.setController("...");
        // tc.setEntity("...");
        // tc.setMapper("...");
        // tc.setXml("...");
        // tc.setService("...");
        // tc.setServiceImpl("...");
    // 如上任何一個模組如果設定 空 OR Null 將不生成該模組。
        // mpg.setTemplate(tc);

        // 執行生成
        mpg.execute();

        // 列印注入設定【可無】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }

}